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替换它,则会失败.这可能是好的,也可能是坏的,具体取决于具体情况.
而第二种形式仅涵盖功能.如果有人改变常数,它不会失败; 只有在修改函数以返回另一个常量(具有不同的值)时,它才会失败.
两者之间的选择取决于测试的目标.如果常量必须永远不变,请使用文字.使用常量来确定函数的行为:返回一个常量 - 无论其值如何.在第二种情况下,测试可能是不必要的.
我一直在寻找有关同一主题的信息。到目前为止,我的结论是您不应该使用文字,但是您还应该确保常量就是您期望的常量。
如果您在10个不同的单元测试中使用了文字,并且由于任何原因更改了值,那么您就必须在所有10个文字中更改值。您可能或需要为PI添加更多精度。
最佳的IMHO替代方案是实施单元测试,以检查常数的值是否符合您的期望,然后在其他测试中自由使用常数。
实施这两个测试的过程:
testPiIs3point14()
{
AssertEquals( PI, 3.14 );
}
testGetPiReturnsPi()
{
AssertEquals( getPi(), PI );
}
Run Code Online (Sandbox Code Playgroud)
PS:虽然检查值对于所有常数可能并不那么重要,但对于某些常数却可能非常重要。我可以想到的一个示例是包含URL或相似值的常量。
我认为这是关于测试和生产代码之间耦合的问题。当我第一次开始 TDD 时,我认为在测试中使用常量可以使测试更加彻底。然而,现在我认为这只会导致测试和实现之间的耦合更紧密。如果将常量复制并粘贴到测试中,是否会更安全?并不真地。它只会让改变常量变得更加痛苦,特别是如果它被复制粘贴到多个测试中。这些测试不会测试它是否是正确的常量,它们只是测试该常量是否从方法返回,所以现在我肯定会进行第二个测试。
归档时间: |
|
查看次数: |
7461 次 |
最近记录: |