第十七章 TestNG高级功能
1.测试用例的依赖关系
dependsOnMethods = {"?"}依赖某个方法,某个方法之后执行
假如依赖的方法失败仍然想要这个方法执行,加alwaysRun = true
package TestBaseMethod;
import BaseMethod.Basemethod;
import ClassTbc.ClassToBeTest;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.testng.asserts.SoftAssert;
/**
* @author 96510
* @version 1.0
* @date 2021/7/19
*/
public class TestDemo1 extends Basemethod {
private static final Logger Log = LogManager.getLogger(TestDemo1.class.getName());
SoftAssert softAssert = new SoftAssert();
@Test(dependsOnMethods = {"test01"},alwaysRun = true)
public void test02() {
ClassToBeTest classToBeTest = new ClassToBeTest();
int result =9;
int sum = classToBeTest.sum(4, 5);
Assert.assertEquals(sum,result);
System.out.println("TestDemo2-test02执行完成");
}
@Test(dependsOnMethods = {"test03"},alwaysRun = true)
public void test01() {
ClassToBeTest classToBeTest02 = new ClassToBeTest();
String destination = "Hello World";
String sum = classToBeTest02.sum("Hello", "World");
Assert.assertEquals(sum,destination);
System.out.println("TestDemo2-test01执行完成");
}
@Test
public void test03() {
ClassToBeTest classToBeTest03 = new ClassToBeTest();
int[] a={1,2,3,4};
int[] sum = classToBeTest03.nums();
Assert.assertEquals(sum,a);
System.out.println("TestDemo2-test03执行完成");
}
}
执行结果:
BaseMethod-BeforeSuite-方法执行之前
BaseMethod- BeforeTest-方法执行之前
BaseMethod-BeforeClass-方法执行之前
java.lang.AssertionError: arrays don't have the same size. expected [4] but found [3]
Expected :4
Actual :3
<Click to see difference>
at org.testng.Assert.fail(Assert.java:96)
at org.testng.Assert.failNotEquals(Assert.java:776)
at org.testng.Assert.assertEqualsImpl(Assert.java:137)
at org.testng.Assert.assertEquals(Assert.java:118)
at org.testng.Assert.assertEquals(Assert.java:652)
at org.testng.Assert.checkRefEqualityAndLength(Assert.java:430)
at org.testng.Assert.assertEquals(Assert.java:250)
at org.testng.Assert.assertEquals(Assert.java:238)
at TestBaseMethod.TestDemo1.test03(TestDemo1.java:42)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:648)
at org.testng.TestRunner.run(TestRunner.java:505)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
at org.testng.SuiteRunner.run(SuiteRunner.java:364)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
at org.testng.TestNG.runSuites(TestNG.java:1049)
at org.testng.TestNG.run(TestNG.java:1017)
at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
TestDemo2-test01执行完成
TestDemo2-test02执行完成
BaseMethod-AfterClass-方法执行之后
BaseMethod-AfterTest-方法执行之后
BaseMethod-AfterSuite-方法执行之后
===============================================
Default Suite
Total tests run: 3, Failures: 1, Skips: 0
===============================================
Process finished with exit code 0
2.禁用方法或者让方法超时
enabled = false 该方法会跳过
package TestBaseMethod;
import BaseMethod.Basemethod;
import ClassTbc.ClassToBeTest;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.testng.asserts.SoftAssert;
/**
* @author 96510
* @version 1.0
* @date 2021/7/19
*/
public class TestDemo1 extends Basemethod {
private static final Logger Log = LogManager.getLogger(TestDemo1.class.getName());
SoftAssert softAssert = new SoftAssert();
@Test(dependsOnMethods = {"test01"},alwaysRun = true)
public void test02() {
ClassToBeTest classToBeTest = new ClassToBeTest();
int result =9;
int sum = classToBeTest.sum(4, 5);
Assert.assertEquals(sum,result);
System.out.println("TestDemo2-test02执行完成");
}
@Test
// (dependsOnMethods = {"test03"},alwaysRun = true)
public void test01() {
ClassToBeTest classToBeTest02 = new ClassToBeTest();
String destination = "Hello World";
String sum = classToBeTest02.sum("Hello", "World");
Assert.assertEquals(sum,destination);
System.out.println("TestDemo2-test01执行完成");
}
@Test(enabled = false)
public void test03() throws InterruptedException {
ClassToBeTest classToBeTest03 = new ClassToBeTest();
int[] a={1,2,3,4};
int[] sum = classToBeTest03.nums();
Assert.assertEquals(sum,a);
Thread.sleep(200);
System.out.println("TestDemo2-test03执行完成");
}
}
执行结果:
BaseMethod-BeforeSuite-方法执行之前
BaseMethod- BeforeTest-方法执行之前
BaseMethod-BeforeClass-方法执行之前
TestDemo2-test01执行完成
TestDemo2-test02执行完成
BaseMethod-AfterClass-方法执行之后
BaseMethod-AfterTest-方法执行之后
BaseMethod-AfterSuite-方法执行之后
===============================================
Default Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
(timeOut = 100)设置超时时间,方法运行时间超过该时间,直接failed
package TestBaseMethod;
import BaseMethod.Basemethod;
import ClassTbc.ClassToBeTest;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.testng.asserts.SoftAssert;
/**
* @author 96510
* @version 1.0
* @date 2021/7/19
*/
public class TestDemo1 extends Basemethod {
@Test(timeOut = 100)
public void test03() throws InterruptedException {
ClassToBeTest classToBeTest03 = new ClassToBeTest();
int[] a={1,2,3};
int[] sum = classToBeTest03.nums();
Assert.assertEquals(sum,a);
Thread.sleep(200);
System.out.println("TestDemo2-test03执行完成");
}
}
执行结果:
org.testng.internal.thread.ThreadTimeoutException: Method TestBaseMethod.TestDemo1.test03() didn't finish within the time-out 100
at java.util.concurrent.ThreadPoolExecutor.tryTerminate(ThreadPoolExecutor.java:713)
at java.util.concurrent.ThreadPoolExecutor.processWorkerExit(ThreadPoolExecutor.java:1014)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
3.xml文件中维持测试用例的执行顺序
preserve-order 控制<test>
里面所有<classes>
的执行顺序的 默认为true 顺序执行 否则按照典序升序排序执行
class中的beforetest仍然会先执行
enabled=“true” 该test执行 否则不执行
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Regression Test">
<test name="Application name" preserve-order="false">
<classes>
<class name="TestClass.TestDemo4"></class>
<class name="TestClass.TestDemo3"></class>
</classes>
</test>
<test name="Application name1" enabled="true">
<classes>
<class name="TestClass.TestDemo4"></class>
<class name="TestClass.TestDemo3"></class>
</classes>
</test>
</suite>