在单元测试中对抗大型数据提供者

Combatting large data providers in unit testing

我正在对一个对象的许多字段执行验证测试,每个字段都有许多验证规则(requiredintegerunique 等)。我没有为每个 fieldrule 编写测试函数,而是有一个 data provider 提供给 generic 测试函数。

data provider 的人为示例:

public function validationErrorsProvider()
{
    return [
        [ 'field', 'input', 'error message' ],
        [ 'field', 'input', 'error message' ],
        [ 'field', 'input', 'error message' ],
    ];
}

然后 data provider 被通用测试方法使用,该方法断言对于 fieldinput 它看到 error message.

/**
 * @test
 * @dataProvider validationErrorsProvider
 */
public function will_fail_with_errors_when_input_is_invalid($field, $input, $error)
{
    // do some stuff
}

这工作正常,但随着我添加更多要测试的字段和规则(validationErrorsProvider 数组中的 20 - 30 个元素),data provider 变得越来越大。它看起来比我的一些测试更复杂。

这只是发生的事情,还是有其他选择?我考虑过将 data provider 拆分为多个 providers,每个只包含给定 field 的数据。这除了使 data provider 看起来更小之外没有任何作用。

这是一个自以为是的问题,我觉得我可以给出结论。我参与过的所有项目都进行了某种测试,并且是我最热衷的主题领域。

在一般的软件开发中,我们尝试制定巧妙的解决方案来最大程度地减少代码重复并使其更易于维护。测试是硬币的另一面。在这里我想要一个描述性测试,如果需要的话宁愿自己重复,而不是用那种聪明的方法来解决。有一个很棒的post

将所有测试放在一起可以为您提供测试接受的内容和结果应该是什么的蓝图。哪个是首选。另一方面,测试验证实际提供了多少价值?这对于学习测试绳索非常有用,但通常如果不是在一个异常高风险的项目中,我会在验证时进行快乐路径测试,让它保持原样并等待报告错误或错误。然后每次我必须重新访问验证时添加另一个测试。

所以你不应该担心它是一个还是两个 classes,但如果我根本不认为 30(或 100)行数据提供者 class 是个问题。