PHPUnitManual:6
- 제 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.