我們在測試時,可能會遇到以下幾種測試分組的場景:
- 一個測試類當(dāng)中有多個測試方法,只想執(zhí)行其中的幾個相關(guān)的測試方法。
- 當(dāng)幾個相關(guān)的方法依賴相同的 setUp、tearDown操作。
- 當(dāng)某個方法依賴幾個相關(guān)的方法時,如幾個相關(guān)的方法執(zhí)行通過后,才執(zhí)行該方法。
我們可以通過設(shè)置 測試方法分組 的方式來解決上述問題。
分組測試是TestNG中的一個新的創(chuàng)新功能,它在JUnit框架中是不存在的。 在文中,我們將演示如何在TestNG中進行分組測試。
場景一:一個測試類當(dāng)中有多個測試方法,只想執(zhí)行其中的幾個相關(guān)的測試方法。
代碼示例如下,我們將TestDemo測試類的四個方法,通過@Test(groups = "") 方式,分成了兩個組,分別為apiTest、databaseTest。
package framework.parse;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
public class TestDemo {
@Test(groups = "apiTest")
public void runApi1() {
System.out.println("runApi1()");
}
@Test(groups = "apiTest")
public void runApi2() {
System.out.println("runApi2()1");
}
@Test(groups = "databaseTest")
public void testOracle() {
System.out.println("testOracle()");
}
@Test(groups = "databaseTest")
public void testMySQL() {
System.out.println("testMySQL");
}
}
通過testng.xml文件進行運行配置管理,如下,我們僅運行framework.parse.TestDemo測試類中的databaseTest分組。
<?xml version="1.0" encoding="UTF-8"?><suite name="TestSuite">
<test name="testDemo">
<groups>
<run>
<include name="databaseTest" />
</run>
</groups>
<classes>
<class name="framework.parse.TestDemo" />
</classes>
</test>
</suite>
運行結(jié)果如下:
Run testMySql
Run testOracle
===============================================
TestSuite
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
===============================================
場景二:當(dāng)幾個相關(guān)的方法依賴對應(yīng)的 setUp、tearDown操作。
我們可以通過@BeforeGroups、@AfterGroups方法實現(xiàn)用例組的setUp、tearDown操作,代碼示例如下:
package framework.parse;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
public class TestDemo {
@BeforeGroups("databaseTest")
public void setUpDB() {
System.out.println("Run init database");
}
@AfterGroups("databaseTest")
public void tearDownDB() {
System.out.println("Run clean database");
}
@Test(groups = "databaseTest")
public void testOracle() {
System.out.println("Run testOracle");
}
@Test(groups = "databaseTest")
public void testMySql() {
System.out.println("Run testMySql");
}
}
運行結(jié)果如下,在執(zhí)行databaseTest分組中的用例之前,執(zhí)行了setUpDB 方法,在databaseTest分組分組中的用例執(zhí)行完成后,執(zhí)行了tearDownDB方法:
Run init database
Run testMySql
Run testOracle
Run clean database
===============================================
Default Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
場景三:當(dāng)某個方法依賴幾個相關(guān)的方法時
我們可以通過 @Test(dependsOnGroups = { "" }) 方法實現(xiàn)優(yōu)先執(zhí)行依賴測試組,當(dāng)依賴測試組執(zhí)行通過后,則執(zhí)行被依賴方法,否則跳過被依賴方法。代碼示例如下:
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
public class TestDemo {
@Test(groups = "apiTest")
public void runApi1() {
System.out.println("Run runApi1");
}
@Test(groups = "apiTest")
public void runApi2() {
System.out.println("Run runApi2");
}
@Test(groups = "databaseTest")
public void testOracle() {
System.out.println("Run testOracle");
}
@Test(groups = "databaseTest")
public void testMySql() {
System.out.println("Run testMySql");
}
@Test(dependsOnGroups = { "databaseTest", "apiTest" })
public void runFinal() {
System.out.println("runFinal");
}
}
上述代碼示例中,runFinal 方法依賴databaseTest組、apiTest組方法,需要在這兩個組的方法執(zhí)行通過后,才可以執(zhí)行runFinal方法,我們通過 @Test(dependsOnGroups = { "databaseTest", "apiTest" }) 注解的方式來實現(xiàn),運行代碼,執(zhí)行結(jié)果如下:
Run runApi1
Run runApi2
Run testMySql
Run testOracle
runFinal
===============================================
Default Suite
Total tests run: 5, Failures: 0, Skips: 0
===============================================
如果當(dāng)依賴的測試組里在運行過程中存在失敗的用例,則runFinal方法將被跳過,示例代碼如下:
import org.testng.Assert;
import org.testng.annotations.AfterGroups;
import org.testng.annotations.BeforeGroups;
import org.testng.annotations.Test;
public class TestDemo {
@Test(groups = "apiTest")
public void runApi1() {
System.out.println("Run runApi1");
// 運行失敗
Assert.assertEquals(1,2);
}
@Test(groups = "apiTest")
public void runApi2() {
System.out.println("Run runApi2");
}
@Test(groups = "databaseTest")
public void testOracle() {
System.out.println("Run testOracle");
}
@Test(groups = "databaseTest")
public void testMySql() {
System.out.println("Run testMySql");
}
@Test(dependsOnGroups = { "databaseTest", "apiTest" })
public void runFinal() {
System.out.println("runFinal");
}
}
如上,示例代碼中apiTest分組中的runApi1測試用例將斷言失敗,此時運行測試用例,執(zhí)行結(jié)果如下,我們會看到runFinal方法被沒有被執(zhí)行,而是跳過。
Run runApi1
JAVA.lang.AssertionError: expected [2] but found [1]
Expected :2
Actual :1
at org.testng.Assert.fail(Assert.java:94)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
Run runApi2
Run testMySql
Run testOracle
Test ignored.
===============================================
Default Suite
Total tests run: 5, Failures: 1, Skips: 1
===============================================