如何组织在一系列类似输入上运行的测试?
问题描述:
给定一组测试数据文件如何组织在一系列类似输入上运行的测试?
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);
}
仅供参考,请参阅: