您是否在测试用例中使用了实现中的常量?

WW.*_*WW. 30 unit-testing constants

假设你有一些像这样的代码(在一个成熟的语言中,因为这个问题无关紧要):

constant float PI = 3.14;
float getPi() 
{ 
   return PI;
}
Run Code Online (Sandbox Code Playgroud)

你会这样测试它:

testPiIs3point14()
{
   // Test using literal in test case
   AssertEquals( getPi(), 3.14 );
}
Run Code Online (Sandbox Code Playgroud)

或者像这样:

testPiIs3Point14()
{
   // Test using constant from implementation in test case
   AssertEquals( getPi(), PI );
}
Run Code Online (Sandbox Code Playgroud)

换句话说,您是否在测试用例中使用被测系统中的常量?或者这被视为实施细节?

phi*_*ant 18

这两个测试用于不同的目的.

第一个确保getPi()始终返回3.14.它涵盖常量和函数,如果有人发现软件中使用的PI值不够准确并用3.14159替换它,则会失败.这可能是好的,也可能是坏的,具体取决于具体情况.

而第二种形式仅涵盖功能.如果有人改变常数,它不会失败; 只有在修改函数以返回另一个常量(具有不同的值)时,它才会失败.

两者之间的选择取决于测试的目标.如果常量必须永远不变,请使用文字.使用常量来确定函数的行为:返回一个常量 - 无论其值如何.在第二种情况下,测试可能是不必要的.

  • 支持这个答案。在我们的一个测试用例中,我们在测试中使用文字的副本,因为常量值表示企业商定的字符串值。因此,测试可确保生产代码中的 const 值不会更改,而不会导致测试失败。 (3认同)

die*_*dez 6

我一直在寻找有关同一主题的信息。到目前为止,我的结论是您不应该使用文字,但是您还应该确保常量就是您期望的常量。

如果您在10个不同的单元测试中使用了文字,并且由于任何原因更改了值,那么您就必须在所有10个文字中更改值。您可能或需要为PI添加更多精度。

最佳的IMHO替代方案是实施单元测试,以检查常数的值是否符合您的期望,然后在其他测试中自由使用常数。

实施这两个测试的过程:

testPiIs3point14()
{
   AssertEquals( PI, 3.14 );
}

testGetPiReturnsPi()
{
   AssertEquals( getPi(), PI );
}
Run Code Online (Sandbox Code Playgroud)

PS:虽然检查值对于所有常数可能并不那么重要,但对于某些常数却可能非常重要。我可以想到的一个示例是包含URL或相似值的常量。


Grz*_*nio 5

我认为这是关于测试和生产代码之间耦合的问题。当我第一次开始 TDD 时,我认为在测试中使用常量可以使测试更加彻底。然而,现在我认为这只会导致测试和实现之间的耦合更紧密。如果将常量复制并粘贴到测试中,是否会更安全?并不真地。它只会让改变常量变得更加痛苦,特别是如果它被复制粘贴到多个测试中。这些测试不会测试它是否是正确的常量,它们只是测试该常量是否从方法返回,所以现在我肯定会进行第二个测试。