spring项目单元测试

单元测试

每个功能开发完,项目上线前都要做单元测试

引入依赖

AssertJ:断言

测试用例

编写测试用例要求:保证测试方法的独立性

当前测试方法不能依赖于别的测试方法,也不依赖于数据库中某条特定数据。

如A方法插入一条数据,B方法对这条数据做了修改,B依赖A的数据,这是不合理的。而过一段时间之后数据可能被删掉,B就无法操作了

保证独立性原因:

单元测试的代码不是一次性的,需要执行多次。开发完功能、功能发生变化(验证变化对整个业务是否产生负面影响)、上线前都要执行。

比如,过一段时间,对一些功能进行了重构,此时需要再做一次单元测试,最好的情况是之前写的方法直接就能运行,而不是再写一套单元测试

保证独立性步骤:

  1. 初始化数据:执行测试之前,为本次测试单独初始化一份数据

  2. 执行测试代码:利用数据执行测试代码

  3. 验证测试结果:用断言的方式,判断指定条件是否成立,成立就继续执行测试方法,不成立就抛异常

    java 复制代码
    // 判断数据是否为空
    Assert.assertNotNull(...);
    // 判断两个数据是否相等
    Assert.assertEquals( ..., ...);
  4. 清理测试数据

常用注解:

有时多个测试方法使用可以使用同一份代码,为了避免重复的代码,我们可以使用如下注解(都是修饰方法的)

@BeforeClass:类初始化(加载)之前执行

java 复制代码
    @BeforeClass // 在类初始化前执行一次,和类有关,必须是静态方法
    public static void beforeClass() {
        System.out.println("beforeClass");
    }

@AfterClass:类销毁时执行

java 复制代码
    @AfterClass // 也需要静态方法
    public static void afterClass() {
        System.out.println("afterClass");
    }

@Before:调用任意测试方法之前都会执行一次。虽然效率低,但独立性好

通常将在@Before中初始化的变量声明为成员变量,这样测试方法、@After销毁方法中也可以使用

@After:调用任意测试方法之后都会执行一次

注意这些注解修饰的方法 ,通常是用来初始化数据的,不是要执行的测试方法,我们需要执行的是带@Test注解的方法

实例代码

注意:

  1. testFindById()和testUpdateScore()执行前都各自初始化了一个数据data,尽管名字都叫data,但实际不是同一份数据,他们使用的data是不同的

  2. 计算机底层是二进制的,只能表示整数,小数是浮点表示法表示的近似的值,所以很多时候无法准确的比较两个小数是否相等,存在精度丢失问题。

    故比较时,可以指定精度,只比较到小数点后第2位

java 复制代码
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class SpringBootTests {
    
    @Autowired
    private 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);
    }

    @After
    public void after() {
        System.out.println("after");

        // 删除测试数据
        discussPostService.updateStatus(data.getId(), 2);
    }

    @Test
    public void testFindById() {
        DiscussPost post = discussPostService.findDiscussPostById(data.getId());
        // 验证测试结果
        // 判断查询结果是否为空
        Assert.assertNotNull(post);
        // 判断 查询结果 和 目标结果 是否相等
        // 重写对象中equal方法后,可以直接传入两个对象比较是否相等
        Assert.assertEquals(data.getTitle(), post.getTitle());
        Assert.assertEquals(data.getContent(), post.getContent());
    }

    @Test
    public 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);
    }

}
``
相关推荐
hong_zc1 小时前
算法【Java】—— 二叉树的深搜
java·算法
进击的女IT2 小时前
SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
java·spring boot·后端
Miqiuha2 小时前
lock_guard和unique_lock学习总结
java·数据库·学习
杨半仙儿还未成仙儿3 小时前
Spring框架:Spring Core、Spring AOP、Spring MVC、Spring Boot、Spring Cloud等组件的基本原理及使用
spring boot·spring·mvc
一 乐3 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
数云界3 小时前
如何在 DAX 中计算多个周期的移动平均线
java·服务器·前端
阑梦清川3 小时前
Java继承、final/protected说明、super/this辨析
java·开发语言
快乐就好ya5 小时前
Java多线程
java·开发语言
IT学长编程5 小时前
计算机毕业设计 二手图书交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·二手图书交易系统
CS_GaoMing5 小时前
Centos7 JDK 多版本管理与 Maven 构建问题和注意!
java·开发语言·maven·centos7·java多版本