给定一组测试数据文件
test001.txt
test002.txt
- 等等
和预期结果数据文件
expected001.txt
expected002.txt
- 等等
我正在使用phpunit
测试数据处理功能:
public function test001()
{
$fn = "test001.txt";
$data = file_get_contents($fn);
// code to perform the test, and create $processedData from $data
$fn = "expected001.txt";
$expestedData = file_get_contents($fn);
$this->assertEquals($expestedData, $processedData);
}
对于所有成对的测试数据文件和相应的结果数据文件,过程代码完全相同。
因此,为了在所有文件上应用测试,我可以进行循环:
public function test001to213()
{
for ($k = 0; $k < 213; $k++) {
$fn = "test".sprintf('%03d', $k).".txt";
$data = file_get_contents($fn);
// data process code to create $processedData from $data
$fn = "expected".sprintf('%03d', $k).".txt";
$expectedData = file_get_contents($fn);
$this->assertEquals($expectedData, $processedData);
}
}
然而,通过这种方式,我在一个测试中有213个断言,并且我失去了以下好处:
- 我不知道有多少测试失败/通过,因为测试在第一次失败断言时停止
- 在第二次执行时,我不能只运行失败的测试
- 我无法选择特定的测试编号x-以调试模式运行
在添加更多代码以获得这些好处之前,有更好的解决方案吗?在这种情况下,phpunit
的哪些功能可以提供帮助?
您可以使用数据提供程序:
/**
* @dataProvider providerFilenames
*
* @param string $testFilename
* @param string $expectedFilename
*/
public function testContent($testFilename, $expectedFilename)
{
$data = file_get_contents($testFilename);
// code to perform the test, and create $processedData from $data
$processedData = '';
$expectedData = file_get_contents($expectedFilename);
$this->assertEquals($expectedData, $processedData);
}
/**
* @return Generator
*/
public function providerFilenames()
{
for ($key = 0; $key < 213; ++$key) {
$testFilename = sprintf(
'test%03d.txt',
$key
);
$expectedFilename = sprintf(
'expected%03d.txt',
$key
);
/**
* by yielding with a name here, it's easier to tell which set failed
*/
$name = sprintf(
'this is set %03d',
$key
);
yield $name => [
$testFilename,
$expectedFilename ,
];
}
}
如果您还不能使用生成器,请将数据提供程序调整为:
/**
* @return Generator
*/
public function providerFilenames()
{
$keys = range(0, 213);
$names = array_map(function ($key) {
return sprintf(
'this is set %03d',
$key
);
}, $keys);
$data = array_combine(
$names,
$keys
);
return array_map(function ($key) {
$testFilename = sprintf(
'test%03d.txt',
$key
);
$expectedFilename = sprintf(
'expected%03d.txt',
$key
);
return [
$testFilename,
$expectedFilename
];
}, $data);
}
参考:
- https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers
- http://php.net/manual/en/language.generators.syntax.php
- http://php.net/manual/en/function.array-map.php
- http://php.net/manual/en/function.array-combine.php