如何组织对一系列类似输入进行操作的测试



给定一组测试数据文件

  • 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个断言,并且我失去了以下好处:

  1. 我不知道有多少测试失败/通过,因为测试在第一次失败断言时停止
  2. 在第二次执行时,我不能只运行失败的测试
  3. 我无法选择特定的测试编号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

最新更新