请建议一种单元测试简单功能的方法

时间:2011-02-07 19:48:14

标签: unit-testing

假设我有以下函数(伪代码):

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。:也许有人可以建议好好阅读单元测试方法?

4 个答案:

答案 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 TestCaseMbUnit 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。