一、TestNG.xml 是 TestNG 測試框架的核心配置文件,用于組織和控制測試執行。通過它,可以靈活地管理測試套件、測試類、方法,并設置各種執行參數
一個基本的 testng.xml文件通常以 ??DOCTYPE 聲明??開頭,并遵循特定的文檔類型定義(DTD)
一個基本的 TestNG.xml 結構如下
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="SuiteName"><test name="TestName"><classes><class name="com.example.TestClass1"/><class name="com.example.TestClass2"/></classes></test>
</suite>
二、 下面詳細解釋其主要結構和用法。
2.1 < suite >
根標簽,代表一個測試套件。可設置 name(套件名,必填)、parallel(并行模式,如 none/methods/tests/classes)、thread-count(線程數)等屬性
name?? (必填): 套件或測試的名稱,會顯示在報告中
??verbose??: 控制臺輸出的詳細等級,0-10,數字越大越詳細。
??parallel??: 指定并行模式,TestNG 7.0+版本默認parallel=“none”(即false)、methods、tests、classes、instances。??必須??與 thread-count配套使用。
??thread-count??: 并行執行時的最大線程數。
??data-provider-thread-count??: 并發時數據提供者的線程池大小。
??preserve-order??: 是否按 XML 中的順序執行測試,默認為 true。
<suite name="MyTestSuite" verbose="1" parallel="tests" thread-count="3" data-provider-thread-count="10"><test name="RegressionTest1"><!-- 配置內容 --></test><test name="SmokeTest"><!-- 配置內容 --></test>
</suite>
2.2 < test>
定義測試模塊,包含具體的測試類或包
name(必填): 測試的名稱。
同樣可以設置 parallel, thread-count等屬性,其設置會覆蓋 suite 級別的同名屬性
<test name="Example"><classes><class name="com.example.TestClass1"><methods><include name="testMethod1"/> <!-- 只運行 testMethod1 --><exclude name="testMethod2"/> <!-- 排除 testMethod2 --></methods></class><class name="com.example.TestClass2"/> <!-- 運行 TestClass2 中的所有測試方法 --></classes><!-- 或者使用 packages --><packages><package name="com.example.integrationtests"/> <!-- 運行指定包及其子包下所有測試類 --></packages>
</test>
2.3< parameter>
??用于定義參數,這些參數可以通過 @Parameters注解在測試類中獲取。可以聲明在 < suite>或 < test>級別,test 級別的參數會覆蓋 suite 級別的同名參數。
<suite name="ParameterSuite"><parameter name="env" value="staging"/> <!-- suite級別參數 --><test name="ParameterTest"><parameter name="username" value="testuser"/> <!-- test級別參數 --><classes><class name="com.example.LoginTest"/></classes></test>
</suite>
在測試類中:
public class LoginTest {@Test@Parameters({"env", "username"})public void testLogin(String environment, String user) {// 使用參數進行測試System.out.println("Running in env: " + environment + " with user: " + user);}
}
2.4< groups>
用于定義要運行或排除的測試組
位于 < test>標簽下。使用 < run>, < include>, < exclude>來精細控制哪些組的測試方法需要執行
還可以使用 < define>來組合已有的組,形成新的邏輯組
<test name="GroupTest"><groups><define name="all"> <!-- 定義一個新的組組合 --><include name="smoke"/><include name="regression"/></define><run><include name="all"/> <!-- 運行自定義的組組合 --><exclude name="broken"/> <!-- 排除標記為broken的測試 --></run><!-- 還可以定義組依賴 --><dependencies><group name="final-test" depends-on="smoke regression"/></dependencies></groups><classes><class name="com.example.*"/> <!-- 運行指定包下所有類的測試 --></classes>
</test>
2.5< classes>
< classes>用于指定具體的類,還可以在類下通過 < methods>元素包含或排除特定方法。
<suite name="ParallelSuite" parallel="classes" thread-count="5">
<!-- parallel="methods": 所有測試方法在不同線程并行執行 -->
<!-- parallel="tests": 不同<test>下的方法在不同線程執行 -->
<!-- parallel="classes": 不同<class>下的方法在不同線程執行 -->
<!-- parallel="instances": 相同實例的方法在不同線程執行 --><test name="ParallelTest"><classes><class name="com.example.TestClass1"/><class name="com.example.TestClass2"/></classes></test>
</suite>
2.6< packages>
< packages>用于指定整個包,TestNG會自動掃描該包下所有帶有TestNG注解的類。
<test name="Example"><classes><class name="com.example.TestClass1"><methods><include name="testMethod1"/> <!-- 只運行 testMethod1 --><exclude name="testMethod2"/> <!-- 排除 testMethod2 --></methods></class><class name="com.example.TestClass2"/> <!-- 運行 TestClass2 中的所有測試方法 --></classes><!-- 或者使用 packages --><packages><package name="com.example.integrationtests"/> <!-- 運行指定包及其子包下所有測試類 --></packages>
</test>
2.7< methods>
??在類中指定要包含或排除的具體方法
2.8< listeners>
用于配置監聽器,這些監聽器可以監聽測試執行過程中的各種事件(如測試開始、結束、失敗等),用于擴展測試行為,如生成自定義報告
<suite name="ListenerSuite"><listeners><listener class-name="com.example.myutil.MyTestListener"/> <!-- 自定義監聽器 --></listeners><test name="TestWithListener"><classes>...</classes></test>
</suite>
三、這是一個綜合了多種元素的 testng.xml示例:
3.1
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="ComprehensiveSuite" parallel="tests" thread-count="3" verbose="2"><parameter name="env" value="staging" /> <!-- Suite level parameter --><test name="SmokeTest" preserve-order="true"><parameter name="browser" value="chrome" /> <!-- Test level parameter, overrides suite level if same name --><groups><run><include name="smoke"/><exclude name="broken"/></run></groups><classes><class name="com.example.tests.LoginTest"><methods><include name="testValidLogin"/><exclude name="testInvalidLogin"/></methods></class><class name="com.example.tests.HomePageTest"/></classes></test><test name="RegressionTest"><packages><package name="com.example.regression.*"/></packages></test><listeners><listener class-name="com.example.listeners.MyTestListener"/></listeners>
</suite>
3.2
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="ECommerce_Regression_Suite" verbose="2" parallel="tests" thread-count="3" data-provider-thread-count="2"><!-- 全局參數 --><parameter name="env" value="staging"/><parameter name="browser" value="chrome"/><parameter name="timeout" value="30"/><!-- 監聽器配置 --><listeners><listener class-name="com.qa.listeners.ExtentReportListener"/><listener class-name="com.qa.listeners.TestListener"/></listeners><!-- 冒煙測試套件 --><test name="Smoke_Test" preserve-order="true"><groups><run><include name="smoke"/><exclude name="broken"/> <!-- 排除標記為broken的測試 --></run></groups><classes><class name="com.qa.tests.LoginTest"/><class name="com.qa.tests.SearchTest"/><class name="com.qa.tests.CartTest"/></classes></test><!-- 登錄模塊測試 - 并行執行 --><test name="Login_Module_Tests" parallel="methods" thread-count="2"><parameter name="browser" value="firefox"/> <!-- 覆蓋全局參數 --><classes><class name="com.qa.tests.LoginTest"><methods><include name="testValidLogin"/><include name="testInvalidLogin"/><exclude name="testExpiredPassword"/> <!-- 排除特定方法 --></methods></class><class name="com.qa.tests.RegistrationTest"/></classes></test><!-- 支付流程測試 - 按包運行 --><test name="Payment_Flow_Tests"><groups><run><include name="payment"/><include name="p1"/> <!-- 包含多個組 --></run></groups><packages><package name="com.qa.tests.payment.*"/> <!-- 運行包內所有測試類 --></packages></test><!-- API測試套件 --><test name="API_Tests" enabled="true"> <!-- enabled可控制是否執行此test --><parameter name="base_url" value="https://api.ecommerce.com/v1"/><classes><class name="com.qa.api.tests.UserAPITest"/><class name="com.qa.api.tests.ProductAPITest"/><class name="com.qa.api.tests.OrderAPITest"/></classes></test></suite>