【从零开始】springboot单元测试(贰)
1、简单介绍
junit5大致分为三层,其整体架构如下(图片来自网络):
image.png从上图可见,整个JUnit5可以划分成三层:顶层框架(Framework)、中间的引擎(Engine),底层的平台(Platform);
功能如下;
Platform:位于架构的最底层,是JVM上执行单元测试的基础平台,还对接了各种IDE(例如IDEA、eclipse),并且还与引擎层对接,定义了引擎层对接的API;
Jupiter:位于引擎层,支持5版本的编程模型、扩展模型;
Vintage:位于引擎层,用于执行低版本的测试用例;
对比junit4
对比junit4,升级改造了不少东西,从架构,到包、类等,看下官方,比如@Before和@After不再支持,使用@BeforeEach和@AfterEach进行替代,其他的都类似。
image.png
而junit4常用的@RunWith,在junit5中由@ExtendWith替代,并且是在有个性化扩展需要的时候再添加就可以,一般只需要加一个@SpringBootTest就可以哈皮的开启单元测试了。
2、数据回滚
经常会遇到有人问,单元测试时候保存/修改怎么测?这样不是就把数据库的数据改掉了吗?今天我们就来说一个简单的处理,使用注解: @Transactional。对,没看错,就是你在save()方法上加的那个事务注解,junit会将整个事务回滚,示例如下:
@DisplayName("保存学生信息")
@Test
@Transactional
void save(){
Student student = studentService.getByCardNum(RandomUtil.randomInt());
boolean r = studentService.save(student);
Assertions.assertTrue(r);
}
注意看下日志,执行最后会有“Rolled back·······”
image.png
最后看下数据库,依然只有原来测试的一条数据,回滚成功。
image.png
2、 断言Assertions的使用
Assertions是junit5新增的断言,区别于junit4的Asserts,先来总体看下内置方法:
[图片上传失败...(image-862083-1666869116904)]
尝试一下常用的几个assertTrue、assertNotNull、assertEquals、assertArrayEquals,示例代码:
@DisplayName("断言测试")
@SpringBootTest
public class AssertionsTest {
private static int a , b;
private static Integer[] c, d;
@BeforeAll
static void before(){
a = 1;
b = 1;
c = new Integer[]{1, 2, 3};
d = new Integer[]{1, 4, 3};
}
@Test
void assertionsDemo(){
boolean result = a == b;
Assertions.assertTrue(result);
Assertions.assertNotNull(result,"result must be not null");
Assertions.assertEquals(a,b);//这里可用在某些持久层框架添加、修改、删除时返回值为int类型的数据处理条数时
Assertions.assertArrayEquals(c,d,"期望值是:{1,2,3}");
}
}