我们如何验证所有可能的输入参数组合?

时间:2017-07-17 08:26:29

标签: unit-testing tdd

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

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&& param2> = -1 //失败
  • param1> = -1&& param2< -1 //失败
  • param1< -1&& param2< -1 //失败
  • param1> = -1&& param2> = -1 //成功

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

1 个答案:

答案 0 :(得分:3)

简单的答案是:你没有编写一个带6个参数的方法。

换句话说:当你读到清洁代码时(例如通过罗伯特·马丁和其他人研究这个名字的优秀书籍),你会发现如此大量的参数绝对是< EM>气馁

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

从这个意义上讲,真正的答案并不是如何合理地测试这样的方法。它是:你不能以合理的方式测试这些方法;你不能以合理的方式实现它们,因此你不应该写它们。

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

正如多少一样,让我们​​引用上述书:

  

函数的理想参数数量为零(niladic)。接下来是一个(monadic),紧接着是两个(二元)。应尽可能避免三个论点(三元论)。超过三个(polyadic)需要非常特殊的理由 - 然后不应该使用。

请注意:这是基础编程语言的独立

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

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