【问题标题】:How could we validate all possible combinations of input parameters?我们如何验证所有可能的输入参数组合?
【发布时间】:2017-07-17 17:16:19
【问题描述】:

说,我正在为声明如下的两个函数编写单元测试:

void target_func_1(int param1, int param2);
void target_func_2(int param1, int param2, int param3, int param4, int param5, int param6);

对于上述两个函数,所有输入参数都应为 -1 或正数。

下面列出了验证target_func_1 的输入参数的所有可能的测试用例

  • param1 = -1 // 失败
  • param1 >= -1 && param2
  • param1
  • param1 >= -1 && param2 >= -1 // 成功

这看起来很简单。但是,target_func_2 呢?六个输入参数的可能组合可能非常多。我必须为target_func_2 编写所有这些测试用例吗?

【问题讨论】:

  • 肯定还有其他人。但我最近做了一个关于 tdd 的演讲,我意识到我确实没有在这里有 TDD 标签的答案徽章。因此,我将此标签添加到我的标签列表中;是的,我经常来这里;-)

标签: unit-testing tdd


【解决方案1】:

简单的答案是:你不会写一个接受 6 个参数的方法。

换句话说:当你阅读干净的代码时(例如通过研究罗伯特马丁和其他人的同名优秀书籍)你会发现这么多的参数绝对是不鼓励。

请理解:这不仅是因为您有很多排列要测试 - 而且除此之外:这些参数可能都在您的生产代码中使用

从这个意义上说,真正的答案不在于如何合理地测试这些方法。它是:您无法以合理的方式测试此类方法;您无法以合理的方式实现它们,因此您不应该编写它们。

(请注意:这是关于必须根据参数做出决定的方法;如果你说,只是打印它们,例如,这将是一个不同的故事)

至于有多少,让我们引用前面提到的书:

函数的理想参数数量为零(niladic)。接下来是一个(单子),紧随其后的是两个(二元)。应尽可能避免使用三个参数(三元)。超过三个(多元)需要非常特殊的理由——无论如何都不应该使用。

请注意:这是独立底层编程语言!

对于遗留代码,我推荐 两折 方法。首先,您关注该方法的公共合同。含义:你试图理解“什么进入”和“什么出去”。然后您可能会进行一些覆盖率测量,并可能添加更多测试(量身定制以在该方法中采用某些路径)。但为了记录:您编写测试以使您能够重构这些遗留代码。

除此之外:另一种方法可能是基于 QuickCheck 的想法研究测试。含义:您指定方法的 properties,然后框架为您创建 random 参数并尝试找到导致失败的情况(关于这些属性)。

【讨论】:

  • 那你能告诉我,对于C++,一个函数最多有多少个参数?那么,遗留代码呢?
  • 我又加了一段。不确定 quickcheck 是否是正确的工具,但 tehre 绝对应该是它的 c++ 实现!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
相关资源
最近更新 更多