企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
10. 依赖测试 有时,我们可能需要以特定顺序调用测试用例中的方法,或者可能希望在方法之间共享一些数据和状态。 TestNG支持这种依赖关系,因为它支持在测试方法之间显式依赖的声明。 TestNG允许指定依赖关系: 在@Test注释中使用属性dependsOnMethods 在@Test注释中使用属性dependsOnGroups 除此之外依赖还分为hard依赖和soft依赖: hard依赖:默认为此依赖方式,即其所有依赖的methods或者groups必须全部pass,否则被标识依赖的类或者方法将会被略过,在报告中标识为skip,如后面的范例所示,此为默认的依赖方式; soft依赖:此方式下,其依赖的方法或者组有不是全部pass也不会影响被标识依赖的类或者方法的运行,注意如果使用此方式,则依赖者和被依赖者之间必须不存在成功失败的因果关系,否则会导致用例失败。此方法在注解中需要加入alwaysRun=true即可,如@Test(dependsOnMethods= {"TestNgLearn1"}, alwaysRun=true); 在TestNG中,我们使用dependOnMethods和dependsOnGroups来实现依赖测试。 且这两个都支持正则表达式,如范例三所示,如下为几个使用范例: ``` public class TestCase1 {     @Test(enabled=true)     public void TestNgLearn1() {         System.out.println("this is TestNG test case1");     }          @Test(dependsOnMethods= {"TestNgLearn1"})     public void TestNgLearn2() {         System.out.println("this is TestNG test case2");     } } ``` 运行结果: ``` this is TestNG test case1 this is TestNG test case2 PASSED: TestNgLearn1 PASSED: TestNgLearn2 ``` * 范例二,被依赖方法fail: ``` public class TestCase1 {     @Test(enabled=true)     public void TestNgLearn1() {         System.out.println("this is TestNG test case1");         Assert.assertFalse(true);     }          @Test(dependsOnMethods= {"TestNgLearn1"})     public void TestNgLearn2() {         System.out.println("this is TestNG test case2");     } } ``` 结果: ``` this is TestNG test case1 FAILED: TestNgLearn1 junit.framework.AssertionFailedError     at junit.framework.Assert.fail(Assert.java:47)     at junit.framework.Assert.assertTrue(Assert.java:20)     at junit.framework.Assert.assertFalse(Assert.java:34)     at junit.framework.Assert.assertFalse(Assert.java:41)     at com.demo.test.testng.TestCase1.TestNgLearn1(TestCase1.java:26)     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:104)     at org.testng.internal.Invoker.invokeMethod(Invoker.java:645)     at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:851)     at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1177)     at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)     at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)     at org.testng.TestRunner.privateRun(TestRunner.java:756)     at org.testng.TestRunner.run(TestRunner.java:610)     at org.testng.SuiteRunner.runTest(SuiteRunner.java:387)     at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382)     at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)     at org.testng.SuiteRunner.run(SuiteRunner.java:289)     at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)     at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)     at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293)     at org.testng.TestNG.runSuitesLocally(TestNG.java:1218)     at org.testng.TestNG.runSuites(TestNG.java:1133)     at org.testng.TestNG.run(TestNG.java:1104)     at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)     at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)     at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77) SKIPPED: TestNgLearn2 ``` 范例三、group依赖: 如下所示,method1依赖group名称为init的所有方法: ``` @Test(groups = { "init" }) public void serverStartedOk() {}   @Test(groups = { "init" }) public void initEnvironment() {}   @Test(dependsOnGroups = { "init.*" }) public void method1() {} ``` 这里init这个group中的两个方法的执行顺序如果没有在xml中指明则是按照方法名英文字母的字典顺序执行的。