当前位置:网站首页>单元测试效率优化:为什么要对程序进行测试?测试有什么好处?
单元测试效率优化:为什么要对程序进行测试?测试有什么好处?
2022-06-30 12:53:00 【软件测试小仙女】
单元测试(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>
通过以上优化,可以大大缩短我们单测的时间,提高我们开发效率。
最后:
可以到我的个人号:atstudy-js,可以免费领取一份10G软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!其中包括了有基础知识、Linux必备、Mysql数据库、抓包工具、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试等。
这些测试资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
边栏推荐
- 发生QQ大规模盗号事件,暴露出什么网络安全问题?
- 排查问题的方法论(适用于任何多方合作中产生的问题排查)
- Basic syntax of unity script (1) - common operations of game objects
- Unity animator parameter
- 产品经理专业知识50篇(七)-如何建立一套完整的用户成长体系?
- 常用的ui组件
- The independent station is Web3.0. The national "14th five year plan" requires enterprises to build digital websites!
- Postman génère automatiquement des fragments de code Curl
- MySQL queries the data within the radius according to the longitude and latitude, and draws a circle to query the database
- Derivation of Park transformation formula for motor control
猜你喜欢

There is no utf8 option for creating tables in Navicat database.

深度长文探讨Join运算的简化和提速

华为帐号多端协同,打造美好互联生活

Apache Doris Compaction优化百科全书
![[recruitment (Guangzhou)] Chenggong Yi (Guangzhou) Net core middle and Senior Development Engineer](/img/d8/a367c26b51d9dbaf53bf4fe2a13917.png)
[recruitment (Guangzhou)] Chenggong Yi (Guangzhou) Net core middle and Senior Development Engineer

一文讲清楚什么是类型化数组、ArrayBuffer、TypedArray、DataView等概念

【刷题篇】爱吃香蕉的珂珂

Waving flags and shouting for basic language

【刷题篇】避免洪水泛滥

Apache Doris Compaction優化百科全書
随机推荐
排查问题的方法论(适用于任何多方合作中产生的问题排查)
Common UI components
Matlab tips (22) matrix analysis -- stepwise regression
Motor control Clarke( α/β) Derivation of equal amplitude transformation
顺应媒体融合趋势,中科闻歌携手美摄打造数智媒宣
常用的ui组件
QT read / write excel--qxlsx worksheet display / hide status setting 4
[deep anatomy of C language] storage principle of float variable in memory & comparison between pointer variable and "zero value"
JS method of changing two-dimensional array to one-dimensional array
Ffmpeg miscellaneous
Rk356x u-boot Institute (command section) 3.2 usage of help command
防火墙基础之总部双机热备与分支基础配置
一篇文章读懂关于企业IM的所有知识点
【系统分析师之路】第五章 复盘软件工程(敏捷开发)
优思学院:六西格玛不只是统计!
An interesting thing happened in the project
科普达人丨漫画图解什么是eRDMA?
【C】 In depth understanding of pointers and callback functions (Introduction to simulating qsort)
[Select] resource realization information, news, we media, blog applet (can be drained, open traffic master, with PC background management)
DNS resolution home network access public DNS practice