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中指明則是按照方法名英文字母的字典順序執行的。