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="") |