Hi I’m Shendi
为什么使用Junit单元测试?Junit的详解
Junit是一个Java语言的单元测试框架。
单元测试是一个对单一实体(类或方法)的测试
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
在我刚接触到Junit时有这样一个问题,进行测试的话可以使用main函数,那为什么要使用junit?
找不到答案,于是后面的开发我都没有使用到单元测试,但用的人还是非常多的,于是今天准备深入了解一下
总结,有以下几点
主要是比较规范和方便吧,main写完测试完后基本上都直接删掉了,而这个不用
Maven的引入就不列出了(SpringBoot都自带导入),这里列出Eclipse直接配置Junit
Eclipse内点击项目,按Alt+Enter(或右键Properties),选择 Java Build Path,选择Libraries,选择Classpath,点击Add Library
Next
Finish即可
接下来就可以非常简单的进行单元测试了
在想要运行的函数上加上 @Test
注解,鼠标点击函数名,右键 RunAs - Junit Test 即可运行
运行后会在Junit选项卡中显示结果
绿勾代表运行正常,这一次将三个函数都直接运行了
如果需要运行单个函数可以用鼠标点击函数名,当输入的光标在函数名上时右键运行即可
如果不行的话可以打开 outline 选项卡,window -> Show Views -> Outline
右侧选中需要运行的函数,右键运行即可
用来断言测试,基本上都是静态函数
例如有一个函数用来处理xxx,我们知道函数返回1是正确结果,于是可以这样写
上面预期和实际不符,条条是红色的,且 Failure Trace 下面显示了错误信息和行数
assert就是一个if的封装,一般使用,可能有问题用if,不应该有问题的时候用assert
Assert还有很多函数,例如判断是否为true或者false,下面列出一些
除了 @Test 注解之外,还有一些其他的注解,如下
注解 | 描述 |
---|---|
@Ignore | 被忽略的测试方法,加上之后,不执行此段代码,与其他注解一起使用 |
@Before | 在每一个标注了 @Test 的函数执行之前执行,(有一个@Test就执行一次) |
@After | 在每一个标注了 @Test 的函数执行之后执行,(有一个@Test就执行一次) |
@BeforeClass | 必须是静态函数,所有测试函数执行之前执行(包括Before),只执行一次 |
@AfterClass | 必须是静态函数,所有测试函数执行之后执行(包括After),只执行一次 |
新建SpringBoot项目时会自带Junit,也可以手动加入依赖
org.springframework.boot spring-boot-starter-test test
项目会有 src/test/java 文件夹供存放测试文件
在测试类上加上以下注解
import org.junit.jupiter.api.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;@RunWith(SpringRunner.class)
@SpringBootTest
class DemoApplicationTests {@Autowired DemoControl dc;@Testpublic void test() {System.out.println(dc.test());}}
@RestController
public class DemoControl {public String test() {return "test";}}
单元测试运行即可看到结果
如果在使用了@Transactional注解,那么在单元测试中的事务默认回滚。需要在方法上添加 @Rollback(value=false) 才会提交事务。
在测试中,处于对数据库的保护考虑,请使用@Rollback(value=true) 显式的回滚
END