繁体   English   中英

生成用于所有对测试的测试

[英]Generating tests for all-pairs testing

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

是否存在这样的工具,或者可以将某些东西放在一起吗? 也许我正以错误的方式来对待,而您还有另一个建议...

简单的嵌套循环(在每个最内层的循环迭代中调用测试方法)是否符合要求(或至少主要符合要求)?

就像是:

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);
        }
    }
}

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM