当前位置: 首页 > news >正文

单元测试优化:为什么要对程序进行测试?测试有什么好处?

单元测试(Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。 程序单元是应用的最小可测试部件。简单来说,就是测试数据的稳定性是否达到程序的预期。

我们日常开发时可能在不经意间写错,如果等到最后阶段去检验项目成果时,发现有错误,这时候我们很难找到Bug的源头在哪里。我们都知道,有可能一处出错会导致步步错的情况。

测试就在我们的上述说法中,显得尤为重要,当我们做完项目的一个小模块,先去测试一下这个小模块是否正确或达到预期,如果错误或者没有达到预期就需要反复修改,直到正确或达到预期,也就是使用了单元测试。

单元测试的编码规范一般涉及到以下内容:

类名: 定义测试类,类名是由被测试类名Test构成。例如:CalculatorTest;

包名:定义的测试类需要放在xxx.xxx.xxx.test包中。例如:package com.autodrive.test;

方法名: 测试方法的方法名有两种定义方式test测试方法和测试方法。例如:testCheck和check;

返回值: 因为我们的方法只是在类中测试,可以独立运行,所以不需要处理任何返回值,所以这里使用void。例如:public void check();

参数列表: 因为我们的方法是用来测试的,至于参数列表的传入是没有必要的。我们在测试的时候自行传入需要的参数测试即可。所以在此参数列表为空。例如:例如:public void check();

@Test注解: 测试是需要运行来完成的。如果我们只有一个main方法,显然在结构上还是需要我们去注释掉测试过的。解决此问题这里我们需要在测试方法上方加@Test注解来完成测试,只要是加该注解的方法,可以单独运行此方法来完成测试。

IDEA快捷导入Junit4、5: 使用IDEA的小伙伴,你们的福音来了。我们可以先创建测试类和方法,然后在测试方法上方加入@Test注解,此时IDEA显示的@Test注解是飘红的,这时候我们使用Alt + Enter组合键来打开导入Junit单元测试列表,然后再选择Junit4或者Junit5确定。

在SpringBoot往往存在单元测试用到如下的注解与写法:

@RunWith(SpringRunner.class)

@SpringBootTest(classes = Application.class)

@Transactional

@Rollback(true) // 事务自动回滚,默认是true。可以不写

public class NoticeServiceTest {

@Autowired

private NoticeService noticeService;

@Test

public void sayHello() {

helloService.sayHello("zhangsan");

}

}

在上面这个例子中,@SpringBootTest启动了SpringBoot环境,扫描应用程序的spring配置,并构建完整的Spring Context,其classes = Application.class启动了整个项目。通过@SpringBootTest我们可以指定启动类,或者给@SpringBootTest的参数webEnvironment赋值为SpringBootTest.WebEnvironment.RANDOM_PORT,这样就会启动web容器,并监听一个随机的端口,同时,为我们自动装配一个TestRestTemplate类型的bean来辅助我们发送测试请求。

@Transactional表明调用数据库并作事务处理;@RunWith(SpringRunner.class)声明在Spring的环境中进行单元测试,这样Spring的相关注解就会被识别并起效,而@Autowired启动了Spring。

当项目使用了@Component注解,在SpringBoot项目启动的时候就会跟着实例化/启动,这个@Component注解的类里有多线程方法,随着启动类中定义的ApplicationStartup类启动了,那么在你执行单元测试的时候,由于多线程任务的影响,就可能对你的数据库造成了数据修改,即使你使用了事务回滚注解。

高效的单元测试应该脱离数据库,以满足快速启动完成测试、支持服务间调用的需求。可以通过如下几点来对上述例子进行优化:

1. 启动Spring会让run->Junit Test的时候程序变慢,这是每次运行单元测试都很慢的原因之一。然后单元测试是只针对某一个类的方法来测,启动Spring很多时候是多余的,所以我们只需要对应的实体类实例就够了。在需要注入bean的时候,我们直接new。

private NoticeService noticeService = new NoticeService();

2. @SpringBootTest是在SpringBoot项目上使用的,它在@SpringBootContextLoader的基础上,配置文件属性的读取,会读取、解析一些项目配置文件,还会连接数据库,然后如果启动类又带有别的启动类、@Component、多线程等,而单元测试很多时候可以避免启动SpringBoot,减少启动所耗费的大量时间,即不使用@SpringBootTest注解。

3. 应当使用断言来判断单元测试结果是否符合预期。

4. @RunWith 在JUnit中有很多个Runner,他们负责调用具体测试代码,每一个Runner都有各自的特殊功能,你要根据需要选择不同的Runner来运行你的测试代码,且一般都是使用SpringRunner.class。如果我们只是简单的做普通Java测试,不涉及Spring Web项目,可以省略@RunWith注解,这样系统会自动使用默认Runner来运行你的代码。

5.单元测试可以通过Mock数据的方式避开对数据库的调用,减少很多数据库连接的时间。Mock是模拟一切操作数据库的步骤,不执行任何SQL,我们直接模拟这句操作数据库的代码执行会是成功的,而且可以模拟任何返回值,主要有两个注解。只要是本地的,自己写的bean,都可以使用@MockBean,它会把所有操作数据库的方法模拟。如果是没有返回值的方法,我们就可以不管。如果是有返回值的方法,我们可以给它返回各自我们需要模拟的值。如果是我们本地,调用别的公司,别的地方给我们写好的接口,不是操作我们自己的数据库,是我们写好入参,别人给我们返回值,我们就用@SpyBean。

Mock所需依赖如下:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

通过以上优化,可以大大缩短我们单测的时间,提高我们开发效率。

 

【整整200集】超超超详细的Python接口自动化测试进阶教程合集,真实模拟企业项目实战

http://www.lryc.cn/news/118885.html

相关文章:

  • 自动装配在Spring Boot中的重要性及实现方式
  • 校对软件在司法系统中的应用:加强刑事文书审查
  • 微信小程序上传图片和文件
  • 拥抱AIGC浪潮,亚信科技将如何把握时代新增量?
  • 【opencv】指定宽或高按比例缩放图片 拼接图片
  • 使用C#加载TOOLBLOCK
  • MPAS-A原理及陆面模式的基本概念
  • 前端技术Html,Css,JavaScript,Vue3
  • 实战项目——多功能电子时钟
  • 【es6】对象解构赋值
  • 腾讯云服务器CVM标准型S6详细介绍_性能测评
  • 时间序列预测任务下探索深度学习参数对模型预测性能的影响
  • React Dva项目 简单引入models中的所有JS文件
  • ROS入门-第 1 章 ROS概述与环境搭建
  • spring之AOP简单介绍
  • 使用Spark ALS模型 + Faiss向量检索实现用户扩量实例
  • Jmeter入门之digest函数 jmeter字符串连接与登录串加密应用
  • uni-app实现图片上传功能
  • golang协程池库tunny实践
  • Android性能优化—数据结构优化
  • STL模板——vector详解
  • 国际顶级学术会议ISSTA召开,中山大学与微众银行联合发表区块链最新研究成果
  • Android开发从0开始(图形与按钮)
  • Git入门到精通——保姆级教程(涵盖GitHub、Gitee、GitLab)
  • 题解 | #J.Permutation and Primes# 2023牛客暑期多校8
  • 用vim打开后中文乱码怎么办
  • 自然语言处理: 第六章Transformer- 现代大模型的基石
  • 01-Hadoop集群部署(普通用户)
  • DC电源模块关于的电路布局设计
  • MATLAB实现免疫优化算法(附上多个完整仿真源码)