单元测试——测试神器,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,这里由于我们使用工程是 ...
随机推荐
- 转载:python的编码处理(一)
以下内容转载自: http://in355hz.iteye.com/blog/1860787 最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些, ...
- Python学习---IO的异步[自定义异步IO]
自定义IO异步基础知识: --所有的请求都基于socket实现,一个请求就是一个socket socket.setblocking(False) 不需要阻塞,一个请求完了发送另外一个,会报错,需解决 ...
- November 8th 2016 Week 46th Tuesday
When he can't, he tries a new way to share a new pair. 当他做不到时,他尝试一种新的方式:分享. To share, your failing e ...
- BlockingQueue笔记
Concurrent包中的BlockingQueue很好的解决了多线程中如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利. 通过一个共享 ...
- pyspark视频
在一个网课上买了一个pyspark视频,贼贵,本来是想把视频解压密码记下来分享出来的,可是其实用的是EVPLAYER,一机一码,一共只有3个激活码 这里我分享视频链接,百度网盘: https://pa ...
- 跟我一起阅读Java源代码之HashMap(一)
最近闲的很,想和大家一起学习并讨论下Java的一些源代码以及其实现的数据结构, 不是什么高水平的东西,有兴趣的随便看看 1. 为什么要用Map,以HashMap为例 很多时候我们有这样的需求,我们需要 ...
- GIT非常见命令使用笔记
1:修改已经提交N次代码的user.name和user.email 解决我在多电脑间,使用不同账户,git config 的global,system,local配置忽略改动,而添加了多台电脑ssh ...
- ethers.js-2-wallets and signers
Application Programming Interface (API) Wallets and Signers A Wallet manages a private/public key pa ...
- 在文章详情页调用seo标题标签
在新闻的详情页,调用当前栏目的seo标题,原标签是:{dede:field.seotitle /} {dede:type} [field:seotitle/] {/dede:type} 修改 \inc ...
- gulp插件(8) - gulp-sourcemaps(生成sourcemap)
功能描述生成sourcemap文件(什么是sourcemap?请参考,简单讲就是文件压缩后不利于查看与调试,但是有了sourcemap,出错的时候,除错工具将直接显示原始代码,而不是转换后的代码) 插 ...