junit5参数化
一、前言
在我们做接口或者是app自动化的时候,有一个比较常见的场景就是测试流程一致,入参不同。而junit5也提供了很好的解决方案。
二、依赖的加入
maven方式,使用junit5参数化需要导入junit-jupiter-params库
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.5.2</version> <scope>test</scope> </dependency>
三、参数源
参数源 | 说明 |
@ValueSource | |
@EnumSource | |
@MethodSource | |
@CsvSource | |
@CsvFileSource | |
@ArgumentsSource |
四、案例
参数化测试可以使用不同的参数多次运行测试。它们的声明就像常规@Test方法一样,但使用 @ParameterizedTest注释代替。此外,您必须至少声明一个源,该源将为每次调用提供参数,然后在测试方法中使用这些参数
1、@ParameterizedTest+@ValueSource参数化
@ValueSource是最简单的来源之一。它允许您指定单个文字值数组,并且只能用于为每个参数化测试调用提供一个参数
支持以下类型的文字值@ValueSource。
- short
- byte
- int
- long
- float
- double
- char
- boolean
- java.lang.String
- java.lang.Class
@ParameterizedTest @ValueSource(ints = {1, 2, 3}) void testWithValueSource(int argument) { assertTrue(argument > 0 && argument < 4); }
测试结果:
2、@ParameterizedTest+@CsvSource参数化
@ParameterizedTest @CsvSource({ "apple, 1", "banana, 2", "'lemon, lime', 0xF1" }) void testWithCsvSource(String fruit, int rank) { assertNotNull(fruit); assertNotEquals(0, rank); }
测试结果:
3、@ParameterizedTest+@CsvFileSource参数化
Junit5提供了@CsvFileSourc注解来实现csv数据格式的数据驱动,可以传递csv文件路径来读取数据,写法如下:
- csv数据文件:
Country, reference
Sweden, 1
Poland, 2
"United States of America", 3
- 示例代码
@ParameterizedTest @CsvFileSource(resources = "/two-column.csv", numLinesToSkip = 1) void testWithCsvFileSource(String country, int reference) { assertNotNull(country); assertNotEquals(0, reference); }
测试结果:
注意:使用CsvFileSource时,上面的文件一定要增加给numLinesToSkip(默认为0)赋值为1,不然会把Country, reference也参数化进去
4、@ParameterizedTest+@EnumSource参数化
@ParameterizedTest @EnumSource(ChronoUnit.class) void testWithEnumSource(TemporalUnit unit) { assertNotNull(unit); }
测试结果:
5、@ParameterizedTest+@ArgumentsSource参数化
@ArgumentsSource可用于指定自定义的、可重用的ArgumentsProvider. 请注意,ArgumentsProvider必须将的实现声明为顶级类或static嵌套类
@ParameterizedTest @ArgumentsSource(MyArgumentsProvider.class) void testWithArgumentsSource(String argument) { assertNotNull(argument); } @Nested public static class MyArgumentsProvider implements ArgumentsProvider { @Override public Stream<? extends Arguments> provideArguments(ExtensionContext context) { return Stream.of("apple", "banana").map(Arguments::of); } }
测试结果:
6、@ParameterizedTest+@MethodSource参数化
- 显式提供工厂方法名称
@ParameterizedTest @MethodSource("stringProvider") void testWithExplicitLocalMethodSource(String argument) { assertNotNull(argument); } static Stream<String> stringProvider() { return Stream.of("apple", "banana"); }
测试结果:
- 与当前方法同名的工厂方法
@ParameterizedTest @MethodSource void testWithDefaultLocalMethodSource(String argument) { assertNotNull(argument); } static Stream<String> testWithDefaultLocalMethodSource() { return Stream.of("apple", "banana", "orange"); }
测试结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)