【干货】JUnit5快速指南

单元测试是软件开发中必不可少的一环,但是在平常开发中往往因为项目周期紧,工作量大而被选择忽略,这样往往导致软件问题层出不穷。线上出现的不少问题其实在有单元测试的情况下就可以及时发现和处理,因此培养自己在日常开发中写单元测试的能力是很有必要的。无论是对自己的编码能力的提高,还是项目质量的提升,都是大有好处,本文将介绍 Java 单元测试框架 JUnit 5 的基础认识,和使用来编写单元测试。添加相关依赖:在pom.xml文件中添加 JUnit 5 相关组件<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.6.2</version> <scope>test</scope></dependency><dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.4.2</version> <scope>test</scope></dependency>JUnit 5 注解:JUnit 5 的注解与 JUnit 4 有所区别,下表为常用注解注解描述@Test表示方法是测试方法。与JUnit4的@Test注解不同的是,这个注解没有声明任何属性,因为JUnit Jupiter中的测试扩展是基于他们自己的专用注解来操作的。除非被覆盖,否则这些方法可以继承。@ParameterizedTest表示方法是参数化测试。除非被覆盖,否则这些方法可以继承。@RepeatedTest表示方法是用于重复测试的测试模板。除非被覆盖,否则这些方法可以继承。@DisplayName声明测试类或测试方法的自定义显示名称。这个注解不被继承。@BeforeEach表示被注解的方法应在当前类的每个@Test,@RepeatedTest,@ParameterizedTest等方法之前执行; 类似于JUnit 4的@Before。除非被覆盖,否则这些方法可以继承。@AfterEach表示被注解的方法应在当前类的每个@Test,@RepeatedTest,@ParameterizedTest等方法之后执行; 类似于JUnit 4的@After。除非被覆盖,否则这些方法可以继承。@BeforeAll表示被注解的方法应该在当前类的所有@Test,@RepeatedTest,@ParameterizedTest等方法之前执行; 类似于JUnit 4的@BeforeClass。这样的方法可以继承(除非被隐藏或覆盖),并且必须是静态的。@AfterAll表示被注解的方法应该在当前类的所有@Test,@RepeatedTest,@ParameterizedTest等方法之后执行; 并且必须是静态的。@Tag在类或方法级别声明标签,用于过滤测试; 类似于TestNG中的test group或JUnit 4中的Categories。这个注释可以在类级别上继承,但不能在方法级别上继承。@Disabled用于禁用测试类或测试方法; 类似于JUnit4的@Ignore。这个注解不能继承。@ExtendWith用于注册自定义扩展。这个注解可以继承。编写用例——基本的单元测试类和方法:在了解了常用JUnit5 及其注解之后,我们来写一些基本的测试用例:import org.junit.jupiter.api.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;class Junit5StandardTests {private static final Logger LOGGER = LoggerFactory.getLogger(Junit5StandardTests.class);@BeforeAll static void beforeAll() { LOGGER.info("call beforeAll()"); }@BeforeEach void beforeEach() { LOGGER.info("call beforeEach()"); }@Test void succeedingTest() { LOGGER.info("call succeedingTest()"); }@Test void failingTest() { LOGGER.info("call failingTest()"); // fail("a failing test"); }@Test @Disabled("for demonstration purposes") void skippedTest() { LOGGER.info("call skippedTest()"); // not executed }@AfterEach void afterEach() { LOGGER.info("call afterEach()"); }@AfterAll static void afterAll() { LOGGER.info("call afterAll()"); }}编写用例——参数化:使用相同的测试代码,针对不同的测试数据,我们需要参数化。基本用法:@ParameterizedTest@ValueSource(ints = { 1, 2, 3 }) void testWithValueSource(int argument) { assertTrue(argument > 0 && argument < 4);}@MethodSource 允许您引用测试类或外部类的一个或多个工厂方法。此类工厂方法必须返回流、可迭代、迭代器或参数数组。此外,这种工厂方法不能接受任何参数。测试类中的工厂方法必须是静态的。示例代码如下:@ParameterizedTest@MethodSource("stringProvider")void testWithSimpleMethodSource(String argument) { assertNotNull(argument);}public static Set stringProvider() { Random rand = new Random(47); Set<String > intset = new HashSet<>(); for (int i = 0; i < 100; i++) { intset.add(String.valueOf(i)); } intset.add(null); return intset;}如果测试方法声明多个参数,则需要返回一个集合或Arguments实例流。示例代码如下:@ParameterizedTest@MethodSource("stringProvider")void testWithSimpleMethodSource(String argument1) { assertNotNull(argument1);}static Stream<String> stringProvider() { List<String> list = new ArrayList<>(); list.add("foo"); list.add("bar"); Stream<String> stream1 = list.stream(); return stream1;}@CsvSource允许您将参数列表表示为以逗号分隔的值(例如,字符串文字)。示例代码如下:@ParameterizedTest@CsvSource({"foo,1","bar, 2","'baz,qux',3"})void testWithCsvSource(String first,int second){ assertNotNull(first); assertNotEquals(0, second);}JUnit 5 测试套件:通过JUnit5 实现测试套件的功能,需要依赖junit-platform-runner 、junit-jupiter-api和junit-jupiter-engine。junit-platform-runner:用来执行测试用例和测试套件。junit-jupiter-api有注解,通过@Test来写测试用例。junit-jupiter-engine:引擎,在执行测试用例时要用到。maven依赖如下:<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.7.0</version></dependency><dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-runner</artifactId> <version>1.7.0</version></dependency>使用测试套件,示例代码如下:import org.junit.platform.runner.JUnitPlatform; import org.junit.platform.suite.api.SelectClasses; import org.junit.platform.suite.api.SelectPackages; import org.junit.platform.suite.api.SuiteDisplayName; import org.junit.runner.RunWith;@RunWith(JUnitPlatform.class) @SelectClasses({CalcTest.class,CalcTest0326.class}) public class Testsuit {}

_时间课题周一21:00腾讯课堂《敏捷测试从零开始》周六20:00腾讯课堂《测试开发从零开始》java篇微信号 : TestOps知乎:@TestOps云层

(0)

相关推荐

  • Spring Boot 集成 JUnit5,更优雅单元测试!

    为什么使用JUnit5 JUnit4被广泛使用,但是许多场景下使用起来语法较为繁琐,JUnit5中支持lambda表达式,语法简单且代码不冗余. JUnit5易扩展,包容性强,可以接入其他的测试引擎. ...

  • 干货|结合指南和实践,看老年单纯收缩期高血压如何管理

    单纯收缩期高血压(ISH) 随着我国老龄化社会的进展,老年高血压的患病率逐渐增加,且患者具有收缩压增高.脉压增大.心脑血管事件发生风险增加等特点.在老年高血压人群中,单纯收缩期高血压(ISH)占60% ...

  • 培养战略思维能力的三种策略:战略思维快速指南

    发现自己在地球上几英里远,前往一个异国的岛屿,你将在阳光下度过两周快乐的时光.你把所有必要的东西都打包好了:泳衣,防晒霜,你在沙滩上闲逛时,读最喜欢读的书.一切都指向一个轻松,田园诗般的假期. 但是一 ...

  • 家装必备干货-热水器选购指南(电热篇·下)

    上篇说到电热选购需要关注的两个关键点,即加热方式和水箱容量,但这只是满足了我们最基本的洗浴需求.那下篇我们就来聊一下其他几个需要各位关注以便进行综合考量的功能卖点. 三.安全防护 电热水器是靠电加热的 ...

  • Pytorch教程:新手的快速指南

    11分钟阅读 > Image Source: Author Python被确定为数据科学和机器学习的进入语言,部分感谢开源ML库Pytorch. Pytorch的功能强大的深度神经网络建筑工具和 ...

  • 干货 | 帕金森病患者指南

    Russell Byers Charter School的创始人Laurada Byers今年70岁了,她感觉自己的脚似乎不听使唤.大约10年前,Byers留意到自己走路时常掉鞋子,她怀疑这可能不仅仅 ...

  • 5万块钱的装修预算怎么做出来?清包 半包 全包如何选?纯干货 避坑指南

    已经买了几套房了,装修基本上都是自己搞,前几天刚刚领了套房子的钥匙,开始装修了,装修之前需要整理下自己的装修思路,一边装修一边来分享下经验,装修过程中有很多小细节需要注意,避免大家踩坑,文章比较长,我 ...

  • 【洞见干货】快速发现财务异常!

    导言 1.互联网企业要规模,一般企业要利润. 2.一个合同,既有硬件,又有软件还有服务,履约义务如何划分,防止借此调整收入结构. 3.非经常性收益包装成经常性收益.因为有扣非指标,大家更关注扣非后,因 ...

  • 干货|快速扩充单词量的方法竟然是它,你早该知道啦!

    学习构词法的意义是什么呢?没错,就是它可以使我们能够轻松容易的认识更多单词,以一种巧妙的方式扩大词汇量. 英语中的构词法主要有三种,即转化法.合成法和派生法. 01 转化法 在英语中,一个单词由一种词 ...

  • 【干货】快速书写当中如何“停顿”?5种典型技巧总结(图例)

    书法秘笈 125篇原创内容 公众号 内容转自网络,特此鸣谢 在古代草书经典法帖中,停顿.顿挫和休止的类型化有很多,孙过庭<书谱>.怀素<自叙帖>,黄庭坚<诸上座帖> ...