写在前面,大家好!我是【跨考菌】,一枚跨界的程序猿,专注于后台技术的输出,目标成为
全栈攻城狮
!这博客是对我跨界过程的总结和思考。如果你也对Java
、后端技术
感兴趣,抑或是正在纠结于跨界,都可以关注我的动态,让我们一起学习,一起进步~
我的博客地址为:【跨考菌】的博客
目录
上一篇 Java30天养成计划 || 17 你还不会调试程序吗?看看这篇就会了~ 讲解了IDEA常用的功能。本文开始介绍Junit的相关内容。和【跨考菌】一起加油吧~
1 Junit1.4
1.1 概述
当我们写完了一个类后,总是要执行一下类中的方法,查看是否符合我们的意图,这就是单元测试了。而Junit就是单元测试工具。
导包:导入Junit4或以上版本;
编写一个类:Person,它就是要被测试的类;
编写测试类:PersonTest,给出测试方法,在测试方法上使用@Test注解;
执行测试方法。
测试方法的作用:可以用来在一个类中给出多个测试方法,相当于一个类中有多个main方法的作用!
Person.java:
package cn.itcast;
public class Person {
public void run() {
System.out.println("run");
}
public void eat() {
System.out.println("eat");
}
}
PersonTest.java:
package junit.test;
import org.junit.Test;
import cn.itcast.Person;
public class PersonTest {
@Test
public void testRun () {
Person person = new Person();
person.run();
}
@Test
public void testEat () {
Person person = new Person();
person.eat();
}
}
选中某个测试方法,鼠标右键---->Run as---->Junit Test,即执行测试方法。
@Test注解的作用是指定方法为测试方法,测试方法必须是public、void、无参的!!!
1.2 @Before和@After
如果你需要某个方法在每个测试方法之前先执行,那么你需要写一个方法,然后使用@Before来标记这个方法。例如在testRun()和testEat()方法之前需要创建一个Person对象。
PersonTest.java:
package junit.test;
import org.junit.Before;
import org.junit.Test;
import cn.itcast.Person;
public class PersonTest {
private Person person;
@Before
public void setUp () {
person = new Person();
}
@Test
public void testRun() {
person.run();
}
@Test
public void testEat() {
person.eat();
}
}
@After注解标记的方法会在每个执行方法之后执行
@Before和@After标记的方法必须是public、void、无参。
1.3 @BeforeClass和@AfterClass
@BeforeClass注解标记的方法会在所有测试方法之前执行,只执行一次!它与@Before不同,@Before标记的方法会在每个测试的方法之前都执行,而@BeforeClass标记的方法会在所有测试方法之前执行一次。
@AfterClass会在所有测试方法执行完之后执行!
@BeforeClass和@AfterClass标记的方法必须是public、static、void、无参的。
2 Junit5
2.1 概述
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
这看上去比Junit4 复杂,实际上在导入包时也会复杂一些。
JUnit Platform是在JVM上启动测试框架的基础。
JUnit Jupiter是JUnit5扩展的新的编程模型和扩展模型,用来编写测试用例。Jupiter子项目为在平台上运行Jupiter的测试提供了一个TestEngine (测试引擎)。
JUnit Vintage提供了一个在平台上运行JUnit 3和JUnit 4的TestEngine 。
2.2 和Junit4的区别
导入Junit5的maven依赖:
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.0.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.0.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>4.12.1</version>
<scope>test</scope>
</dependency>
</dependencies>
在test.java目录下创建一个 FistJUnit5Tests 类。代码如下:
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
class FirstJUnit5Tests {
@Test
void myFirstTest() {
assertEquals(2, 1 + 1);
}
}
明显看出和Junit4 还是有些不同的。首先,导入测试测试注解(@Test)和断言方法(assertEquals)的路径不同。其次,不需要手动把测试和测试方法声明为 public 了。
2.3 案例
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertAll;
import org.junit.jupiter.api.*;
class FirstJUnit5Tests {
@BeforeEach
@DisplayName("每条用例开始时执行")
void start(){
}
@AfterEach
@DisplayName("每条用例结束时执行")
void end(){
}
@Test
void myFirstTest() {
assertEquals(2, 1 + 1);
}
@Test
@DisplayName("描述测试用例╯°□°)╯")
void testWithDisplayName() {
}
@Test
@Disabled("这条用例暂时跑不过,忽略!")
void myFailTest(){
assertEquals(1,2);
}
@Test
@DisplayName("运行一组断言")
public void assertAllCase() {
assertAll("groupAssert",
() -> assertEquals(2, 1 + 1),
() -> assertTrue(1 > 0)
);
}
@Test
@DisplayName("依赖注入1")
public void testInfo(final TestInfo testInfo) {
System.out.println(testInfo.getDisplayName());
}
@Test
@DisplayName("依赖注入2")
public void testReporter(final TestReporter testReporter) {
testReporter.publishEntry("name", "Alex");
}
}