假设我有以下函数(伪代码):
bool checkObjects(a, b)
{
if ((a.isValid() && (a.hasValue()) ||
(b.isValid() && (b.hasValue()))
{
return true;
}
return false;
}
我应该编写哪些测试才能声称它已100%覆盖?
共有16种可能的输入组合。我应该编写16个测试用例,还是应该尝试智能操作并省略一些测试用例?
例如,我应该为
编写测试吗?[a valid and has value, b valid and has value]
如果我测试它会返回预期的
[a valid and has value, b invalid and has value]
和
[a invalid and has value, b valid and has value]
谢谢!
P.S。:也许有人可以建议好好阅读单元测试方法?
答案 0 :(得分:1)
Kent Beck的测试驱动开发已经做得很好并且正在成为一个经典(http://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530)
如果你想彻底达到最大值,那么16次检查是值得的。
答案 1 :(得分:1)
这取决于。就个人而言,我对测试所有边界条件感到满意。因此,两种情况都是如此,但是将一个项目设为false会使整体结果为false,而将一个项目设为true的所有4个错误情况都会使整体结果成立。但这是一个判断,我不会对完成所有16个案件的人提出过错。
顺便提一下,如果您对一个真实案例和一个虚假案件进行了单元测试,则代码覆盖率工具会说您有100%的覆盖率。
答案 2 :(得分:1)
如果您担心编写16个测试用例,可以尝试使用NUnit TestCase或MbUnit RowTest等功能。其他语言/框架应该具有类似的功能。
这将允许您使用单个(和小)测试用例测试所有16个条件。
答案 3 :(得分:1)
如果测试看起来很难,请考虑重构。我可以在这里看到几种方法。首先将isValid()
和hasValue()
合并到一个方法中并单独测试。为什么checkObjects(a, b)
测试两个不相关的对象?你为什么不能checkObject(a)
和checkObject(b)
,进一步降低可能性的指数增长?只是一个提示。
如果你真的想测试所有16种可能性,可以考虑更多的表格工具,比如Fitnesse(参见http://fitnesse.org/FitNesse.UserGuide.FitTableStyles)。另请检查Parameterized JUnit runner和TestNG。