单元测试
每个功能开发完,项目上线前都要做单元测试
引入依赖
AssertJ:断言
测试用例
编写测试用例要求:保证测试方法的独立性
当前测试方法不能依赖于别的测试方法,也不依赖于数据库中某条特定数据。
如A方法插入一条数据,B方法对这条数据做了修改,B依赖A的数据,这是不合理的。而过一段时间之后数据可能被删掉,B就无法操作了
保证独立性原因:
单元测试的代码不是一次性的,需要执行多次。开发完功能、功能发生变化(验证变化对整个业务是否产生负面影响)、上线前都要执行。
比如,过一段时间,对一些功能进行了重构,此时需要再做一次单元测试,最好的情况是之前写的方法直接就能运行,而不是再写一套单元测试
保证独立性步骤:
-
初始化数据:执行测试之前,为本次测试单独初始化一份数据
-
执行测试代码:利用数据执行测试代码
-
验证测试结果:用断言的方式,判断指定条件是否成立,成立就继续执行测试方法,不成立就抛异常
// 判断数据是否为空 Assert.assertNotNull(...); // 判断两个数据是否相等 Assert.assertEquals( ..., ...);
-
清理测试数据
常用注解:
有时多个测试方法使用可以使用同一份代码,为了避免重复的代码,我们可以使用如下注解(都是修饰方法的)
@BeforeClass:类初始化(加载)之前执行
@BeforeClass // 在类初始化前执行一次,和类有关,必须是静态方法public static void beforeClass() {System.out.println("beforeClass");}
@AfterClass:类销毁时执行
@AfterClass // 也需要静态方法public static void afterClass() {System.out.println("afterClass");}
@Before:调用任意测试方法之前都会执行一次。虽然效率低,但独立性好
通常将在@Before中初始化的变量声明为成员变量,这样测试方法、@After销毁方法中也可以使用
@After:调用任意测试方法之后都会执行一次
注意:这些注解修饰的方法,通常是用来初始化数据的,不是要执行的测试方法,我们需要执行的是带@Test注解的方法
实例代码
注意:
-
testFindById()和testUpdateScore()执行前都各自初始化了一个数据data,尽管名字都叫data,但实际不是同一份数据,他们使用的data是不同的
-
计算机底层是二进制的,只能表示整数,小数是浮点表示法表示的近似的值,所以很多时候无法准确的比较两个小数是否相等,存在精度丢失问题。
故比较时,可以指定精度,只比较到小数点后第2位
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class SpringBootTests {@Autowiredprivate DiscussPostService discussPostService;// 将在@Before中初始化的变量声明为成员变量,这样测试方法中也可以使用private DiscussPost data;@Before public void before() {System.out.println("before");// 初始化测试数据data = new DiscussPost();data.setUserId(111);data.setTitle("Test Title");data.setContent("Test Content");data.setCreateTime(new Date());discussPostService.addDiscussPost(data);}@Afterpublic void after() {System.out.println("after");// 删除测试数据discussPostService.updateStatus(data.getId(), 2);}@Testpublic void testFindById() {DiscussPost post = discussPostService.findDiscussPostById(data.getId());// 验证测试结果// 判断查询结果是否为空Assert.assertNotNull(post);// 判断 查询结果 和 目标结果 是否相等// 重写对象中equal方法后,可以直接传入两个对象比较是否相等Assert.assertEquals(data.getTitle(), post.getTitle());Assert.assertEquals(data.getContent(), post.getContent());}@Testpublic void testUpdateScore() {// 修改数据int rows = discussPostService.updateScore(data.getId(), 2000.00);Assert.assertEquals(1, rows);// 查询修改后数据DiscussPost post = discussPostService.findDiscussPostById(data.getId());// 2代表数据精度,比较到小数点后两位// 因为计算机底层是二进制的,只能表示整数,小数是浮点表示法表示的近似的值,所以很多时候无法准确的比较两个小数是否相等,存在精度丢失问题Assert.assertEquals(2000.00, post.getScore(), 2);}}
``