假设你有一些这样的代码(在一个虚构的语言中,因为它与这个问题无关):
constant float PI = 3.14;
float getPi()
{
return PI;
}你会像这样测试它吗:
testPiIs3point14()
{
// Test using literal in test case
AssertEquals( getPi(), 3.14 );
}或者像这样:
testPiIs3Point14()
{
// Test using constant from implementation in test case
AssertEquals( getPi(), PI );
}换句话说,您是否在测试用例中使用来自被测系统的常量?或者,这是一个实现细节吗?
发布于 2010-07-29 16:59:52
这两个测试验证/断言不同的目的。
确保getPi()始终返回3.14。
它涵盖了常量和函数,如果有人发现软件中使用的PI值不够准确,并将其替换为3.14159,它将失败。
根据context.的不同,这可能是好的,也可能是坏的
仅涵盖函数。
如果有人改变了常量,它不会失败;
只有将函数修改为返回另一个常量(具有不同的值)时,它才会失败。
两者之间的选择取决于测试的目标。
发布于 2014-04-30 04:09:44
我正在寻找关于这个主题的信息。到目前为止,我的结论是您不应该使用字面量,但您还应该确保常量是您期望的值。
如果您在10个不同的单元测试中使用了文本,并且由于任何原因改变了值,那么您必须更改所有10个文本中的值。例如,您可以或需要为PI添加更多的精度。
最好的替代方法IMHO是实现一个单元测试来检查常量的值是否为您所期望的,然后在其他测试中自由地使用常量。
关于实现这两个测试的一些事情:
testPiIs3point14()
{
AssertEquals( PI, 3.14 );
}
testGetPiReturnsPi()
{
AssertEquals( getPi(), PI );
}PS:虽然检查值对于所有常量可能不是那么重要,但对某些常量来说可能非常重要。我能想到的一个例子是包含URL或类似值的常量。
发布于 2010-07-30 01:04:39
我认为这是关于测试和生产代码之间耦合的问题。当我第一次开始TDD时,我认为在测试中使用常量可以使测试更加彻底。然而,现在我认为它只是在测试和实现之间造成了更紧密的耦合。如果将常量复制并粘贴到测试中,是否会更安全?不怎么有意思。这只会让更改常量变得更加痛苦,特别是当它被复制粘贴到多个测试中时。这些测试不会测试它是否是正确的常量,它们只是测试这个常量是不是从方法中返回的,所以现在我肯定会进行第二个测试。
https://stackoverflow.com/questions/3360074
复制相似问题