测试是软件开发中不可或缺的一环。在测试金字塔中,单元测试是基于最下面的一层,成本最低,响应速度最快。
SpringBoot 提供了许多实用工具和注解来帮助测试应用程序,主要包括以下两个模块。
- spring-boot-test: 支持测试的核心内容。
- spring-boot-test-autoconfigure:支持测试的自动化配置。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
只要引入spring-boot-starter-test的依赖 就能使用这些SpringBoot的测试模块,同时还包含如下这些库:
- Junit: Java应用程序单元测试标准类库。
- Spring Test & Spring Boot Test: Spring Boot 应用程序功能集成化测试支持。
- AssertJ: 一个轻量级断言类库。
- Hamcrest: 一个对象匹配器类库。
- Mockito: 一个java Mock测试框架。
- JSONassert: 一个用于JSON的断言库。
- JsonPath: 一个Json操作类库。
创建测试类和测试方法
要让一个普通类变成一个单元测试类,需要如下两步操作:
- 在类名上加
@SpringBootTest和@RunWith(SpringRunner.class)两个注解即可。 - 在测试方法上加上
@Test注解。
使用IDEA可以使用快捷键ctrl + shift + t 或者选中当前类名 使用快捷键alt + enter ,向下选择Create Test 即可进入测试类的快捷创建中。
代码示例:
import com.jls.domain.Learn;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.hamcrest.CoreMatchers.*;
@RunWith(SpringRunner.class)
@SpringBootTest
public class LearnServiceTest {
@Autowired
private LearnService learnService;
@Test
public void getLearn(){
Learn learn = learnService.selectByKey(1001L);
Assert.assertThat(learn.getAuthor(),is("蒋老湿"));
}
}
Junit 基本注解介绍
@BeforeClass: 在所有测试方法执行前执行一次,一般在其中写上整体初始化的代码。@AfterClass: 在所有测试方法后执行一次,一般在其中写上销毁和释放资源的代码。@Before: 在每个方法测试前执行,一般用来初始化方法(比如我们在测试别的方法时,类中与其他测试方法共享的值已经被改变,为了保证测试结果的有效性,我们会在@Before注解的方法中重置数据)@After: 在每个测试方法执行后,在方法执行完成后要做的事情。@Test(timeout = 1000): 测试方法执行超过1000毫秒后算超时,测试将失败。@Test(expected = Exception.class): 测试方法期望得到的异常类,如果方法执行没有抛出指定的异常,则测试失败。@Ignore("not ready yet"): 执行测试时将忽略掉此方法,如果用于修饰类,则忽略整个类。@Test: 编写一般测试用例用。@RunWith: 在 Junit 中有很多个 Runner,他们负责调用你的测试代码,每一个 Runner 都有各自的特殊功能,可以根据需要选择不同的 Runner 来运行你的测试代码。如果只是简单的做普通 Java 测试,省略 @RunWith 注解。@FixMethodOrder(MethodSorters.JVM): 保留测试方法的执行顺序为JVM返回的顺序。每次测试的执行顺序有可能会所不同。@FixMethodOrder(MethodSorters.NAME_ASCENDING): 根据测试方法的方法名排序,按照词典排序规则(ASC,从小到大,递增)。
一个单元测试类执行顺序为:
@BeforeClass -> @Before -> @Test -> @After -> @AfterClass
每一个测试方法的调用顺序为:
@Before -> @Test -> @After
maven对单元测试的支持
Maven在执行特定生命周期构建的时候,会通过其自带的插件maven-surefire-plugin来执行JUnit或者TestNG的测试用例。
在默认情况下,maven-surefire-plugin会自动执行测试源码路径(默认为src/test/java/)下所有符合一组命名规范的测试类。这组模式规则为:
- */Test.java:任何子目录下所有命名以Test开关的Java类。
- */Test.java:任何子目录下所有命名以Test结尾的Java类。
- */TestCase.java:任何子目录下所有命名以TestCase结尾的Java类。
Assert断言常用方法
assertEquals("message",A,B): 判断对象A和B是否相等,这个判断比较时调用了equals()方法。assertSame("message",A,B): 判断对象A和B是否相同,使用的是==操作符。assertTure("message",A): 判断A条件是否为真。assertFalse("message",A): 判断A条件是否不为真。assertNotNull("message",A): 判断A对象是否不为nullassertArrayEquals("message",A,B): 判断A数组与B数组是否相等。
点关注,不迷路
文章每周持续更新,可以微信搜索「 十分钟学编程 」第一时间阅读和催更,如果这个文章写得还不错,觉得有点东西的话
~求点赞👍 求关注❤️ 求分享❤️
各位的支持和认可,就是我创作的最大动力,我们下篇文章见!