PHPUnitManual:6

From 흡혈양파의 번역工房
Jump to: navigation, search
제 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