首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JUnit 5测试方法中输入多个参数

在JUnit 5测试方法中输入多个参数
EN

Stack Overflow用户
提问于 2019-06-10 20:52:39
回答 1查看 5K关注 0票数 4

我想为我的代码库提供“多态”测试用例。具体地说,将有多个Graph接口实现,并希望对所有实现(ALGraphAMGraph等)重用测试代码。

我想按照下面的思路开发我的测试方法

代码语言:javascript
复制
    @ParameterizedTest
    @MethodSource("graphFactory")
    // Note: JUnit 5 won't allow the following additional argument source
    @ValueSource(ints = {0, 31415, -31415})
    void testInsertDeleteNode(Graph g, Integer v) {
        g.insertNode(new Node<>(v));
        assertTrue(g.containsNode(new Node<>(v)));
        assertEquals(1, g.vertices().size());

        g.deleteNode(new Node<>(v));
        assertFalse(g.containsNode(new Node<>(v)));
        assertEquals(0, g.vertices().size());
    }

但是JUnit的构建方式阻碍了我完成这个计划。

所以基本上我想给我的测试提供一个多参数的笛卡尔乘积。是否可以使用开箱即用的参数提供程序(ValueSourceNullSource等)或者我需要在@MethodSource的帮助下强制设置定制的服务

EN

回答 1

Stack Overflow用户

发布于 2019-06-11 01:51:49

在您的示例中,您还可以考虑使用基于属性的测试框架,如jqwik。它的第一种用法与您的示例非常相似:

代码语言:javascript
复制
import net.jqwik.api.*;
import static org.junit.jupiter.api.Assertions.*;

@Property(generation = GenerationMode.EXHAUSTIVE)
void testInsertDeleteNode(
        @ForAll("graphFactory") Graph g, 
        @ForAll("ints") Integer v) 
{
    g.insertNode(new Node<>(v));
    assertTrue(g.containsNode(new Node<>(v)));
    assertEquals(1, g.vertices().size());

    g.deleteNode(new Node<>(v));
    assertFalse(g.containsNode(new Node<>(v)));
    assertEquals(0, g.vertices().size());
}

@Provide
Arbitrary<Graph> graphFactory() {
    return Arbitraries.of(new ALGraph(), new AMGraph());
}

@Provide
Arbitrary<Integer> ints() {
    return Arbitraries.of(0, 31415, -31415);
}

通过使用generation = GenerationMode.EXHAUSTIVE,您可以告诉引擎生成可能参数值的笛卡尔乘积。事实上,如果组合的数量是<= 1000jqwik,那么它本身就会选择cartesion产品。

根据不同图实现的数量,您还可以考虑一种方法,为每个实现使用具体的子类,并在接口(或抽象超类)中指定测试本身:

代码语言:javascript
复制
interface GraphTest<G extends Graph> {

    G createGraph();

    @Property(generation = GenerationMode.EXHAUSTIVE)
    default void testInsertDeleteNode(@ForAll("ints") Integer v) {
        Graph g = createGraph();
        g.insertNode(new Node<>(v));
        assertTrue(g.containsNode(new Node<>(v)));
        assertEquals(1, g.vertices().size());

        g.deleteNode(new Node<>(v));
        assertFalse(g.containsNode(new Node<>(v)));
        assertEquals(0, g.vertices().size());
    }

    @Provide
    default Arbitrary<Integer> ints() {
        return Arbitraries.of(0, 31415, -31415);
    }
}

class ALGraphTest implements GraphTest<ALGraph> {
    @Override
    public ALGraph createGraph() {
        return new ALGraph();
    }
}

class AMGraphTest implements GraphTest<AMGraph> {
    @Override
    public AMGraph createGraph() {
        return new AMGraph();
    }
}

由于您已经在使用jqwik5平台,因此使用JUnit需要一个single additional dependency

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56526807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档