PHPUnitManual:6

From 흡혈양파의 번역工房
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
제 6장. Fixtures

테스트의 작성 중 가장 많은 시간이 걸리는 작업은, 테스트를 개시하기 위한 사전 설정과, 테스트 종료 후의 처리를 작성하는 것입니다. 이 사전 설정을 테스트의 fixture 라고 합니다.


"예4.1 PHPUnit 에서의 배열 조작 테스트" 에서 fixture 는 $fixture 배열 하나뿐이었습니다. 그렇지만 대부분의 경우 fixture 는 보다 복잡하고, 이를 준비하기 위해 많은 양의 코드가 필요합니다. 결과적으로 테스트의 내용이 fixture 를 설정하기 위한 코드에 가려지게 됩니다. 이 문제는, 여러 테스트에 비슷한 내용의 fixture 를 설정할 때 명백하게 드러납니다. 테스트 프레임워크의 도움이 없이는 각각의 테스트 안에서 비슷한 내용의 준비 코드를 반복해서 작성하게 됩니다.


PHPUnit 에서는, 준비용 코드의 공유를 서포트합니다. 각 테스트 메소드가 실행되기 전에, setUp() 템플릿 메소드가 실행됩니다. setUp() 은 테스트 대상 오브젝트를 생성하는 등의 처리에 사용됩니다. 테스트 메소드의 실행이 종료된 뒤, 성공 여부에 관계없이 tearDown() 템플릿 메소드가 실행됩니다. tearDown() 에서는 테스트 대상 오브젝트의 후처리가 이루어집니다.


"예4.2 @depends 선언을 사용한 의존성 표현" 에서는 producer-consumer 관계를 사용하여 복수의 테스트에서 fixture 를 공유하였습니다. 이는 필수는 아니고 언제나 사용 가능한 것도 아닙니다. "예6.1 setUp() 을 사용한 stack fixture 의 작성" 에서는, 정해진 fixture 를 재사용하는 것이 아닌 코드를 생성하여 fixture 를 생성하는 StackTest 방식이 표현되어 있습니다. 인스턴스 변수 $stack 를 선언하고, 메소드의 로컬 변수 대신 이 변수를 사용합니다. 그 뒤, setUp() 메소드에서 array 를 작성합니다. 마지막으로 테스트 메소드에서 불필요한 코드를 삭제하고, 검증 메소드인 assertEquals() 에 메소드의 로컬 변수 $stack 대신 새롭게 도입한 인스턴스 변수 $this->stack 를 사용합니다.


예6.1: setUp() 을 사용한 stack fixture 의 작성

<?php
class StackTest extends PHPUnit_Framework_TestCase
{
    protected $stack;
 
    protected function setUp()
    {
        $this->stack = array();
    }
 
    public function testEmpty()
    {
        $this->assertTrue(empty($this->stack));
    }
 
    public function testPush()
    {
        array_push($this->stack, 'foo');
        $this->assertEquals('foo', $this->stack[count($this->stack)-1]);
        $this->assertFalse(empty($this->stack));
    }
 
    public function testPop()
    {
        array_push($this->stack, 'foo');
        $this->assertEquals('foo', array_pop($this->stack));
        $this->assertTrue(empty($this->stack));
    }
}
?>


템플릿 메소드인 setUp() 과 tearDown() 은, 테스트 케이스 클래스의 테스트 메소드 별로 (그리고 최초로 인스턴스를 작성할 때) 한 번 씩 실행됩니다.


또, 템플릿 메소드 setUpBeforeClass() 와 tearDownAfterClass() 는, 테스트 케이스 클래스의 최초의 테스트 메소드의 실행 전과 테스트 케이스 클래스의 마지막 테스트 실행 후에 호출됩니다.


다음 예는 테스트 케이스 클래스에서 사용 가능한 모든 템플릿 메소드입니다.


예6.2: 사용 가능한 모든 템플릿 메소드

<?php
class TemplateMethodsTest extends PHPUnit_Framework_TestCase
{
    public static function setUpBeforeClass()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }
 
    protected function setUp()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }
 
    protected function assertPreConditions()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }
 
    public function testOne()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        $this->assertTrue(TRUE);
    }
 
    public function testTwo()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        $this->assertTrue(FALSE);
    }
 
    protected function assertPostConditions()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }
 
    protected function tearDown()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }
 
    public static function tearDownAfterClass()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }
 
    protected function onNotSuccessfulTest(Exception $e)
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        throw $e;
    }
}
?>
phpunit TemplateMethodsTest
PHPUnit 3.7.0 by Sebastian Bergmann.

TemplateMethodsTest::setUpBeforeClass
TemplateMethodsTest::setUp
TemplateMethodsTest::assertPreConditions
TemplateMethodsTest::testOne
TemplateMethodsTest::assertPostConditions
TemplateMethodsTest::tearDown
.TemplateMethodsTest::setUp
TemplateMethodsTest::assertPreConditions
TemplateMethodsTest::testTwo
TemplateMethodsTest::tearDown
TemplateMethodsTest::onNotSuccessfulTest
FTemplateMethodsTest::tearDownAfterClass


Time: 0 seconds, Memory: 5.25Mb

There was 1 failure:

1) TemplateMethodsTest::testTwo
Failed asserting that <boolean:false> is true.
/home/sb/TemplateMethodsTest.php:30

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.


Notes