【问题标题】:Combatting large data providers in unit testing在单元测试中与大型数据提供者作斗争
【发布时间】:2021-09-16 13:06:24
【问题描述】:

我正在对一个对象上的多个字段执行验证测试,每个字段都有多个验证规则(required、integer、unique 等)。我没有为每个field 和rule 编写测试函数,而是将data provider 提供给generic 测试函数。

data provider 的人为示例:

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

然后,data provider 被通用测试方法使用,该方法断言对于 field 和 input,它会看到 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 看起来更小之外,这不会做任何事情。

【问题讨论】:

    标签: laravel testing phpunit


    【解决方案1】:

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

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

    将所有测试放在一起为您提供了测试接受什么以及结果应该是什么的蓝图。哪个是首选。另一方面,测试验证实际上提供了多少价值?这对于学习测试方法很有帮助,但通常如果不是在一个非常高风险的项目中,我会在验证上做一个快乐的路径测试,然后等待错误或错误被报告。然后每次我必须重新访问验证时添加另一个测试。

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

    【讨论】:

    • 感谢您的回答和链接文章。因此,如果我理解正确,理想情况下,测试应该是描述性的和单一的(独立测试函数的每个可能路径),但是,可以合并诸如验证之类的琐碎测试?
    • 在测试中没有正确性,但我会争辩说测试验证有效并且失败。如果测试 a@a.com 有效的电子邮件测试并且 notanemail 失败,则将其留在那里并完成:) 但是 ofc 与数据提供者一起工作,您可以轻松添加额外的测试。验证测试我认为深入兔子洞并不能为业务提供价值,而是测试核心业务逻辑。
    猜你喜欢
    • 2015-10-11
    • 1970-01-01
    • 2021-10-30
    • 2013-12-26
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2011-01-17
    相关资源
    最近更新 更多