TestNG单元测试实战

单元测试是什么

对软件中最小可测试单元进行验证。小到一个方法,大到一个类、一个模块。都可以用单元测试覆盖。

单元测试有必要写吗

现状:

  1. 面对日复一日排满的需求,没有时间去写。

  2. 再者业务逻辑变化快,对应的单元测试代码也得调整。不愿写。

  3. 用postman,接口api也能满足http测试。

写单测好处:

  1. 避免低级的bug发到开发环境或测试环境。

    • 在线测试分支覆盖不全的情况。

  2. 提高代码正确性。
    • 判断方法的返回值和预期值是否一致。

  3. 能简单理清代码逻辑。
    • 阅读单元测试代码能简单快速的了解逻辑。方便后面的同事了解此方法功能。以及怎么使用。

如果不写单测,那我们可能会用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单元测试实战相关推荐

  1. Springboot单元测试mysql_Springboot Mybatis-Plus数据库单元测试实战(三种方式)

    单元测试长久以来是热门话题,本文不会讨论需不需要写单测,可以看看参考资料1,我个人认为写好单测应该是每个优秀开发者必备的技能,关于写单测的好处在这里我就不展开讨论了,快速进入本文着重讨论的话题,如何写 ...

  2. Java接口自动化之TestNG单元测试框架(一)

    上一篇Java接口自动化系列文章:Java接口自动化之log4j日志框架,主要介绍log4j日志介绍.日志三大组成部分及日志实战. 以下主要介绍TestNG的简介.@Test注解及其属性. 01 Te ...

  3. surefire 拉起testng单元测试类的源码流程阅读(二)

    这里是基于surefire 2.19.1版本分析的. 还是根据surefire 拉起单元测试执行报错的日志展示的执行过程分析 java.lang.instrument.IllegalClassForm ...

  4. surefire 拉起testng单元测试类的源码流程阅读(一)

    这里分析是基于2.5surefire 版本. 首先拿surefire 拉起单元测试报错日志 分析: Caused by: java.io.IOException: Error while instru ...

  5. testNG单元测试学习

    [demo的项目报以及流程文档放在了资源文件上] 1 TestNG的介绍 1.1 概念: TestNG(Test Next Generation)是一个测试框架,在Junit和NUnit基础上引入新功 ...

  6. 使用Junit对Spring进行单元测试实战小结

    Demo代码: Java代码   @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "cla ...

  7. 一文说尽Golang单元测试实战的那些事儿

    导语 | 单元测试,通常是单独测试一个方法.类或函数,让开发者确信自己的代码在按预期运行,为确保代码可以测试且测试易于维护.腾讯后台开发工程师张力结合了公司级漏洞扫描系统洞犀在DevOps上探索的经验 ...

  8. Lua Busted 单元测试实战

    目标 提供比较实用的 Lua Busted 单元测试实例. 环境 Unity 2018.2.5f1 Personal (64bit) IntelliJ IDEA 2018.2.3 (Community ...

  9. testng单元测试-diagnose依赖compet找不到compet的类

    diagnose依赖于compet服务,连接166等配置没问题,但是一直报错: 找不到compet里面使用到的类 修改点: 1.BaseTest.java @ContextConfiguration( ...

最新文章

  1. 常考数据结构与算法:买卖股票的最好时机
  2. list 索引 java_如何在Java中保持List索引的固定
  3. 2009计算机网络考研大题,2009年计算机考研统考真题网络部分分析
  4. java爬虫-简单爬取网页图片
  5. 记录一下SpringCloud-Gateway使用lb动态路由遇到的坑
  6. HTML邮件制作规范
  7. TML5 App 开发框架收集
  8. Java单元测试框架 - JUnit
  9. Python+Flask(2)--通过flask paginate解决列表分页问题
  10. VSCode添加背景图片
  11. Kong+Konga配置原理、操作 学习分享
  12. Z字形变换(Java)
  13. centos7网卡链路聚合
  14. C++查缺补漏之异常(续)
  15. Geckofx偏好设置
  16. 温氏股份董事长温志芬强烈推荐:《数字化转型方法论》一把解锁数字化转型的秘钥
  17. HighTec编译器提高编译速度
  18. 基于应急广播国标协议的IP解析工具
  19. 开源一个各种USB电缆的测试仪,再也不用担心被只有充电功能的数据线坑了
  20. 5福最多多少钱_2017年支付宝集齐5福能分多少钱?

热门文章

  1. Linux 根目录/ home目录与~目录的区别
  2. 有关教学设计的四个网站
  3. 什么是axios(写给小白的理解笔记)
  4. MATLAB画图中英文不同字体混合显示标题、坐标轴标签(完美解决方案)
  5. 负采样Negative Sampling
  6. 字体:[大 中 小]
  7. 最小二乘法拟合多项式曲线原理
  8. unity 开发射击打靶vr_自制Unity3D VR射击游戏
  9. 二叉树的抽象数据类型
  10. Django environ使用