假设我们有一个没有站点效应的(PHP)函数:
function xyz(a, b, c) {
// 100 lines of code
}
我想要一个工具,用a,b,c的各种不同组合调用函数xyz,并以单元测试的形式记录参数和返回值。
在重构之前,我可以使用此工具来“记录”函数的行为。如果工具可以插入a,b,c的类型并尝试通过函数遍历所有代码路径,它甚至会更酷。
是否有用于PHP或其他语言的工具?
答案 0 :(得分:0)
嗯,实际上你只需要创建一组参数,用它调用单位并跟踪实际值。
然后在重构之后,针对同一组参数运行并检查实际结果是否是预期结果。
假设您有一个受测试的单位:
$unit = function() {
return implode('-', func_get_args());
};
这真的是一个简单的功能。在第一轮中,您可以捕获数据,例如使用置换的参数集:
$params = new ParameterSetsIterator(range(0, 1), range('a', 'c'));
$dataset = [];
foreach ($params as $index => $args) {
$actual = call_user_func_array($unit, $args);
echo $index, ': ', $actual, "\n";
$dataset[] = [$args, $actual];
}
file_put_contents('dataset.php', '<?php return ' . var_export($dataset, true) . ';');
输出:
0: 0-a
1: 1-a
2: 0-b
3: 1-b
4: 0-c
5: 1-c
然后您可以通过包含它并对其进行验证来使用此类集。如果你想将它保存为回归测试数据集(注意将这些集合减少到真正有趣的值,不仅仅是对于刚刚运行的非常大的集合一直失败),你也可以使用他们作为Phpunit中的数据提供者:
function provideSet() {
return include('dataset.php');
}
/**
* @dataProvider provideSet
* @test
*/
function withSet($args, $expected) {
$actual = call_user_func_array($this->unit, $args);
$this->assertSame($expected, $actual);
}
正如你所看到的,只有你的想象力是极限。