单元测试——测试神器,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-面向过程编程
面向过程: 核心是过程.过程指的是解决问题的步骤,设计一条流水线,机械式的思维方式. 优点:复杂的问题流程化,进而简单化
- Windows:删除图标缓存
适用于桌面快捷方式图标丢失或图标变成白色的情况,批处理代码如下: rem 关闭explorer.exe taskkill /f /im explorer.exe attrib -h -i %userp ...
- Windows下使用Git Bash上传项目到GitHub
http://blog.csdn.net/qq_28304687/article/details/69959238?locationNum=8&fps=1
- memset struct含有string的崩溃
2019/4/2 补充一下 这里如果填充为0,则不会崩溃,填充为非0时,再次调用赋值就会崩溃 推测非0拷贝破坏了string内部的数据结构,不要对任何类使用memset https://blog.cs ...
- CF893F:Subtree Minimum Query(线段树合并)
Description 给你一颗有根树,点有权值,m次询问,每次问你某个点的子树中距离其不超过k的点的权值的最小值.(边权均为1,点权有可能重复,k值每次询问有可能不同,强制在线) Input 第一行 ...
- criterions的选择
criterions分为几类,其中有classification criterions与regression criterions.classification criterions是针对离散的,re ...
- C语言程序设计I—第十周教学
第十周教学总结(04/11-10/11) 教学内容 第4章 循环结构-while /do-while语句 4.1用格里高利公式求π的近似值,4.2 统计一个整数的位数 课前准备 在蓝墨云班课发布资源: ...
- [图解tensorflow源码] [原创] Tensorflow 图解分析 (Session, Graph, Kernels, Devices)
TF Prepare [图解tensorflow源码] 入门准备工作 [图解tensorflow源码] TF系统概述篇 Session篇 [图解tensorflow源码] Session::Run() ...
- Linux 内存使用方法详细解析
我是一名程序员,那么我在这里以一个程序员的角度来讲解Linux内存的使用. 一提到内存管理,我们头脑中闪出的两个概念,就是虚拟内存,与物理内存.这两个概念主要来自于linux内核的支持. Linux在 ...
- Linux进程管理——fork()和写时复制
写时复制技术最初产生于Unix系统,用于实现一种傻瓜式的进程创建:当发出fork( )系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程.这种行为是非常耗时的,因为它需要: · ...