PHPUnitManual:4.2

From 흡혈양파의 번역工房
Jump to: navigation, search
4.2 데이터 제공자

데이터 제공자 (Providers)

테스트 메소드에는 임이의 인수를 전달할 수 있습니다. 인수는 데이터 제공자 메소드 (예제 4.4 "배열의 배열을 반환하는 데이터 제공자의 사용" 의 provider() ) 에서 지정합니다. 사용하는 데이터 제공자 메소드를 지정하기 위해서는 @dataProvider 주석을 사용합니다.


데이터 제공자 메소드는, public 이어야만 합니다. 또, 메소드의 반환값의 type 은, 배열의 배열, 혹은 Object (Iterator 인터페이스가 구현되어 있고, 반복처리 시에 배열을 반환할 것) 일 필요가 있습니다. 이 반환값의 각 요소의 값를 인수로 하여 테스트 메소드가 호출됩니다.


예제 4.4 배열의 배열을 반환하는 데이터 제공자의 사용

<?php
class DataTest extends PHPUnit_Framework_TestCase
{
	/**
	 * @dataProvider provider
	 */
	public function testAdd($a, $b, $c)
	{
		$this->assertEquals($c, $a + $b);
	}
	public function provider()
	{
		return array(
				array(0, 0, 0),
				array(0, 1, 1),
				array(1, 0, 1),
				array(1, 1, 3)
			    );
	}
}
?>
PHPUnit 3.7.0 by Sebastian Bergmann.
...F
Time: 0 seconds, Memory: 5.75Mb
There was 1 failure:
1) DataTest::testAdd with data set #3 (1, 1, 3)
Failed asserting that 2 matches expected 3.
/home/sb/DataTest.php:9
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.phpunit DataTest
PHPUnit 3.7.0 by Sebastian Bergmann.
...F
Time: 0 seconds, Memory: 5.75Mb
There was 1 failure:
1) DataTest::testAdd with data set #3 (1, 1, 3)
Failed asserting that 2 matches expected 3.
/home/sb/DataTest.php:9
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.


예제 4.5 Iterator Object 를 반환하는 데이터 제공자의 사용

<?php
require 'CsvFileIterator.php';
class DataTest extends PHPUnit_Framework_TestCase
{
	/**
	 * @dataProvider provider
	 */
	public function testAdd($a, $b, $c)
	{
		$this->assertEquals($c, $a + $b);
	}
	public function provider()
	{
		return new CsvFileIterator('data.csv');
	}
}
?>
PHPUnit 3.7.0 by Sebastian Bergmann.
...F
Time: 0 seconds, Memory: 5.75Mb
There was 1 failure:
1) DataTest::testAdd with data set #3 ('1', '1', '3')
Failed asserting that 2 matches expected '3'.
/home/sb/DataTest.php:11
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.phpunit DataTest
PHPUnit 3.7.0 by Sebastian Bergmann.
...F
Time: 0 seconds, Memory: 5.75Mb
There was 1 failure:
1) DataTest::testAdd with data set #3 ('1', '1', '3')
Failed asserting that 2 matches expected '3'.
/home/sb/DataTest.php:11
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.


예제 4.6 CsvFileIterator 클래스

<?php
class CsvFileIterator implements Iterator {
	protected $file;
	protected $key = 0;
	protected $current;
	public function __construct($file) {
		$this->file = fopen($file, 'r');
	}
	public function __destruct() {
		fclose($this->file);
	}
	public function rewind() {
		rewind($this->file);
		$this->current = fgetcsv($this->file);
		$this->key = 0;
	}
	public function valid() {
		return !feof($this->file);
	}
	public function key() {
		return $this->key;
	}
	public function current() {
		return $this->current;
	}
	public function next() {
		$this->current = fgetcsv($this->file);
		$this->key++;
	}
}
?>


주의사항
@dataProvider 로 지정한 메소드와 @depends 로 지정한 테스트 양쪽 모두로부터 입력을 받는 테스트의 경우, 데이터 제공자로부터의 인수가 의존 테스트의 인수보다 먼저 입력됩니다.


주의사항

""한 테스트가 데이터 제공자를 사용하는 다른 테스트에 의존하는 경우, 다른 테스트에서 하나 이상의 data set 에 대한 테스트가 성공한다면, 이 테스트도 실행됩니다. 데이터 제공자를 사용한 테스트의 결과를 이 테스트에 주입할 순 없습니다.


주의사항
모든 데이터 제공자를 실행한 뒤, 정적 메소드 setUpBeforeClass 나 setUp 메소드가 처음으로 호출되게 됩니다. 이 때문에, 데이터 제공자는 이들 메소드에서 선언한 변수에 접근할 수 없습니다. 이렇게 한 이유는, PHPUnit 가 테스트의 전체 숫자를 계산하기 위해서 입니다.


Notes