当前位置: 首页 > 知识库问答 >
问题:

在多个接口实现上运行相同的参数化测试集

庞瀚
2023-03-14

我正在Java中实现算法族,并希望在每个算法实现上运行相同的算法族测试集。让我们看看排序算法的情况。

我有一些排序算法的实现。我希望在每个实现上运行相同的参数化测试套件,而不需要复制/粘贴每个接口实现的测试。

对于“如何在多个类实现上运行同一组测试”,我见过几次的答案是使用参数化测试,其中包含要测试的实现类列表作为输入。但是,这些示例使用该类作为唯一参数。我想对测试中的类运行参数化测试。

BubbleSorter.class, [1,2,3]
BubbleSorter.class, [3,2,1]
BubbleSorter.class, [-1,2,0]
MergeSorter.class, [1,2,3]
MergeSorter.class, [3,2,1]
MergeSorter.class, [-1,2,0]
InsertionSorter.class, [1,2,3]
...

对于这种情况,推荐的方法是什么?在这种情况下,测试代码中的继承是允许的,还是总有更好的替代方案?

另外,我使用的是JUnit5。

共有1个答案

宗乐池
2023-03-14

在我的例子中,我希望提供要测试的类和一个值数组。

您可以在@methodsource中组合多个源代码。让我们假设您有一个类似于公共sorter接口的东西:

class SorterTest {

    @ParameterizedTest
    @MethodSource("args")
    void test(Sorter sorter, List<Integer> list) {
        // ...
    }

    static Stream<Arguments> args() {
        // Combines each sorter implementation with each list to be sorted.
        return sorters().flatMap(sorter -> lists().map(list -> Arguments.of(sorter, list)));
    }

    static Stream<Sorter> sorters() {
        return Stream.of(new BubbleSorter(), new MergeSorter(), new InsertionSorter());
    }

    static Stream<List<Integer>> lists() {
        return Stream.of(List.of(1, 2, 3), List.of(3, 2, 1), List.of(-1, 2, 0));
    }

}

如果不想使用提供预期结果的测试oracle(即通过引用实现的排序列表),还可以组合三个流:sorters()unsorted()sorted()。此外,如果您想要懒洋洋地创建测试中的类,您可以使用供应商

static Stream<Supplier<Sorter>> sorters() {
    return Stream.of(BubbleSorter::new, MergeSorter::new, InsertionSorter::new);
}
 类似资料:
  • 问题内容: 此代码完美地工作。方法test()适用于两个接口。幕后到底发生了什么?在实际情况下,此功能有何用处? 问题答案: 因为它是一个接口,所以不会造成任何危害。通过实现和,您基本上是在为您的课程使用蓝图。双方并说,应实施一个名为方法 您的类实现了该方法,因此接口已完成其工作。 基本上,您的班级在说:“哦,我需要因为接口而实现”,然后您就实现了。然后您的班级说:“哦,嘿,由于接口我需要再次实现

  • 本文向大家介绍Python接口自动化测试的实现,包括了Python接口自动化测试的实现的使用技巧和注意事项,需要的朋友参考一下 1)环境准备:   接口测试的方式有很多,比如可以用工具(jmeter,postman)之类,也可以自己写代码进行接口测试,工具的使用相对来说都比较简单,重点是要搞清楚项目接口的协议是什么,然后有针对性的进行选择,甚至当工具不太适合项目时需要自己进行开发。   在我们项目

  • 我的目标是让一系列测试一个接一个地运行。我希望有一个“登录”脚本让用户登录,然后在同一窗口/驱动程序中继续执行以下脚本。我使用的是TestNG,所以我的测试套件设置在TestNG.xml文件中(如果有帮助的话)。 我要运行的下一个脚本:

  • 参数化测试可以将不同的数据输入到测试中。不过,我创建了一个示例计算器,希望为其创建参数化测试。但是,我发现您只能为单个测试创建一组参数化数据。 我已经创建了参数化测试,用于添加两个数字,得到预期的结果。由于预期结果会有所不同,因此该数据将不适用于减法运算。 有没有可能为每个加、减、乘、除测试提供参数化数据? 非常感谢您的建议,

  • 问题内容: 我想同时运行多个Selenium测试(在Jenkins服务器上)。 当前,由于ChromeDriver似乎通过特殊端口进行通讯,因此一次仅运行一次测试。因此,以某种方式,我想我必须通过Selenium将某种端口设置传递给ChromeDriver,以启动多个测试。 不幸的是,Selenium网站上的该主题为空:http : //docs.seleniumhq.org/docs/04_we

  • 我有一个接口,它的实现包括单链表、Doubly、Circular等。我为Singly编写的单元测试应该对该接口的大部分Doubly以及Circular和任何其他新实现都有好处。因此,JUnit是否提供了一些内置的东西,让我有一个JUnit测试,并针对不同的实现运行它,而不是对每个实现重复单元测试? 使用JUnit参数化测试,我可以提供不同的实现,如Singly、doubly、circular等,但