在单元测试中对抗大型数据提供者
Combatting large data providers in unit testing
我正在对一个对象的许多字段执行验证测试,每个字段都有许多验证规则(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
看起来更小之外没有任何作用。
这是一个自以为是的问题,我觉得我可以给出结论。我参与过的所有项目都进行了某种测试,并且是我最热衷的主题领域。
在一般的软件开发中,我们尝试制定巧妙的解决方案来最大程度地减少代码重复并使其更易于维护。测试是硬币的另一面。在这里我想要一个描述性测试,如果需要的话宁愿自己重复,而不是用那种聪明的方法来解决。有一个很棒的post。
将所有测试放在一起可以为您提供测试接受的内容和结果应该是什么的蓝图。哪个是首选。另一方面,测试验证实际提供了多少价值?这对于学习测试绳索非常有用,但通常如果不是在一个异常高风险的项目中,我会在验证时进行快乐路径测试,让它保持原样并等待报告错误或错误。然后每次我必须重新访问验证时添加另一个测试。
所以你不应该担心它是一个还是两个 classes,但如果我根本不认为 30(或 100)行数据提供者 class 是个问题。
我正在对一个对象的许多字段执行验证测试,每个字段都有许多验证规则(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
看起来更小之外没有任何作用。
这是一个自以为是的问题,我觉得我可以给出结论。我参与过的所有项目都进行了某种测试,并且是我最热衷的主题领域。
在一般的软件开发中,我们尝试制定巧妙的解决方案来最大程度地减少代码重复并使其更易于维护。测试是硬币的另一面。在这里我想要一个描述性测试,如果需要的话宁愿自己重复,而不是用那种聪明的方法来解决。有一个很棒的post。
将所有测试放在一起可以为您提供测试接受的内容和结果应该是什么的蓝图。哪个是首选。另一方面,测试验证实际提供了多少价值?这对于学习测试绳索非常有用,但通常如果不是在一个异常高风险的项目中,我会在验证时进行快乐路径测试,让它保持原样并等待报告错误或错误。然后每次我必须重新访问验证时添加另一个测试。
所以你不应该担心它是一个还是两个 classes,但如果我根本不认为 30(或 100)行数据提供者 class 是个问题。