Java单元测试——框架(三)——testNG
1. 配置
建立Maven Project
建立pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jerry</groupId>
<artifactId>mytest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mytest</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jerry</groupId>
<artifactId>mytest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>mytest</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
安装:https://www.cnblogs.com/xusweeter/p/6559196.html,将org.testng.eclipse.updatesite.zip 拷贝到%ECLIPSE_HOME%dropins,建立TestNG Class
2. 基本架构
被测代码
package com.jerry;
public class Calculator{
private static int result;
public void add(int n) {
result = result + n;
}
public void substract(int n) {
result = result - n;
}
public void multiply(int n) {
result = result * n;
}
public void divide(int n){
try {
result = result / n;
}catch(ArithmeticException ex){
System.out.println(ex);
throw new ArithmeticException("The n not allowed to 0!!")
}
}
}
最基本的测试代码
package com.jerry.mytest;
import org.testng.annotations.Test;
import org.testng.AssertJUnit;
import org.testng.annotations.BeforeMethod;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
@Test
public void testAdd() {
calculator.add(2);
calculator.add(3);
AssertJUnit.assertEquals(5,calculator.getResult());
}
@Test
public void testSubstract() {
calculator.add(5);
calculator.substract(3);
AssertJUnit.assertEquals(2,calculator.getResult());
}
@Test
public void testMultiply() {
calculator.add(3);
calculator.multiply(2);
AssertJUnit.assertEquals(6,calculator.getResult());
}
@Test
public void testDivide() {
calculator.add(9);
calculator.divide(3);
AssertJUnit.assertEquals(3,calculator.getResult());
}
@BeforeMethod
public void beforeMethod() {
calculator.clear();
}
}
3. TestNG的修饰符
注解 |
描述 |
---|---|
@BeforeSuite |
注解的方法将只运行一次,运行所有测试前此套件中。 |
@AfterSuite |
注解的方法将只运行一次,此套件中的所有测试都运行之后。 |
@BeforeClass |
注解的方法将只运行一次,在当前类中的方法调用前运行。 |
@AfterClass |
注解的方法将只运行一次,在当前类中的所有测试方法后运行。 |
@BeforeTest |
注解的方法将被运行之前的任何测试方法,属于内部类的 <test>标签的运行。 |
@AfterTest |
注解的方法将被运行后,所有的测试方法,属于内部类的<test>标签的运行。 |
@BeforeGroups |
组的列表,这种配置方法将之前运行。此方法是保证在运行属于任何这些组的第一个测试方法,该方法被调用。 |
@AfterGroups |
组的名单,这种配置方法后,将运行。此方法是保证运行后不久,最后的测试方法,该方法属于任何这些组被调用。 |
@BeforeMethod |
注解的方法将在每个测试方法之前运行。 |
@AfterMethod |
被注释的方法将被运行后,每个测试方法。 |
@DataProvider |
标志着一个方法,提供数据的一个测试方法。注解的方法必须返回一个Object[][],其中每个对象[]的测试方法的参数列表中可以分配。该@Test 方法,希望从这个DataProvider的接收数据,需要使用一个dataProvider名称等于这个注解的名字。 |
@Factory |
作为一个工厂,返回TestNG测试类的对象将被用于标记的方法。该方法必须返回Object[]。不常用 |
@Listeners |
定义一个测试类的监听器。不常用 |
@Parameters |
介绍如何将参数传递给@Test方法。 |
@Test |
标记一个类或者方法,从而作为测试的一部分。 |
描述装饰符的程序
package MyUnit.MyTestNG;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class MyFirstNG {
@Test(groups="group1")
public void test1() {
System.out.println("test1 from group1");
Assert.assertTrue(true);
}
@Test(groups="group1")
public void test11() {
System.out.println("test11 from group1");
Assert.assertTrue(true);
}
@Test(groups="group2")
public void test2()
{
System.out.println("test2 from group2");
Assert.assertTrue(true);
}
@BeforeTest
public void beforeTest()
{
System.out.println("beforeTest");
}
@AfterTest
public void afterTest()
{
System.out.println("afterTest");
}
@BeforeClass
public void beforeClass()
{
System.out.println("beforeClass");
}
@AfterClass
public void afterClass()
{
System.out.println("afterClass");
}
@BeforeSuite
public void beforeSuite()
{
System.out.println("beforeSuite");
}
@AfterSuite
public void afterSuite()
{
System.out.println("afterSuite");
}
//只对group1有效,即test1和test11
@BeforeGroups(groups="group1")
public void beforeGroups()
{
System.out.println("beforeGroups");
}
//只对group1有效,即test1和test11
@AfterGroups(groups="group1")
public void afterGroups()
{
System.out.println("afterGroups");
}
@BeforeMethod
public void beforeMethod()
{
System.out.println("beforeMethod");
}
@AfterMethod
public void afterMethod()
{
System.out.println("afterMethod");
}
}
运行结果(缩进为了看起来方便,我自己设置的)
beforeSuite
beforeTest
beforeClass
beforeGroups
beforeMethod
test1 from group1
afterMethod
beforeMethod
test11 from group1
afterMethod
afterGroups
beforeMethod
test2 from group2
afterMethod
afterClass
afterTest
PASSED: test1
PASSED: test11
PASSED: test2
===============================================
Default test
Tests run: 3, Failures: 0, Skips: 0
===============================================
afterSuite
===============================================
Default suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================
4. 异常测试
被测的程序
public void divide(int n){
try {
result = result / n;
}catch(ArithmeticException ex){
System.out.println(ex);
throw new ArithmeticException("The n not allowed to 0!!");
}
}
测试程序
@Test(expectedExceptions = ArithmeticException.class)
public void divisionWithException() {
calculator.add(9);
calculator.divide(0);
}
5. 忽略测试
@Test(enabled=false)
public void TestNgLearn1() {
System.out.println("this is TestNG test case1");
}
6.参数化
6.1使用textng.xml传送参数
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false">
<test name="Test">
<parameter name="first" value="3" />
<parameter name="second" value="3"/>
<parameter name="result" value="6"/>
<classes>
<class name="MyUnit.MyTestNG.MyTestNG"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
测试代码
@Test
@Parameters({"first","second","result"})
public void TestParemByXML(int first, int second,int result) {
calculator.add(first);
calculator.add(second);
AssertJUnit.assertEquals(result,calculator.getResult());
}
注意
1. 只能设置一组参数
2. 必须运行test.xml,而非测试代码
6.2使用DataProvider传送参数
可以设置多组
@DataProvider(name = "provideNumbers")
public Object[][] provideData() {
return new Object[][] { { 3, 3, 9 }, { -3, -3, 9 }, { 3, -3, -9 } };
}
@Test(dataProvider = "provideNumbers")
public void TestParemByDataProvider(int first, int second,int result) {
calculator.add(first);
calculator.multiply(second);
AssertJUnit.assertEquals(result,calculator.getResult());
}
7.总结
JUnit4 |
JUnit5 |
TestNG |
|
---|---|---|---|
忽略测试 |
@Ignore |
@Disabled |
@Test(enabled=false) |
延迟测试 |
@Test(timeout=1000 ) |
@Timeout(SECOND)assertTimeoutPreemptively |
不支持 |
参数化测试 |
@RunWith(Parameterized.class ) |
@ParameterizedTest@ValueSource@EnumSource@MethodSource@CsvFileSource |
使用textng.xml使用DataProvider |
异常测试 |
不支持 |
Assertions.assertThrows |
@Test(expectedExceptions |
内嵌测试 |
不支持 |
@Nested |
不支持 |
重复测试 |
不支持 |
@RepeatedTest(X) |
不支持 |
动态测试 |
不支持 |
@TestFactory |
不支持 |
分组断言 |
不支持 |
assertAll |
不支持 |
工厂方法 |
不支持 |
不支持 |
@Factory |
分组测试 |
@Categories |
@Tag |
@Test(groups="") |
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- MySQL Galera Cluster全解析 Part 3 状态快照传输(SST)
- 一口气搞懂「文件系统」,就靠这 25 张图了
- Oracle ASM 环境增加控制文件
- 利用注解进行 Spring 开发
- 40张图揭秘,「键入网址发生了什么」
- Spring 代理模式知多少
- 一条SQL引发的“血案”:与SQL优化相关的4个案例
- Mycat分库分表全解析 Part 3 Mycat的安装
- Oracle非图形化界面创建数据库
- Mycat分库分表全解析 Part 5 Mycat 分片规则介绍
- PHP 命名空间与类自动加载实现
- mysqldump命令详解 Part 3-备份单表
- mysqldump命令详解 Part 7- -single-transaction 参数的使用
- 基于 Symfony 组件封装 HTTP 请求响应类
- 通过 PHP 原生代码实现 HTTP 路由器