spring项目单元测试

单元测试

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

引入依赖

image-20240227011929681

AssertJ:断言

测试用例

image-20240227012029084

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

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

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

保证独立性原因:

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

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

保证独立性步骤:

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

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

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

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

常用注解:

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

@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注解的方法

实例代码

注意:

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

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

    故比较时,可以指定精度,只比较到小数点后第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);}}
``

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506417.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发的PersistentStorage和用户首选项(Preferences)区别、应用场景详解

项目场景: 鸿蒙(HarmonyOS)是华为公司推出的一种分布式操作系统。在鸿蒙开发中,PersistentStorage(持久化存储)和用户首选项(Preferences)是两种不同的数据存储方式,它们在应用场景上有一些明显的区别。 问题描述 问题: 现在有点搞不清保存什么信息用 PersistentS…

OJ:链表的中间结点

876. 链表的中间结点 - 力扣(LeetCode) 思路 思路:首先最容易想到的思路是什么呢,就是先遍历一遍链表,用一个值count来记录链表的长度,然后我们运用除法,/2,结果是几,就…

C/C++工程师面试题(数据库篇)

索引的优缺点 索引是一种支持快速查找特定行的数据结构,如果没有索引,就需要遍历整个表进行查找。用于提高数据检索的速度和效率。 好处: 提高检索速度: 索引可以加快数据的检索速度,因为它们允许数据库系统直接定位到…

一个网站是怎么开发出来并上线让你可以访问到全流程介绍

一个网站是怎么开发出来并上线让你可以访问到全流程介绍 之前和公司一些前端开发的朋友聊天,问他们:你们平时是怎么发布包的,答曰:不知道! 我很震惊,又问了身边一些做开发的同事朋友,居然很多人…

USLE模型-C因子的计算

首先得到FVC,并用掩膜提取研究区 在栅格计算器中,按下面公式计算C: Con(“qy”0,1,Con(“qy”>0.783,1,0.6509-0.3436 * Log10(100 * “qy”))) 最后导出为TIFF保存

maven 包管理平台-05-multi module 多模块

拓展阅读 maven 包管理平台-01-maven 入门介绍 Maven、Gradle、Ant、Ivy、Bazel 和 SBT 的详细对比表格 maven 包管理平台-02-windows 安装配置 mac 安装配置 maven 包管理平台-03-maven project maven 项目的创建入门 maven 包管理平台-04-maven archetype 项目原型 ma…

云服务器搭建Tianji启用网站分析

前言 Tianji 是一款 All-in-One Insight Hub,它集成了 网站分析(Umami) 在线时间监测(Kuma) 服务器监控 三大功能 (还有的在开发) 项目 GitHub:https://github.com/msgbyte/tianji 项目官网:https://tianji.msgbyte.com/ 为啥叫 Tianji&…

Redis学习------实战篇----2024/02/29----缓存穿透,雪崩,击穿

1.缓存穿透 Overridepublic Result queryById(Long id) {//1.从redis中查询缓存String key CACHE_SHOP_KEY id;String shopJson stringRedisTemplate.opsForValue().get(key);//2.判断是否存在//3.存在则直接返回if (StrUtil.isNotBlank(shopJson)){Shop shop JSONUtil.toB…

面试准备:排序算法大汇总 C++

排序算法总结 直接插入排序 取出未排序部分的第一个元素&#xff0c;与已排序的部分从后往前比较&#xff0c;找到合适的位置。将大于它的已排序的元素向后移动&#xff0c;将该元素插入到合适的位置。 //1. 直接插入排序 void InsertionSort(vector<int>& nums){f…

加密与安全_深入了解哈希算法

文章目录 Pre概述哈希碰撞常用的哈希算法Codejava.security.MessageDigestMD5SHA-1SHA-256MessageDigest支持算法 哈希算法的用途彩虹表攻击基本原理攻击过程 防御彩虹表攻击基本原理用途 小结 Pre PKI - 01 散列(Hash)函数 概述 哈希算法&#xff08;Hash&#xff09;又称摘…

9.8分割等和子集(LC416-M)

算法&#xff1a; 可以转换为背包问题&#xff1a; 一个商品如果可以重复多次放入是完全背包&#xff0c;而只能放入一次是01背包&#xff0c;写法还是不一样的。 要明确本题中我们要使用的是01背包&#xff0c;因为元素我们只能用一次。 只有确定了如下四点&#xff0c;才能…

数字化导师坚鹏:证券公司数字化运营三步曲之认知、行动、结果

证券公司数字化运营三步曲之认知、行动、结果 课程背景&#xff1a; 很多证券公司都在开展数字化运营工作&#xff0c;目前存在以下问题急需解决&#xff1a; 不清楚证券公司数字化运营包括哪些关键工作&#xff1f; 不清楚证券公司数字化运营工作的核心方法论&#xff1f…