PHPUnitManual:4.2
- 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 가 테스트의 전체 숫자를 계산하기 위해서 입니다.