在重构之前将代码行为记录为PHPUnit测试

时间:2014-04-25 12:41:38

标签: refactoring phpunit code-generation code-coverage xunit

假设我们有一个没有站点效应的(PHP)函数:

function xyz(a, b, c) {
    // 100 lines of code
}

我想要一个工具,用a,b,c的各种不同组合调用函数xyz,并以单元测试的形式记录参数和返回值。

在重构之前,我可以使用此工具来“记录”函数的行为。如果工具可以插入a,b,c的类型并尝试通过函数遍历所有代码路径,它甚至会更酷。

是否有用于PHP或其他语言的工具?

1 个答案:

答案 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);
}

正如你所看到的,只有你的想象力是极限。