2

我有一个简短的(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) 之前编写测试,而且可以确保即使在后来的修改之后也能对方法进行全面测试。

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

4

5 回答 5

2

有关这方面的一些想法,请参阅David Saff关于理论测试的工作。

于 2012-05-29T13:45:43.147 回答
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);
        }
    }
}
于 2012-05-29T10:33:24.200 回答
2

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

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

于 2012-05-30T11:14:51.100 回答
1

如果您仍然对在 JUnit 框架下执行组合测试的库感兴趣。我最近实现了一个库“JCUnit”,它确实做到了。

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

http://dakusui.g​​ithub.io/jcunit/

于 2014-08-30T14:27:42.660 回答
0

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

于 2012-05-29T11:41:30.273 回答