PHP/Symfony Framework 기능테스트

개요 (Summary)

  • 테스트 실행
bin/phpunit
  • 테스트 설치
composer require --dev symfony/test-pack
bin/console make:unit-test
bin/console make:functional-test
  • 테스트 케이스 작성
use PHPUnit\Framework\TestCase;

class SampleControllerTest extends WebTestCase {

    public function testSomething() {

        $client = statc::createClient();
        $crawler = $client->request('GET', '/')

        $this->assertResponseIsSuccessful();
        $this->assertSelectorTextContains('h1', 'hello World');

    }
}

예제

A. 검증 관련 메소드


// 매개변수가 TRUE인지 검증
assertTrue($client->getResponse()->headers->contains('Content-Type', 'application/json'), 'MESSAGE');

assertTrue($client->getResponse()->isSuccessful());

assertTrue($client->getResponse()->isNotFound());

// 매개변수들이 같은지 검증
assertEquals($a, $b);

// 매개변수들이 같은지 검증
assertSame(200, $client->getResponse()->getStatusCode());

// 매개변수가 있는지 검증
assertContains('Hello World', $crawler->filter('h1')->text());

assertContains('foo', $client->getResponse->getContent());

// 상대 매개변수보다 많은지 검증
assertGreaterThan(0, $crawler->filter('html:contains("Hello World")')->count());

// 카운트한 매개변수 개수 검증
assertCount(0, $crawler->filter('h1'));

B. 클릭 예제

$link = $crawler
    ->filter('a:contains("login")')

    ->link();

$crawler = $client->click($link);

$this->assertContains('Remember me', $client->getResponse()->getContent());

: 클릭 후 'Remember me'라는 텍스트가 포함되어 있는지 검증

C. 폼 작성 예제

$form = $crawler->selectButton('Sign in')->form();
$form['email'] = 'user@user.com';
$form['password'] = 'passw';

$crawler = $client->submit($form);
$crawler = $clinet->followRedirect();

$this->assertEquals(1, $crawler->filter('a:contains("logout")')->count());

: 로그인 후 'logout' a태그 갯수가 1개인지 검증

D. 데이터 공급자 (Data Providers)

// 수급자 컨트롤러 메소드
/**
 * @dataProvider provideUrls
 */
public function testSomething($url) {

    $client = static::createClient();
    $crawler = $client->request('GET', $url);

    $this->assertTrue($client->getResponse()->isSuccessful());
}
// 공급자 메소드
public function provideUrls() {
    return [
        ['/home'],
        ['/login']
    ];
}

테스트를 위한 데이터베이스 설정

격리 (Isolation)

private $entityManager;

public function setUp() {

    parent::setUp();

    $this->client = static::createClient();

    $this->entityManager = $this->client->getContainer()->get('doctrine.orm.entity_manager');

    $this->entityManager = beginTransaction();

    $this->entityManager->getConnection()->setAutoCommit(false);

}
/**
 * 파괴하다 ...
 * @access public
 */
public function tearDown() {

    parent::tearDown();

    // $this->entityManager->rollback();

    $this->entityManager->close();
    $this->entityManager = NULL;
}

취재 보고 (Coverage Report)

  • 설치
sudo apt-get install php-xdebug
  • 실행
phpunit --coverage-text

유닛 테스트 예제

use PHPUnit\Framework\TestCase;

// 비지니스 로직등 국소적인 부분만을 테스트 한다.
class SampleTest extends TestCase {

    public function test1() {}
    public function test2() {}
    // ... 메소드 순서대로 테스트를 실행한다.
}