TestNG单元测试实战
TestNG单元测试实战
单元测试是什么
对软件中最小可测试单元进行验证。小到一个方法,大到一个类、一个模块。都可以用单元测试覆盖。
单元测试有必要写吗
现状:
面对日复一日排满的需求,没有时间去写。
再者业务逻辑变化快,对应的单元测试代码也得调整。不愿写。
用postman,接口api也能满足http测试。
写单测好处:
- 避免低级的bug发到开发环境或测试环境。
在线测试分支覆盖不全的情况。
- 提高代码正确性。
判断方法的返回值和预期值是否一致。
- 能简单理清代码逻辑。
阅读单元测试代码能简单快速的了解逻辑。方便后面的同事了解此方法功能。以及怎么使用。
如果不写单测,那我们可能会用postman或swagger-ui来测试某个controller接口。
但很多时候我们需要对service中多个分支,对某个工具类验证代码正确性,这时候还不涉及接口的调用,以及接口不能覆盖全异常分支的情况。此时这种场景就可以用单测来完成。
Junit 和 TestNG对比
Junit和TestNG都是Java测试框架。
看Testng官网介绍: TestNG - Welcome
对比Junit,TestNG优势如下:
注解更全
支持依赖测试
支持测试组
支持多线程测试
TestNG + Spring boot test实战
引入maven配置
<dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.9.10</version><scope>test</scope>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.2.2.RELEASE</version><scope>test</scope>
</dependency>
简单示例:
@SpringBootTest
public class DemoTest extends AbstractTestNGSpringContextTests {@Autowiredprivate IDemoService service;@Autowiredprivate DemoController demoController;@Autowiredprivate PreprocessConfig preprocessConfig;@Autowiredprivate AuthInterceptor interceptor;public MockMvc mockMvc;//测试方法前运行@BeforeMethodpublic void setup(){//通过注册一个或多个controller实例和配置springmvc编程方式来构建一个mockmvc实例。mockMvc = MockMvcBuilders.standaloneSetup(demoController).//添加拦截器addInterceptors(interceptor).//请求数据预处理setControllerAdvice(preprocessConfig).build();}@Testpublic void testDemoList() throws Exception {mockMvc.perform(MockMvcRequestBuilders.get("/demo/list").header("token", "xxxxxx").contentType(MediaType.TEXT_HTML_VALUE).queryParam("ascs", "createDate")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().string(Matchers.notNullValue()));}@Testpublic void testProcessMerge() {int num = service.processMerge(1);Assert.assertEquals(num, 1);}
}
此单元测试类中包含了service和controller测试。其中setup()用于构建MockMvc实例。
MockMvc: 服务器端Spring MVC测试支持的主要入口点。可调用其perform方法来构建请求。
SpringBootTest注解: 此注解表明基于spring boot启动的测试类。
AbstractTestNGSpringContextTests抽象类: 集成了spring测试上下文框架。 此抽象类也实现了ApplicationContextAware接口,spring容器初始化时,会注入spring应用上下文。
日期预处理
如前端传的string需转成实体属性中LocalDateTime格式,则需要对请求参数预处理,可定义一个日期预处理类:
@ControllerAdvice
public class PreprocessConfig{@InitBinderpublic void initBinder(WebDataBinder binder) {binder.registerCustomEditor(LocalDateTime.class, new PropertyEditorSupport() {@Overridepublic void setAsText(String text) throws IllegalArgumentException {if (StringUtils.isNotBlank(text)){this.setValue(LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));} else {this.setValue(null);}}});}
}
ControllerAdvice和InitBinder注解实现全局数据预处理。
事务支持
AbstractTransactionalTestNGSpringContextTests抽象类继承自AbstractTestNGSpringContextTests抽象类,用于加载spring配置,支持事务。
在测试方法上加入@Rollback用于事物回滚处理。
TestNG常用注解
@BeforeSuite:在该套件中所有测试用例执行前运行。
@AfterSuite:在该套件中所有测试用例执行后运行。
@BeforeGroups:调用属于该组的第一个方法前运行。
@AfterGroups:调用属于该组最后一个方法后运行。
@BeforeClass:在调用当前类第一次测试方法前运行。
@AfterClass:当前类所有测试方法结束后运行。
@BeforeMethod:在每个测试方法开始运行前执行。
@AfterMethod:在每个测试方法运行结束后执行。
@Test:表明为测试方法。
执行顺序:@BeforeSuite -> @BeforeClass -> @BeforeGroups -> @BeforeMethod -> @Test -> @AfterMethod -> @AfterGroups -> @AfterClass -> @AfterSuite。
其中Test注解中有如下方法:
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({METHOD, TYPE, CONSTRUCTOR})
public @interface Test {public String[] groups() default {};public String[] dependsOnGroups() default {};public String[] dependsOnMethods() default {};public int threadPoolSize() default 0;public String dataProvider() default "";
}
可以用dependsOnGroups表明依赖的组,dependsOnMethods设置方法依赖,threadPoolSize配置线程数等等。
TestNG单元测试实战相关推荐
- Springboot单元测试mysql_Springboot Mybatis-Plus数据库单元测试实战(三种方式)
单元测试长久以来是热门话题,本文不会讨论需不需要写单测,可以看看参考资料1,我个人认为写好单测应该是每个优秀开发者必备的技能,关于写单测的好处在这里我就不展开讨论了,快速进入本文着重讨论的话题,如何写 ...
- Java接口自动化之TestNG单元测试框架(一)
上一篇Java接口自动化系列文章:Java接口自动化之log4j日志框架,主要介绍log4j日志介绍.日志三大组成部分及日志实战. 以下主要介绍TestNG的简介.@Test注解及其属性. 01 Te ...
- surefire 拉起testng单元测试类的源码流程阅读(二)
这里是基于surefire 2.19.1版本分析的. 还是根据surefire 拉起单元测试执行报错的日志展示的执行过程分析 java.lang.instrument.IllegalClassForm ...
- surefire 拉起testng单元测试类的源码流程阅读(一)
这里分析是基于2.5surefire 版本. 首先拿surefire 拉起单元测试报错日志 分析: Caused by: java.io.IOException: Error while instru ...
- testNG单元测试学习
[demo的项目报以及流程文档放在了资源文件上] 1 TestNG的介绍 1.1 概念: TestNG(Test Next Generation)是一个测试框架,在Junit和NUnit基础上引入新功 ...
- 使用Junit对Spring进行单元测试实战小结
Demo代码: Java代码 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "cla ...
- 一文说尽Golang单元测试实战的那些事儿
导语 | 单元测试,通常是单独测试一个方法.类或函数,让开发者确信自己的代码在按预期运行,为确保代码可以测试且测试易于维护.腾讯后台开发工程师张力结合了公司级漏洞扫描系统洞犀在DevOps上探索的经验 ...
- Lua Busted 单元测试实战
目标 提供比较实用的 Lua Busted 单元测试实例. 环境 Unity 2018.2.5f1 Personal (64bit) IntelliJ IDEA 2018.2.3 (Community ...
- testng单元测试-diagnose依赖compet找不到compet的类
diagnose依赖于compet服务,连接166等配置没问题,但是一直报错: 找不到compet里面使用到的类 修改点: 1.BaseTest.java @ContextConfiguration( ...
最新文章
- 常考数据结构与算法:买卖股票的最好时机
- list 索引 java_如何在Java中保持List索引的固定
- 2009计算机网络考研大题,2009年计算机考研统考真题网络部分分析
- java爬虫-简单爬取网页图片
- 记录一下SpringCloud-Gateway使用lb动态路由遇到的坑
- HTML邮件制作规范
- TML5 App 开发框架收集
- Java单元测试框架 - JUnit
- Python+Flask(2)--通过flask paginate解决列表分页问题
- VSCode添加背景图片
- Kong+Konga配置原理、操作 学习分享
- Z字形变换(Java)
- centos7网卡链路聚合
- C++查缺补漏之异常(续)
- Geckofx偏好设置
- 温氏股份董事长温志芬强烈推荐:《数字化转型方法论》一把解锁数字化转型的秘钥
- HighTec编译器提高编译速度
- 基于应急广播国标协议的IP解析工具
- 开源一个各种USB电缆的测试仪,再也不用担心被只有充电功能的数据线坑了
- 5福最多多少钱_2017年支付宝集齐5福能分多少钱?