摘要:中常用的单元测试工具是老牌测试框架了,也是目前引用最广泛的一个框架。可以使用适当的单元测试方式,比如可以提供一个测试接口,利用的热部署功能实现不重启及时修改代码。
什么是单元测试
单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。单元测试的优点
通常来说,程序员每修改一次程序就会进行最少一次单元测试,在编写程序的过程中前后很可能要进行多次单元测试,以证实程序达到软件规格书要求的工作目标,没有程序错误;虽然单元测试不是什么必须的,但也不坏,这牵涉到项目管理的政策决定。
优质的单元测试可以保障开发质量和程序的鲁棒性。在大多数互联网企业中开发工程师在研发过程中都会频繁地执行测试用例,运行失败的单测能帮助我们快速排查和定位问题 使问题在被带到线上之前完成修复。正如软件工程界的一条金科玉律----越早发现的缺陷,其修复成本越低。一流的测试能发现未发生的故障;二流的测试能快速定位故障的发生点;三流的测试则疲于奔命,一直跟在故障后面进行功能回归。JAVA中常用的单元测试工具 JUnit/JUnit5
https://junit.org/junit5/
junit是老牌测试框架了,也是目前引用最广泛的一个框架。当前已经更新到Junit5,功能更强大。
class StandardTests { @BeforeAll static void initAll() { } @BeforeEach void init() { } @Test void succeedingTest() { } @Test void failingTest() { fail("a failing test"); } @Test @Disabled("for demonstration purposes") void skippedTest() { // not executed } @Test void abortedTest() { assumeTrue("abc".contains("Z")); fail("test should have been aborted"); } @AfterEach void tearDown() { } @AfterAll static void tearDownAll() { } }assertj
https://assertj.github.io/doc/
一个功能强悍的断言工具,支持各种断言方式
// entry point for all assertThat methods and utility methods (e.g. entry) import static org.assertj.core.api.Assertions.*; // basic assertions assertThat(frodo.getName()).isEqualTo("Frodo"); assertThat(frodo).isNotEqualTo(sauron); // chaining string specific assertions assertThat(frodo.getName()).startsWith("Fro") .endsWith("do") .isEqualToIgnoringCase("frodo"); // collection specific assertions (there are plenty more) // in the examples below fellowshipOfTheRing is a ListMockitoassertThat(fellowshipOfTheRing).hasSize(9) .contains(frodo, sam) .doesNotContain(sauron); // as() is used to describe the test and will be shown before the error message assertThat(frodo.getAge()).as("check %s"s age", frodo.getName()).isEqualTo(33); // Java 8 exception assertion, standard style ... assertThatThrownBy(() -> { throw new Exception("boom!"); }).hasMessage("boom!"); // ... or BDD style Throwable thrown = catchThrowable(() -> { throw new Exception("boom!"); }); assertThat(thrown).hasMessageContaining("boom"); // using the "extracting" feature to check fellowshipOfTheRing character"s names (Java 7) assertThat(fellowshipOfTheRing).extracting("name") .contains("Boromir", "Gandalf", "Frodo", "Legolas") // same thing using a Java 8 method reference assertThat(fellowshipOfTheRing).extracting(TolkienCharacter::getName) .doesNotContain("Sauron", "Elrond"); // extracting multiple values at once grouped in tuples (Java 7) assertThat(fellowshipOfTheRing).extracting("name", "age", "race.name") .contains(tuple("Boromir", 37, "Man"), tuple("Sam", 38, "Hobbit"), tuple("Legolas", 1000, "Elf")); // filtering a collection before asserting in Java 7 ... assertThat(fellowshipOfTheRing).filteredOn("race", HOBBIT) .containsOnly(sam, frodo, pippin, merry); // ... or in Java 8 assertThat(fellowshipOfTheRing).filteredOn(character -> character.getName().contains("o")) .containsOnly(aragorn, frodo, legolas, boromir); // combining filtering and extraction (yes we can) assertThat(fellowshipOfTheRing).filteredOn(character -> character.getName().contains("o")) .containsOnly(aragorn, frodo, legolas, boromir) .extracting(character -> character.getRace().getName()) .contains("Hobbit", "Elf", "Man"); // and many more assertions: iterable, stream, array, map, dates (java 7 and 8), path, file, numbers, predicate, optional ...
https://site.mockito.org/
一个单元测试中的Mock工具,可以很灵活的创建对象,配合单元测试。
// You can mock concrete classes and interfaces TrainSeats seats = mock(TrainSeats.class); // stubbing appears before the actual execution when(seats.book(Seat.near(WINDOW).in(FIRST_CLASS))).thenReturn(BOOKED); // the following prints "BOOKED" System.out.println(seats.book(Seat.near(WINDOW).in(FIRST_CLASS))); // the following prints "null" because // .book(Seat.near(AISLE).in(FIRST_CLASS))) was not stubbed System.out.println(seats.book(Seat.near(AISLE).in(FIRST_CLASS))); // the following verification passes because // .book(Seat.near(WINDOW).in(FIRST_CLASS)) has been invoked verify(seats).book(Seat.near(WINDOW).in(FIRST_CLASS)); // the following verification fails because // .book(Seat.in(SECOND_CLASS)) has not been invoked verify(seats).book(Seat.in(SECOND_CLASS));其他
对于业务代码,有时单元测试并不方便,因为每次启动成本过高。可以使用适当的单元测试方式,比如可以提供一个测试接口,利用IDE的热部署功能实现不重启及时修改代码。
但是对于非业务性代码,进行单元测试时非常有必要的,可以更早的发现代码中的问题,同时也可以检验程序的解耦性。
良好的代码设计在单元测试时会更方便,反之紧耦合的设计会给单元测试带来很大的困扰。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77861.html
摘要:三使用介绍通过代码创建通过注解四常用方法验证方法没有被调用验证方法被调用了次方法至少被调用次方法最多被调用次备注假如你无法给你程序写单元测试,那么意味着你的程序结构有问题,需要调整或重构。 Java单元测试入门 什么是单元测试 定义:单元测试是对软件或程序的基本(最小)组成单元的测试对象:方法、类特点:showImg(https://segmentfault.com/img/bVbcR...
摘要:单元测试框架作为的标准库,是其他单元测试框架的基础。可以和和配合使用编写单元测试。官网地址单元测试覆盖率工具单元测试中还需要用到代码覆盖率工具。代码覆盖率统计工具用来发现没有被测试覆盖的代码,完善单元测试的覆盖率。 在应用程序中,单元是具有一个或多个输入和单个输出的软件中最小可测试部分。单元...
摘要:在年年初,公司通过调查名开发者来了解开发者的生态状态,最近,调查结果终于整理完毕,以下是得出的结果。注报告会分多成多个部分,此为第一部分。 在2018年年初,jetbrains公司通过调查6000名开发者来了解开发者的生态状态,最近,调查结果终于整理完毕,以下是得出的结果。一、 日常工作1.1)流行语言:今年,使用最受欢迎、最常用与最有前途的语言相较去年没有变化,最受欢迎的语言是...
摘要:在年年初,公司通过调查名开发者来了解开发者的生态状态,最近,调查结果终于整理完毕,以下是得出的结果。注报告会分多成多个部分,此为第一部分。 在2018年年初,jetbrains公司通过调查6000名开发者来了解开发者的生态状态,最近,调查结果终于整理完毕,以下是得出的结果。一、 日常工作1.1)流行语言:今年,使用最受欢迎、最常用与最有前途的语言相较去年没有变化,最受欢迎的语言是...
阅读 2937·2023-04-25 17:46
阅读 3560·2021-11-25 09:43
阅读 1045·2021-11-18 10:02
阅读 3026·2021-10-14 09:43
阅读 2731·2021-10-13 09:40
阅读 1508·2021-09-28 09:35
阅读 2143·2019-08-30 15:52
阅读 3120·2019-08-30 14:06