【问题标题】:Need to write tests to methods that returns a constant value?需要为返回常量值的方法编写测试?
【发布时间】:2013-10-31 19:06:58
【问题描述】:

我对测试技术不是很熟悉,所以我需要帮助解决这样的问题: 例如,三个类(C1 C2 C3 )实现接口 I

class I
{
  char get_Char() const = 0;
} 

C1::get_Char() const { return 'a' };
C2::get_Char() const { return 'b' };
C3::get_Char() const { return 'c' };

我应该在我的测试中测试这个方法吗?

我认为 - 是的,但我找不到我的猜测的确认或反驳。你能指出我需要测试什么不需要测试的好理论吗?

【问题讨论】:

  • 我没有任何理论可以说明,所以我将其作为评论。但通常,当您测试时,您会测试 something。如果输入发生变化会发生什么?每个可能的逻辑分支会发生什么?返回值是否计算正确?在您的情况下,您没有输入,没有逻辑分支,也没有机会更改返回值。我看不出有什么要测试的,但我相信其他人会告诉你和我,我错了。
  • 你不测试“只是因为你可以”。您进行测试是为了验证您的代码,或者作为将来维护它的帮助,或者因为某些合同需要实现 90/95/100% 的代码覆盖率。根据您的需要和原因,您会找到答案;)您不需要验证常量,除非常量可以是用户定义的。除非您将来可以更改它以引发异常并破坏某些内容,否则您不需要维护“return 5”。如果您需要 100% 的覆盖率,则必须对其进行测试。等等。
  • @ScottMermelstein:实际上,作为其他人之一,我同意,除非 100% 是目标 :)
  • 是的,您应该为所有三个派生类编写测试。这将揭示上面显示的代码中的错误。

标签: c++ unit-testing testing


【解决方案1】:

我写了一条评论,但后来我想到了一个重要的想法。

你说那个接口有 3 个实现。

那个接口状态是什么?当您有多个实现时,很有可能仅实现该接口不足以“正常”。该接口是否隐含地需要某些东西来保存?

您的示例界面返回字符。这些字符可以是任何字符吗?可以是 \0(空字符,字符串结尾)吗?可以是 \xFF (常见的 EOF 字符)吗?可以是ąęćźń(第8位设置的非纯ASCII字符,取决于代码页)吗?他们是否允许抛出异常?

如果接口施加了任何这样的限制,您可以/应该/可以测试实现是否真正符合该接口的要求。

请注意,我并不是说要根据它们的内部运作来测试实现。内部运作说这是一个常数。我说要验证他们是否成功实现了接口的要求。如果这些类的唯一目的是实现该接口并提供数据,您可以检查该数据是否有效。半年后,您可能会更改该数据类并退出有效域,即使它是恒定的。您可以将 return 'c' 更改为 return '\xcc',这可能是不可接受的。

但是,最后要注意的是,请记住不要过度使用。测试是一个工具,而不是一个目标。如果没有要求,那么无论实现是干净还是肮脏,都无需测试。始终使用适当的工具来获得所需的效果!

【讨论】:

  • 我完全同意,至少您需要通过接口测试这些实现的使用情况。
  • 感谢您的回答。与 cmets 结合使用,有助于确定是否需要测试某些方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多