什么是单测
单元测试(unit test)是指程序员对代码中的最小运行单元进行正确性检验的测试。
为什么要写单测
保证代码运行符合预期,将代码中的问题提早暴露出来,减少代码bug,提高代码质量。
不写单测可以吗
可以,但是会不专业且不能保证代码质量。
单元测试的要求
针对每行代码都要有单元测试
包括if else 里的逻辑,包括catch里的逻辑
有很多人只写一个条件的单测,导致有一些代码运行不到,可能会有漏测的情况。
针对每个业务场景写
包括异常合法的场景、不合法的场景,成功的场景、失败的场景
有很多人只写正常逻辑的单测,这明显不合法,毕竟任何测试的目的测出问题,所以一定要写异常逻辑的单测。
单元测试的步骤
1、Setup,初始化,准备数据等
初始化环境和数据
2、Execute,调用要测试的方法、函数
组装并执行测试方法
3、Verify,验证结果是否符合预期
将结果进行验证,这里一定要Verify,不要System.out.println()结果。
Verify是一个验证过程,这个会影响CI的执行,如果验证不通过理论上是不能上线的。
4、Teardown,重置状态
单测的数据不能产生其他影响,以免干扰到其他测试,所以测试结束后一定要重置状态。
一般都是将数据做隔离,以免减少数据的干扰。
单元测试的规范
- 测试类与实际类在相同包下,只是测试类是在测试包下
test/com/itliwei/XXX
- 测试类名称为实际类名称+Test
如:UserTest,LoginTest
- 测试类方法为test+实际类方法+预期情况
如:testLogin_Success,testLogin_Failed都要测
单元测试的技术
IDEA自动生成
- 安装junitgenerator-v2插件,然后重启IDEA
- 设置junit4模板
基本不用调整,可以根据自己的规范,添加一些类注释,修改一下样式。
- 设置文件生成路径 ${SOURCEPATH}/../../test/java/${PACKAGE}/${FILENAME}
Mock技术
Mock是一种模拟行为,而不是真实的做相关操作。 对那些不容易构建的对象用一个虚拟对象来代替测试的方法就叫mock测试。以此来提高单测的"单一"特性。
Mock一般用于:
复杂的业务系统
外部服务调用
Mock的优点:
团队可以并行工作
为无法访问的资源编写测试
系统进行隔离
Mockito
Mockito 是一个基于MIT协议的开源java测试框架。 Mockito区别于其他模拟框架的地方主要是允许开发者在没有建立“预期”时验证被测系统的行为。对mock对象的一个批评是测试代码与被测系统高度耦合,由于Mockito试图通过移除“期望规范”来去除expect-run-verify模式(期望--运行--验证模式),因此使耦合度降低到最低。
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <scope>test</scope> </dependency>
需要注意的语句:
Mockito.when(A).thenReturn(B);
更多复杂的用法,具体的使用还是有一些语法学习的。
需要注意的注解:
说明:该注解跟@Autowired类似,注入一个服务。
说明:注入一个服务,该服务会是“假对象”,并不会真正执行。
数据库H2
H2数据库是一个开源的关系型数据库。H2是一个采用java语言编写的嵌入式数据库引擎,只是一个类库(即只有一个 jar 文件),可以直接嵌入到应用项目中,不受平台的限制。
之所以需要H2数据库,主要是为了与其他数据库无任何干扰,从而保证测试的可靠性。
引入:
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency>
配置:
spring.datasource.platform=h2 #表明使用的数据库平台是h2 spring.datasource.schema=classpath:db/schema.sql #数据Schema路径 spring.datasource.data=classspath:db/data.sql #原始数据 spring.datasource.url=jdbc:h2:./data/test;AUTO_SERVER=TRUE spring.datasource.username= spring.datasource.password= spring.datasource.driverClassName=org.h2.Driver
在Junit运行之前,可以先初始化这个数据库。使用方式和MySQL一样。
内嵌Redis
很多应用中会使用到Redis。而单测的时候如果把数据写入Redis或者读取Redis的数据,可能会造成一些脏数据,从而影响单测的结果。 所以我们需要使用内嵌Redis。
<dependency> <groupId>com.github.kstyrc</groupId> <artifactId>embedded-redis</artifactId> <version>0.6</version> </dependency>
一般我们在写单元测试的时候,会在一个测试类中写很多的测试方法。那么我们一般会选择在@Before方法中启动RedisServer,在@After方法中进行close。 启动与关闭:
redisServer = new RedisServer(6379); redisServer.start(); // do something redisServer.stop();
单元测试的问题
1.加载慢的问题
原因分析:
首先每一次单测都需要重新加载数据,跑完一次程序就结束了,所以每次测试方法时都要重新加载数据。
2.分库分表的问题
需要对分库分表的数据查询做单独处理。
到此这篇单元测试,你真的会吗_单元测试有用吗的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/te-unit/8161.html