为了账号安全,请及时绑定邮箱和手机立即绑定

使用 JUnit 5 的 @ParametrizedTest 而不是

使用 JUnit 5 的 @ParametrizedTest 而不是

阿晨1998 2022-07-14 16:33:14
首先,在 Junit 5 动态测试指南的结论中,它们是什么意思?参数化测试可以替代本文中的许多示例。但是,动态测试与参数化测试不同,因为它们支持完整的测试生命周期,而参数化测试不支持。我浏览了JUnit 5 – Parameterized Tests并相信我理解了句法层面的差异,并且相信我明白了这一点:此外,动态测试在如何生成输入以及如何执行测试方面提供了更大的灵活性。但是看起来,为什么有人更喜欢参数化测试而不是动态测试?
查看完整描述

2 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

动态测试,我将它们称为 testlets,只是软/分组断言(assertAll(...))。您将在报告中看到每个生成的动态测试的条目,但它们不是真正的测试。

您复制到问题中的引用(来自 baeldung)是错误的。它应该在 JUnit 的用户指南中阅读:

动态测试生命周期

@Test动态测试的执行生命周期与标准案例的执行生命周期完全不同。具体来说,单个动态测试没有生命周期回调。这意味着@BeforeEach@AfterEach方法及其相应的扩展回调是针对@TestFactory方法执行的,而不是针对每个动态测试执行的。

有关更多详细信息,请阅读:https ://junit.org/junit5/docs/current/user-guide/#writing-tests-dynamic-tests

为什么有人更喜欢参数化测试而不是动态测试?

  1. 如果您需要为每个测试(模板调用)提供完整的生命周期支持。

  2. 如果你想在注释中声明你的参数。

在此处找到有关如何以各种形式向 a 提供参数的更多详细信息@ParameterizedTesthttps ://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests - 请注意“类/容器模板”计划在以后发布:https ://github.com/junit-team/junit5/issues/878

我在这里写了一篇博客文章,比较了用 JUnit Jupiter 分散 3 个断言的 5 个步骤:https ://sormuras.github.io/blog/2018-05-14-junit5-scatter-assertions.html

//img1.sycdn.imooc.com//62cfd59b000163fc03750323.jpg

查看完整回答
反对 回复 2022-07-14
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

更大的灵活性在某种程度上意味着编写起来更加复杂和样板,尤其是在大多数情况下,测试用例是相当静态的,但不是那么动态的。


考虑我想测试Math.add():


参数化测试版本如下所示:


@ParameterizedTest

@CsvSource({ "1,1,2",

            "2,2,4",

            "3,3,6",

            "4,4,8",

            "5,5,10",

            "6,6,12",

            "7,7,14",

            "10,90,100" })

public void parameterizedTest(int left, int right, int expected) {

    assertEquals(expected, Math.addExact(left, right));

}

动态测试版本如下:


@TestFactory

Collection<DynamicTest> dynamicTest() {

    return Arrays.asList(

      DynamicTest.dynamicTest("Test1", () -> assertEquals(2, Math.addExact(1, 1))),

      DynamicTest.dynamicTest("Test2", () -> assertEquals(4, Math.addExact(2, 2))),

      DynamicTest.dynamicTest("Test3", () -> assertEquals(6, Math.addExact(3, 3))),

      DynamicTest.dynamicTest("Test4", () -> assertEquals(8, Math.addExact(4, 4))),

      DynamicTest.dynamicTest("Test5", () -> assertEquals(10, Math.addExact(5, 5))),

      DynamicTest.dynamicTest("Test6", () -> assertEquals(12, Math.addExact(6, 6))),

      DynamicTest.dynamicTest("Test7", () -> assertEquals(14, Math.addExact(7, 7))),

      DynamicTest.dynamicTest("Test8", () -> assertEquals(100, Math.addExact(10, 90))));

}

它已经有许多样板代码。所以我尝试使用 returnStream<DynamicTest>删除这些样板代码:


@TestFactory

Stream<DynamicTest> dynamicTest2() {


    return Stream.of(

                "1,1,2", 

                "2,2,4", 

                "3,3,6",

                "4,4,8" ,

                "5,5,10" , 

                "6,6,12" ,

                "7,7,14", 

                "10,90,100")

                //How to do????????

            .map(data-> DynamicTest.dynamicTest(data, () -> assertEquals(xxx, Math.addExact(yy,zz))));

}

但是如何将字符串格式的测试数据转换为参数并调用 SUT。我环顾DynamicTestAPI 看看是否有什么可以帮助我但找不到任何有用的东西,所以我放弃了.....


所以,我更喜欢参数化测试。更优雅、干净、易读易写。测试用例的可读性更为重要。


查看完整回答
反对 回复 2022-07-14
  • 2 回答
  • 0 关注
  • 192 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号