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