testng.xml - 指南

一、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>
posted @ 2025-09-05 18:46  yjbjingcha  阅读(13)  评论(0)    收藏  举报