启动

使用testNG编写测试用例一般三个步骤:

  1. 编写测试业务逻辑并在测试代码中使用testNG的注解标记
  2. 在testng.xml文件或者build。xml中添加相关的测试信息
  3. 运行TestNg

    概念的理解

  • 一个测试套件(suite)由一个xml文件表示。它可以包含一个或多个测试,并由标记定义。
  • 测试由表示,可以包含一个或多个TestNG类。
  • TestNG类是指至少包含一个TestNG注释的java类,它由标签表示,可以包含一个或多个测试方法。
  • 测试方法是指在源代码中由@Test注解的java方法。

    常用注解

  • @BeforeSuite:被注释的方法将在该测试套件中的所有测试运行之前运行。
    @AfterSuite:该套件中所有测试都运行后,将运行带注释的方法。
    @BeforeTest:被注释的方法将在属于标签内的类的任何测试方法运行之前运行。

  • @AfterTest:在属于标签内的类的所有测试方法都运行后,将预习呢带注释的方法。
  • @BeforeGroups:对于组列表,此配置方法将在组运行之前运行。此方法保证在调用属于这些组中的任何组的第一个测试方法前不久运行。
    @AfterGroups:对于组列表,此配置方法将在组运行之后运行。此方法保证在调用属于任何这些组的最后一个测试方法后不久运行。
  • @BeforeClass:被注释的方法将在当前类中的第一个测试方法被调用之前运行。
  • @AfterClass:被注解的方法会再当前类中的所有测试方法都运行后运行。
    @BeforeMethod:注解的方法将在每个测试方法之前运行。
    @AfterMethod:注解的方法将在每个测试方法之后运行。

TestNG类的超类的注释处理:注解在于超类上时,其注解也会被子类继承。这对于一个公共父类集中多个测试类的测试很有用。
在这种情况下,TestNG保证@before注解的方法以继承的顺序执行,首先是最高的超类,然后沿着继承链向下执行,而@after以相反的顺序执行,沿着继承链向上。

常用注解参数

  • alwaysRun:对于before方法(beforeSuite、beforeTest、beforeTestClass和beforeTestMethod,但不包括beforeGroups),如果该参数设置为true,则无论哪个组,都会运行此配置方法。对于after方法(afterSuite、afterClass、…),如果该参数设置为true,即使之前调用的一个或多个方法失败或被跳过,也会运行此配置方法。
  • dependsOnGroups:此方法所依赖的组列表。
  • dependsOnMethods:此方法所依赖的方法列表。
  • enabled:是否启用此类/方法上的方法。
  • groups:该类/方法所属的组列表。
  • inheritGroups:继承组,如果该参数设置为true,则此方法将属于类级别@Test注解中指定的组
  • onlyForGroups:仅适用于@BeforeMethod 和@AfterMethod。如果指定,则仅当相应的测试方法属于列出的组之一时才会调用此前置/后置方法。

其他注解

@DataProvider

将方法注解为为测试方法提供测试数据。带注释的方法必须返回一个Object[][],其中每个Object[][]都可以分配测试方法的参数列表。想要从这个DataProvider接收数据的@Test方法需要使用一个与这个注解名称相同的dataProvider名称。
参数:

  • name:此数据提供者的名称。如果未提供,则此数据提供者的名称将自动设置为方法的名称。
  • parallel:是否并行,如果设置为 true,则使用此数据提供程序生成的测试将并行运行。默认值为false。

    @Factory

    将方法标记为工厂,该工厂返回将由 TestNG 用作测试类的对象。该方法必须返回 Object[]。

    @Listeners

    在测试类上定义侦听器。
    参数:

  • value:扩展org.testng.ITestNGListener的类数组。

    @Parameters

    描述如何将参数传递给 @Test 方法。
    参数:

  • value:用于填充此方法的参数的变量列表。

    @Test

    将类或方法标记为测试的一部分。
    参数:

  • alwaysRun:如果设置为 true,即使它依赖于失败的方法,该测试方法也将始终运行。

  • dataProvider:此测试方法的数据提供者的名称。
  • dataProviderClass:查找数据提供者的类。如果未指定,则将在当前测试方法的类或其基类之一上查找数据提供者。如果指定了此属性,则数据提供者方法需要在指定类上是静态的。
  • dependsOnGroups:此方法所依赖的组列表。
  • dependsOnMethods:此方法所依赖的方法列表。
  • description:此方法的说明。
  • enabled:是否启用此类/方法上的方法。
  • expectedExceptions:测试方法预期抛出的异常列表。如果没有抛出异常或与此列表中的异常不同,则此测试将被标记为失败。
  • groups:该类/方法所属的组列表。
  • invocationCount:应调用此方法的次数。
  • invocationTimeOut:对于所有调用计数的累积时间,此测试应花费的最大毫秒数。如果未指定 invocationCount,则此属性将被忽略。
  • priority:此测试方法的优先级。较低的优先级将首先被安排。
  • successPercentage:此方法预期的成功百分比
  • singleThreaded: 如果设置为 true,则该测试类上的所有方法都保证在同一个线程中运行,即使当前正在使用 parallel=”methods” 运行测试。此属性只能在类级别使用,如果在方法级别使用,它将被忽略。注意:此属性过去称为sequential(现在已弃用)。
  • timeOut:此测试应花费的最大毫秒数。
  • threadPoolSize:此方法的线程池大小。该方法将从 invocationCount 指定的多个线程中调用。如果未指定 invocationCount,则忽略此属性。

    testng.xml

    可以通过几种不同的方式调用TestNG:

  • 使用testng.xml

  • 使用ant
  • 使用命令行
  • IDEA插件

testng.xml的DTD文件下载:https://testng.org/testng-1.0.dtd
示例文件:

  1. <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
  2. <suite name="Suite1" verbose="1" >
  3. <test name="Nopackage" >
  4. <!-- 通过类进行执行-->
  5. <classes>
  6. <class name="NoPackageTest" />
  7. </classes>
  8. </test>
  9. <test name="Regression1">
  10. <classes>
  11. <class name="test.sample.ParameterSample"/>
  12. <class name="test.sample.ParameterTest"/>
  13. </classes>
  14. </test>
  15. </suite>
  1. <!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
  2. <suite name="Suite1" verbose="1" >
  3. <test name="Regression1" >
  4. <!-- 通过包进行执行-->
  5. <packages>
  6. <package name="test.sample" />
  7. </packages>
  8. </test>
  9. </suite>
  1. <test name="Regression1">
  2. <groups>
  3. <run>
  4. <!-- 排除、包含组-->
  5. <exclude name="brokenTests" />
  6. <include name="checkinTests" />
  7. </run>
  8. </groups>
  9. <classes>
  10. <class name="test.IndividualMethodsTest">
  11. <!-- 排除、包含方法-->
  12. <methods>
  13. <include name="testMethod" />
  14. </methods>
  15. </class>
  16. </classes>
  17. </test>

TestNG 将按照它们在 XML 文件中的顺序运行您的测试。如果您希望此文件中列出的类和方法以不可预知的顺序运行,请将preserve-order 属性设置为false

  1. <test name="Regression1" preserve-order="false">
  2. <classes>
  3. <class name="test.Test1">
  4. <methods>
  5. <include name="m1" />
  6. <include name="m2" />
  7. </methods>
  8. </class>
  9. <class name="test.Test2" />
  10. </classes>
  11. </test>

命令执行 testng.xml
这里太多,略,详情参考官方文档
image.png