为所有对测试生成测试

时间:2012-05-29 09:57:52

标签: java unit-testing tdd automated-tests

我有一个简短的(Java)方法,有几个参数执行一些非直观的计算。为了实现代码覆盖,为此方法编写单元测试是微不足道的,但测试并未涵盖该方法的细微之处。我正在寻找一个测试框架或其他一些工具,它允许我根据我为参数定义的分区对这个方法进行全对(全元组)测试。

例如,假设我有以下方法:

int foo(int begin, int end, int first, int last) {
    ...
}

我已经知道一些可能在外部强制执行的约束:

begin <= end
first <= last

我想基于我自己对参数的了解来定义显式等价关系。例如:

begin == MIN
begin > MIN && begin < 0
begin == 0
begin == 1
begin > 1 && begin < MAX
begin == MAX

我还想定义涉及多个参数的等价关系。例如:

begin + 1 < end
begin + 1 == end
begin == end

要测试的组合是从每个等价关系中选择等价类(例如,来自第一个关系的begin == 0和来自第二个关系的begin + 1 < end,这样约束是可以满足的。 [顺便说一下,我意识到可满足性是NP完全的。考虑到包含相对较小约束的组合,我愿意接受它。]使用多个参数,组合的数量变得难以处理。手动为每个组合编写测试并找到满足结果约束的参数是繁琐且容易出错的。

我正在寻找一个可以自动测试每个组合的测试框架,或者一个可以为每个逻辑上一致的组合生成测试的测试生成器(真正由您插入的不变检查)。这与CodePro等测试生成工具不同,后者从实际实现中生成测试用例。实际上,我想为方法的接口而不是其实现生成测试。这不仅允许我在实现方法之前编写测试(TDD),而且还可以确保方法在以后的修改后进行全面测试。

这样的工具是否存在,或者可以将某些东西混在一起?或许我正以错误的方式接近这个,你还有另一个建议......

5 个答案:

答案 0 :(得分:2)

不是简单的嵌套循环,在每个最里面的循环迭代中调用测试方法,是否适合账单(或者至少大部分适合账单)?

类似的东西:

int[] ends = new int[] {-50, -10, -1, 0, 1, 50, MIN, MAX};
for (int end : ends) {
    int[] begins = new int[] {end - 10, end - 1, end, MIN, MAX};
    for (int begin : begins) {
        if (begin <= end && begin >= MIN && begin <= MAX) {
             testFoo(begin, end);
        }
    }
}

答案 1 :(得分:2)

有关此问题的一些想法,请参阅David Saff's关于Theory Testing的工作。

答案 2 :(得分:2)

您可以在测试框架之外使用工具吗?如果是这样,我使用James Bach's AllPairs效果很好。还有Hexawise

如果您不了解它,http://pairwise.org是阅读成对和组合测试和工具的好地方!

答案 3 :(得分:1)

如果您仍然对在JUnit框架下执行组合测试的库感兴趣。 我最近实施了一个图书馆&#39; JCUnit&#39;,它正是如此。

它在JUnit下生成测试用例并使用它们运行测试方法。

http://dakusui.github.io/jcunit/

答案 4 :(得分:0)

我可能会建议,如果您使用TDDed算法,那么您可能已经有足够的测试覆盖率。如果有人随后进入并更改了算法,您应该看到至少有一个原始测试中断。如果你有一些边缘条件需要测试,你可以编写一些,但是如果这些边缘没有足够的兴趣,一旦你添加它们就变成红色,那么它们可能没有足够的乐趣来保持并复制现有的测试。冗余测试的价值较低,我倾向于删除它们。