TestNG擴展


1. TestNG API

     本章節將討論如何使用TestNG API來創建自己的TestNG對象。TestNG的API基本由接口組成,這樣做是為了容易模擬TestNG返回的對象。

1.1 org.testng.TestNG、ITestResult、ITestListener、ITestNGMethod

        TestNG類是TestNG的的主入口,它讓我們指定測試類,指定包含的分組或排除的分組,指定要執行的XML文件等。

public static void mian(String[] args){ TestNG tng = new TestNG(); tng.setTestClasses(new Class[]{ MyTest.class}); TestListenerAdapter listener = new TestListenerAdapter(); tng.addListener(listener); tng.run(); log("PASSED:" + listener.getPassedTests().size()); }

這里TestListenerAdapter類提供了ITestListener接口的一個簡單實現。這里使用TestListenerAdapter的另一項功能:記錄所有通過的測試案例數量。

     通過TestListenerAdapter可以方便的獲取結果的程序清單,如果需要為這個類添加功能,又保留測試結果程序清單,則可以調用被覆蓋方法的super()方法,如下所示:

public class MyTestListener extends TestListenerAdapter{ public void onTestSuccess(ITestResult result){ super.onTestSuccess(result); //do you own processing  } }

TestListenerAdapter 保存了測試結果:

public List<ITestResult> getPassedTests() public List<ITestResult> getFailedTests() public List<ITestResult> getSkippedTests()

ITestResult 接口能讓我們獲取某個測試狀態、測試方法、參數,以及開始時間和結束時間:

public void onTestSuccess(ITestResult iTestResult) { long time =
 (iTestResult.getEndMillis() - iTestResult.getStartMillis()); log("Success, method:" + iTestResult.getMethod() +" #parameters:"+iTestResult.getParameters().length + " time:" + time); } 

ITestResult# getResult 返回一個ITestNGMethod,這個是TestNG對測試方法的一個視圖。從這個對象我們可以獲得TestNG對象當前調用的原始java.lang.reflact.Method, 並獲得其他信息,如:

  • 分組/方法信息(這個方法所屬的分組,它依賴的分組和方法)。
  • 調用的次數,線程池的大小以及超時設置。
  • 這個方法是否是一個配置方法(@Before/@After), 它是哪一種配置方法:
ITestNGMethod method = iTestResult.getMethod(); log(" Method:"+method.getMethodName() +" invocationCount:" +method.getInvocationCount() +" #groups:"+method.getGroups().length +" timeOut:"+method.getTimeOut());

 

1.2 XML API

    TestNG提供了一個簡單的接口,讓我們訪問自己的testng.xml, 甚至可以從頭創建它。與XML API相關的這些類在org.testng.xml中,每個XML標簽都有一個對應的類:

標簽

類名

<suite> XmlSuite
<test> XmlTest
<package> XmlPackage
<class> XmlClass
<method-selector> XmlMethodSelector

xml 文件如下:

<suite name="testng" verbose="1" thread-count="2"> <parameter name="first-name" value="cedric" /> <test name="Regression 1"> <group> <run> <exclude name="excludeThisGroup"/> </run> </group> <classes> <class name="test.parameter.test1" /> <class name="test.parameter.test2" /> </classes> </test> </suite>

XmlSuite的值:

方法 返回結果
getName() testng
getVerbose() true
getThreadCount() 2
getParameters() Map<String, String>:{“first-name”=>”cedric”}
geTests() List<XmlTest>

XmlTest的值:

方法 返回結果
getName() Regression1
getIncludeGroups() {}
getExcludeGroups() List<String>:{“excludeThisGroup”}
getXmlClasses List<XmlClasses>:{
“test.parameter.test1”,
”test.parameter.test2”
}
geTests() List<XmlTest>

 

1.3 生成xml文件

XmlSuite suite = new XmlSuite(); suite.setName("TestNG"); suite.setVerbose(1); suite.setThreadCount(2); Map<String, String> parameters = new HashMap<String, String>(); parameters.put("first-name", "credic"); suite.setParameters(parameters); XmlTest test = new XmlTest(suite); test.setName("regression1"); test.setExcludedGroups(Arrays.asList(new String[]{"excludedGroup"})); XmlClass[] classes = new XmlClass[]{ new XmlClass("test.parameters.test1"), new XmlClass("test.parameters.test1"), }; test.setXmlClasses(Arrays.asList(classes); TestNG tng = new TestNG(); //指定xml路徑方式 tng.setTestSuites(Arrays.asList(new String[]{ "testng.xml","test-15/testng.xml"})) //使用當前生成的文件 tng.setXmlSuites(Arrays.asList(new XmlSuite[]{ suite })); tng.run();

 

2. 方法選擇器:

  Testng通過方法選擇器(IMethodSelector)來決定在執行測試時,包含或排除哪些方法。

TestNG的默認方法選擇器:XmlMethodSelector,它會根據testng.xml中的內容來實現決定邏輯,它的優先級為10.

  • 如果希望你自己的選擇器先調用,則可以把優先級設為0~9.
  • 如果先考慮testng.xml, 則把優先級設置為大於10.
  • 如果希望自己的方法選擇器替換所有默認的方法,將優先級設置為負數。在這種情況下只有帶負數優先級的方法選擇器會生效。
  • 方法選擇器直接是OR的關系:即一個方法選擇器對某個測試方法返回true,則這個測試方法就會包含在這次執行中,否則,具有下一個優先級的方法選擇器會被調用(0排在10前面)。如果沒有方法選擇器則返回true,這個測試方法不會執行。

 

3 annotation轉換器(annotationTransformer)

用戶實現annotation轉換器,是為了覆蓋TestNG在運行時看到的annotation。

public void InvocationTransform implements IAnnotationTransformer{ public void transform(ITest test, class cls, Constructor con, Method method){ if("two".equals(method.getName()){ test.setInvocationCount(2); }else if("three".equals(method.getName()){ test.setInvocationCount(3); } } }

其他用法:

  • timeout:修改測試方法的超時設置;
  • enabled:修改 @Test annotation上的enabled標識。
  • invocationCount:用於多線程環境或負載測試。
  • threadPoolSize:annotation可以查詢本地信息(處理器個數,可用堆大小或計算機負載),然后增加或減少線程池的大小。
  • successPercentage:和invocationCount一起使用,允許一定的失敗比例。
  • dataprovider:在運行時修改數據提供者的名稱。用於數據提供者本身執行動態判斷。
  • description:用於HTML報告生成。
  • group:可以進行基於環境的變量分組調整。
  • dependsOnGroups/dependsOnMethod/alwaysRun:這些屬性會直接影響執行順序,請盡量避免使用annotation轉換器來修改他們。

4. 報告api

4.1 默認報告:

    默認報告生成在./test-output目錄下

4.2 報告api

  • 利用org.testng.Reporter類,向默認報告添加定制信息。
  • ITestListener 是一個實現了org.testng.ITestListener接口的類,其中的onStart()和onFinish() 分別在testSuite開始和結束時被調用。onTest*開頭的方法在測試方法被執行時調用。
  • IReporter 實現了org.testng.IReporter接口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM