有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个带有几个参数的简短(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) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    你能在测试框架之外使用工具吗?如果是这样,我使用了James Bach's AllPairs并取得了很好的效果。还有Hexawise

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

  3. # 3 楼答案

    如果您仍然对在JUnit框架下执行组合测试的库感兴趣。 我最近实现了一个库'JCUnit',它正是这样做的

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

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

  4. # 5 楼答案

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

    比如:

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