测试是软件开发中不可或缺的一环。在测试金字塔中,单元测试是基于最下面的一层,成本最低,响应速度最快。
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数组是否相等。