目錄
(一)TestNG學(xué)習(xí)之路—HelloWorld入門
(二)TestNG學(xué)習(xí)之路—注解及屬性概覽
(三)TestNG學(xué)習(xí)之路—TestNG.xml/YAML
(四)TestNG學(xué)習(xí)之路—注解詳述之@Test
(五)TestNG學(xué)習(xí)之路—注解詳述之參數(shù)化
(六)TestNG學(xué)習(xí)之路—注解詳述之@Factory
(七)TestNG學(xué)習(xí)之路—注解詳述之忽略測試
(八)TestNG學(xué)習(xí)之路—注解詳述之并發(fā)
(九)TestNG學(xué)習(xí)之路—失敗測試重跑
(十)TestNG學(xué)習(xí)之路—編碼執(zhí)行TestNG
(十一)TestNG學(xué)習(xí)之路—BeanShell高級用法
(十二)TestNG學(xué)習(xí)之路—注解轉(zhuǎn)換器
(十三)TestNG學(xué)習(xí)之路—方法攔截器
(十四)TestNG學(xué)習(xí)之路—TestNG監(jiān)聽器
(十五)TestNG學(xué)習(xí)之路—依賴注入
(十六)TestNG學(xué)習(xí)之路—測試報告
(十七)基于TestNG+Rest Assured+Allure的接口自動化測試框架
前言
TestNG 啟動之后會將所有的測試方法分成兩類:
- 特定順序運行的測試方法庐扫。針對有依賴關(guān)系(dependsOnMethods,dependsOnGroups)的測試方法蜕依。
- 沒有特定運行順序的測試方法谐丢。除開第一類說的伴找,默認(rèn)情況下谜叹,TestNG將嘗試按class對測試方法進行分組執(zhí)行。
為了讓用戶對第二類測試方法擁有更大的控制權(quán),TestNG提供了IMethodInterceptor接口,可以通過實現(xiàn)該接口來控制測試方法的執(zhí)行順序抱既。
public interface IMethodInterceptor {
List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context);
}
intercept 方法在所有測試方法被分類后以及所有測試方法被執(zhí)行前被調(diào)用。所有的測試方法將按照 intercept 返回值列表中的順序被執(zhí)行扁誓。因此防泵,用戶在 intercept 方法中可以對列表進行修改,比如重新排序蝗敢,甚至增加或者減少測試方法捷泞。另外,方法中傳遞的ITestContext入?yún)⑹偾矗脩艨梢宰远x某些值(IAttributes.setAttribute(String, Object)
)锁右,后續(xù)在測試報告展現(xiàn)。
示例
編寫IMethodInterceptor實現(xiàn)類讶泰,用于執(zhí)行g(shù)rp1組的測試用例咏瑟。
import com.Test;
import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;
import org.testng.ITestNGMethod;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class MethodInterceptors implements IMethodInterceptor {
public List<IMethodInstance> intercept(List<IMethodInstance> methodInstances, ITestContext context) {
List<IMethodInstance> result = new ArrayList<IMethodInstance>();
for (IMethodInstance methodInstance : methodInstances) {
ITestNGMethod method = methodInstance.getMethod();
Set<String> groups = new HashSet<String>();
if (method.isTest()) { //如果是@Test注解
for (String group : method.getGroups()) {
groups.add(group); //獲取@Test注解的所有組
}
}
if (groups.contains("grp1")) //只運行g(shù)rp1組
result.add(methodInstance);
}
return result;
}
}
編寫測試類,并添加監(jiān)聽器注解@Listeners(MethodInterceptors.class):
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(MethodInterceptors.class)
public class MethodInterceptorsTest {
@BeforeClass
public void bfClass(){
System.out.println("BeforeClass");
}
@Test(groups = "grp1")
public void test1(){
System.out.println("test1");
}
@Test(groups = "grp2")
public void test2(){
System.out.println("test2");
}
@Test(groups = "grp2")
public void test3(){
System.out.println("test3");
}
@AfterClass
public void afClass(){
System.out.println("AfterClass");
}
}
執(zhí)行結(jié)果如下:
BeforeClass
test1
AfterClass
===============================================
Default Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
如上執(zhí)行結(jié)果所示痪署,MethodInterceptors監(jiān)聽器確實起作用了码泞。
擴展學(xué)習(xí)資料
IMethodInterceptor 監(jiān)聽器入門級教學(xué) (通過 IMethodInterceptor 監(jiān)聽器實現(xiàn)運行指定的組)
實戰(zhàn) TestNG 監(jiān)聽器
IMethodInterceptor javadoc