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

How could we validate all possible combinations of input parameters?

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

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 输入参数的所有可能的测试用例

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

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

换句话说:当你读到干净的代码(例如通过研究 Robert Martin 和其他人的同名优秀书籍)你会发现这么高的数字参数绝对令人沮丧

并且请理解:这不仅是因为您对 test 进行了如此多的排列 - 但除此之外:这些参数可能全部 used 在您的生产代码中。

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

(请注意:这是关于必须根据参数做出决定的方法;如果您说只是打印它们,例如,情况会有所不同)

至于有多少,引述上述书:

The ideal number of arguments for a function is zero (niladic). Next comes one (monadic), followed closely by two (dyadic). Three arguments (triadic) should be avoided where possible. More than three (polyadic) requires very special justification—and then shouldn’t be used anyway.

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

对于遗留代码,我推荐双重方法。首先你关注那个方法的 public contract。意思是:你试着理解 "what goes in" 和 "what goes out"。然后您可能会进行一些覆盖率测量,并且可能会添加更多测试(定制以采用该方法中的某些路径)。但郑重声明:您编写测试以使您能够重构那些遗留代码。

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