首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您是否在测试用例中使用来自实现的常量?

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

Stack Overflow用户
提问于 2010-07-29 14:46:39
回答 7查看 13.3K关注 0票数 50

假设你有一些这样的代码(在一个虚构的语言中,因为它与这个问题无关):

代码语言:javascript
复制
constant float PI = 3.14;
float getPi() 
{ 
   return PI;
}

你会像这样测试它吗:

代码语言:javascript
复制
testPiIs3point14()
{
   // Test using literal in test case
   AssertEquals( getPi(), 3.14 );
}

或者像这样:

代码语言:javascript
复制
testPiIs3Point14()
{
   // Test using constant from implementation in test case
   AssertEquals( getPi(), PI );
}

换句话说,您是否在测试用例中使用来自被测系统的常量?或者,这是一个实现细节吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-07-29 16:59:52

这两个测试验证/断言不同的目的。

  • 第一个(在测试用例中使用文字)

确保getPi()始终返回3.14。

它涵盖了常量和函数,如果有人发现软件中使用的PI值不够准确,并将其替换为3.14159,它将失败。

根据context.的不同,这可能是好的,也可能是坏的

  • 第二个(重用实现代码)

仅涵盖函数。

如果有人改变了常量,它不会失败;

只有将函数修改为返回另一个常量(具有不同的值)时,它才会失败。

两者之间的选择取决于测试的目标。

  • 如果常量必须永远不变,则使用文字。
  • 使用常量来限制函数的行为:返回一个常量-无论它的值是什么。在第二种情况下,测试可能是不必要的。
票数 32
EN

Stack Overflow用户

发布于 2014-04-30 04:09:44

我正在寻找关于这个主题的信息。到目前为止,我的结论是您不应该使用字面量,但您还应该确保常量是您期望的值。

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

最好的替代方法IMHO是实现一个单元测试来检查常量的值是否为您所期望的,然后在其他测试中自由地使用常量。

关于实现这两个测试的一些事情:

代码语言:javascript
复制
testPiIs3point14()
{
   AssertEquals( PI, 3.14 );
}

testGetPiReturnsPi()
{
   AssertEquals( getPi(), PI );
}

PS:虽然检查值对于所有常量可能不是那么重要,但对某些常量来说可能非常重要。我能想到的一个例子是包含URL或类似值的常量。

票数 12
EN

Stack Overflow用户

发布于 2010-07-30 01:04:39

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3360074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档