单元测试——测试神器,testng
为什么用它
建议使用 TestNG 作为 Java 项目的主要单元测试框架,因为 TestNG 在参数化测试、依赖测试以及套件测试(组)方面功能更加强大。TestNG 意味着高级的测试和复杂的集成测试。它更加的灵活,特别是对大的套件测试。另外,TestNG 也涵盖了 JUnit4 的全部功能。那就没有任何理由使用 Junit了
更多细节,可以参见:JUnit 4 与 TestNG 对比
解决什么问题
- 断言结果
- 期望异常
- 进行分组
- 多线程测试
- 依赖测试
- 有测试可视化结果
即:它即能测试单元测试,也能进行集成测试,甚至也可以使用于系统测试(比较少用)。
基本概念
概论
TestNG,即Testing, Next Generation,下一代测试技术,是一套根据JUnit 和 NUnit思想而构建的利用注释来强化测试功能的一个测试框架,即可以用来做单元测试,也可以用来做集成测试
组成
- 一套测试(suite)由一个XML文件所表示。它能够包含一个或者多个测试, 标记来定义。
- test由 标记来表示一个测试,并且可以包含一个或者多个TestNG类。
- TestNG 类是包含至少一个TestNG annotation的 java类,由标签描述并包含一个或多个测试方法。
- 测试方法,就是一个普通的Java方法,在由@Test标记。
使用场景
使用场景是按注解来陈述的,没有列举全部注解,更多注解可以参见:TestNG基本注解
@BeforeClass
用于集成测试或者其他依赖的初始。比如数据库的初始
@AfterClass
用于测试的资源销毁。建议尽量不用。
@Test
用于标记需要测试的方法。一般在类里import static org.testng.Assert.*;
,这样方法的时候更优雅。
断言
在方法里,通过assertXxx系列来断言结果
@Test
public void assertResult() {
String result = "result";
//断言结果值等于
assertEquals("result", result);
boolean isTrue = true;
//断言结果真假
assertTrue(isTrue);
//其他的asertXxx系统自行查看API
}
异常
通过expectedExceptions属性来捕获异常
@Test(expectedExceptions = BusinessException.class)
public void expectedException() {
Iterator i = mock(Iterator.class);
when(i.next()).thenThrow(BusinessException.class);
i.next();
}
线程
通过invocationCount和threadPoolSize属性来实现。
@Test(invocationCount = 8, threadPoolSize = 3)
public void testThread() {
long threadId = Thread.currentThread().getId();
System.out.println("线程号为:" + threadId);
}
执行结果
[ThreadUtil] Starting executor timeOut:0ms workers:8 threadPoolSize:3
线程号为:12
线程号为:13
线程号为:11
线程号为:12
线程号为:11
线程号为:13
线程号为:12
线程号为:13
PASSED: testThread
PASSED: testThread
PASSED: testThread
PASSED: testThread
PASSED: testThread
PASSED: testThread
PASSED: testThread
PASSED: testThread
依赖
通过dependsOnMethods、dependsOnGroups来实现。
@Test
public void preAction() {
System.out.println("preAction");
}
@Test(dependsOnMethods = "preAction")
public void action() {
System.out.println("action");
//dependsOnGroups就不再做试验了
}
执行结果:
preAction
action
PASSED: preAction
PASSED: action
忽略
通过enable来实现
@Test(enabled=false)
public void disable(){
//建议少用
System.out.println("暂时不执行");
}
分组
通过groups来实现
@Test(groups = "database")
public void update() {
IDbDao dbDao = mock(IDbDao.class);
UserEntity user = new UserEntity();
when(dbDao.fetch(UserEntity.class, 1L)).thenReturn(user);
UserEntity fetchUser = dbDao.fetch(UserEntity.class, 1L);
assertEquals(user, fetchUser);
}
测试报告
测试报告是测试非常重要的部分.
TestNG默认情况下,会生产两种类型的测试报告HTML的和XML的。 测试报告位于 "test-output" 目录下.
参考资源
单元测试——测试神器,testng的更多相关文章
- [原创]Burp Suite web应用程序渗透测试神器
[原创]Burp Suite web应用程序渗透测试神器 一 Burp Suite介绍 Burp Suite是Web应用程序测试的最佳工具之一,其多种功能可以帮我们执行各种任务.请求的拦截和修改,扫描 ...
- Sysbench测试神器:一条命令生成百万级测试数据
1. 基准测试 基准测试(benchmarking)是性能测试的一种类型,强调的是对一类测试对象的某些性能指标进行定量的.可复现.可对比的测试. 进一步来理解,基准测试是在某个时候通过基准测试建立一个 ...
- 渗透测试神器Cobalt Strike使用教程
Cobalt Strike是一款渗透测试神器,常被业界人称为CS神器.Cobalt Strike已经不再使用MSF而是作为单独的平台使用,它分为客户端与服务端,服务端是一个,客户端可以有多个,可被团队 ...
- .net测试篇之单元测试/集成测试神器Autofixture
autofixture简介 有了单元测试框架加上Moq(后面我们会用单独章节来介绍moq),可以说测试问题基上都能搞定了.然而有了AutoFixture对单元测试来说可以说是如虎添翼,AutoFixt ...
- 白盒测试的学习之路----(四)搭建测试框架TestNG测试
TestNG是一个开源自动化测试框架; TestNG是类似于JUnit,但它不是一个JUnit扩展.它的灵感来源于JUnit.它的目的是优于JUnit的,尤其是当测试集成的类. TestNG消除了大部 ...
- ☕【Java技术指南】「TestNG专题」单元测试框架之TestNG使用教程指南(上)
TestNG介绍 TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit, 功能都差不多, 只是功能更加强大,使用也更方便. 详细使用说明请参考官方链接:https://testng ...
- ASP.NET CORE 中用单元测试测试控制器
之前用ASP.NET CORE做的项目 加了一个新功能,数据库加了个字段balabala.... 更新到服务器上,新功能测试正常,然后就没管了..... 今天客户说网站有BUG,某个页面打开后出错了, ...
- C# vs2015单元测试测试资源管理器不显示测试方法
问题描述:在用VS2015用测试框架NUnit单元测试的时候,测试资源管理器死活不出现测试方法,无法运行单元测试模块 现象如下图: 原因:nunit版本不对应 解决方案:下载nunit3.0及往上的版 ...
- 【TestNG测试】TestNG、Maven、testng.xml构建测试工程
创建一个maven工程 使用Idea创建maven工程 建立类似如上的工程结构,src/main/java,src/test/java,pom.xml,testng.xml,这里由于我们使用工程是 ...
随机推荐
- 一份非常完整的 MySQL 规范
源自:https://www.cnblogs.com/huchong/p/10219318.html 一.数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割. 所有数据库对象名称禁止使用 ...
- eclipse 调试技巧收集
1 eclipse启动tomcat无法访问 原因:部署路径没有选择 tomcat安装路径 解决:双击,设置server location即可 http://blog.csdn.net/wqjsir/ ...
- React-Router JS控制路由跳转
React-Router JS控制路由跳转 时间: 2016-04-12 15:01:20 作者: zhongxia React-Router 控制路由跳转的方式,目前知道的有两种[Link 链接, ...
- redis 配置文件redis.conf
daemonize yes #---默认值no,该参数用于定制redis服务是否以守护模式运行.--- pidfile /var/run/redis.pid #默认值/var/run/redis.pi ...
- 查看oracle数据库版本
1. 登录sysdba用户 sqlplus / as sysdba 2. 方法一:v$version SQL> select * from v$version; 3. 方法二:product_ ...
- linux 几个常用的Debian更新源
deb http://ftp.debian.org/debian/ lenny main contrib non-free deb-src http://ftp.debian.org/debian/ ...
- 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】
(题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...
- 【原创】大叔经验分享(53)kudu报错unable to find SASL plugin: PLAIN
kudu安装后运行不正常,master中找不到任何tserver,查看tserver日志发现有很多报错: Failed to heartbeat to master:7051: Invalid arg ...
- [luogu1080] 国王游戏
题面 这是一个比较经典(害人不浅)的题目啊, 很早就听说过这个题目的大名, 今日得见, 果然非凡题所可以比拟的啊, 行了, 瞎扯就先扯到这里, 题目大意应该是很好解释的, 我就不解释了, 要使得最 ...
- js之点击值发生变化
点击值发生变化,应用场景,比如像阿里云那样我通常密码是以******的形式存在,我必须要点击查看,它才会以明文显示. 在实际开发中,比如以智能门锁为例,安装门锁时,有个叫密码输入框的表单,这个是选填项 ...