如何在 TestNG 套件中检索所有测试方法名称?
TestNG 支持原生依赖注入。它允许在方法中声明额外的参数。在运行时,TestNG 会自动使用正确的值填充这些参数。以下是一组 TestNG 中的原生依赖项:
- ITestContext
- XmlTest
- Method
- ITestResult
这些依赖项有助于检索测试方法的名称。如果用户想要检索所有将要执行的测试方法的名称,那么最佳位置是 **@BeforeSuite** 或 **@AfterSuite**。
**@BeforeSuite** 和 **@AfterSuite** 仅支持 **ITestContext**。这些依赖项的完全访问权限如下所示:
注解 | ITestContext | XmlTest | Method | ITestResult |
---|---|---|---|---|
BeforeSuite | 是 | 否 | 否 | 否 |
BeforeTest | 是 | 是 | 否 | 否 |
BeforeGroups | 是 | 是 | 否 | 否 |
BeforeClass | 是 | 是 | 否 | 否 |
BeforeMethod | 是 | 是 | 是 | 是 |
Test | 是 | 否 | 否 | 否 |
AfterMethod | 是 | 是 | 是 | 是 |
AfterClass | 是 | 是 | 否 | 否 |
AfterGroups | 是 | 是 | 否 | 否 |
AfterTest | 是 | 是 | 否 | 否 |
AfterSuite | 是 | 否 | 否 | 否 |
在本文中,我们将使用 Method 依赖项来演示如何检索所有测试方法的名称。
场景 1
假设用户希望在执行之前检索所有测试方法的名称。在这种情况下,代码将写入 **@BeforeSuite** 中以检索将在套件中执行的所有测试方法的名称。
由于 **@BeforeSuite** 首先执行并且对于测试套件仅执行一次,因此所有测试方法的名称将在执行之前打印。
解决此问题的方法/算法
**步骤 1** - 创建两个 TestNG 类,**NewTestngClass** 和 **OrderofTestExecutionInTestNG**。
**步骤 2** - 在任一类中的 **@BeforeSuite** 内写入以下代码;我们将在 **NewTestngClass** 内写入:
public void name(ITestContext context) { System.out.println("in beforeSuite of NewTestngClass"); ITestNGMethod[] a = context.getAllTestMethods(); for (ITestNGMethod b : a) { System.out.println(b.getConstructorOrMethod().getName()); } }
**注意** - **getAllTestMethods()** 将所有测试方法的名称作为对象获取,而 **getName()** 则分别获取测试方法的名称。
**步骤 3** - 在两个类 **NewTestngClass** 和 **OrderofTestExecutionInTestNG** 中编写两个不同的 @Test 方法。
**步骤 4** - 现在创建如下所示的 **testNG.xml** 来运行 TestNG 类。
**步骤 5** - 最后,运行 **testNG.xml** 或在 IDE 中直接运行 TestNG 类,或者使用命令行进行编译和运行。
示例
对通用 TestNG 类 **NewTestngClass** 使用以下代码
src/ NewTestngClass.java
import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.testng.ITestContext; public class NewTestngClass { @Test public void testCase1() { System.out.println("in test case 1 of NewTestngClass"); } @Test public void testCase2() { System.out.println("in test case 2 of NewTestngClass"); } @BeforeSuite public void name(ITestContext context) { System.out.println("in beforeSuite of NewTestngClass"); ITestNGMethod[] a = context.getAllTestMethods(); for (ITestNGMethod b : a) { System.out.println(b.getConstructorOrMethod().getName()); } } }
src/OrderofTestExecutionInTestNG.java
import org.testng.annotations.Test; public class OrderofTestExecutionInTestNG { // test case 1 @Test public void testCase3() { System.out.println("in test case 3 of OrderofTestExecutionInTestNG"); } // test case 2 @Test public void testCase4() { System.out.println("in test case 4 of OrderofTestExecutionInTestNG"); } }
testng.xml
这是一个配置文件,用于组织和运行 TestNG 测试用例。当需要执行有限的测试而不是完整的套件时,它非常方便。
<?xml version = "1.0" encoding = "UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name = "Suite1"> <test name = "test1"> <classes> <class name = "NewTestngClass"/> <class name = "OrderofTestExecutionInTestNG"/> </classes> </test> </suite>
输出
in beforeTest of NewTestngClass testCase1 testCase2 testCase3 testCase4 in test case 1 of NewTestngClass in test case 2 of NewTestngClass in test case 3 of OrderofTestExecutionInTestNG in test case 4 of OrderofTestExecutionInTestNG =============================================== Suite1 Total tests run: 4, Passes: 4, Failures: 0, Skips: 0 ===============================================
场景 2
假设用户希望在执行后检索所有测试方法的名称。在这种情况下,代码将写入 **@AfterSuite** 中以检索在套件中执行的所有测试方法的名称。
由于 **@AfterSuite** 在最后执行并且对于测试套件仅执行一次,因此所有测试方法的名称将在执行后打印。
解决此问题的方法/算法
**步骤 1** - 创建两个 TestNG 类,**NewTestngClass** 和 **OrderofTestExecutionInTestNG**。
**步骤 2** - 在任一类中的 **@AfterSuite** 内写入以下代码;我们将在 **NewTestngClass** 内写入:
public void name(ITestContext context) { System.out.println("in beforeSuite of NewTestngClass"); ITestNGMethod[] a = context.getAllTestMethods(); for (ITestNGMethod b : a) { System.out.println(b.getConstructorOrMethod().getName()); } }
**注意** - **getAllTestMethods()** 将所有测试方法的名称作为对象获取,而 **getName()** 则分别获取测试方法的名称。
**步骤 3** - 在两个类 **NewTestngClass** 和 **OrderofTestExecutionInTestNG** 中编写两个不同的 @Test 方法。
**步骤 4** - 现在创建如下所示的 **testNG.xml** 来运行 TestNG 类。
**步骤 5** - 最后,运行 **testNG.xml** 或在 IDE 中直接运行 TestNG 类,或者使用命令行进行编译和运行。
程序代码
对通用 TestNG 类 **NewTestngClass** 使用以下代码:
src/ NewTestngClass.java
import org.testng.annotations.AfterSuite; import org.testng.annotations.Test; import org.testng.ITestContext; public class NewTestngClass { @Test public void testCase1() { System.out.println("in test case 1 of NewTestngClass"); } @Test public void testCase2() { System.out.println("in test case 2 of NewTestngClass"); } @AfterSuite public void name(ITestContext context) { System.out.println("in AfterSuite of NewTestngClass"); ITestNGMethod[] a = context.getAllTestMethods(); for (ITestNGMethod b : a) { System.out.println(b.getConstructorOrMethod().getName()); } } }
src/OrderofTestExecutionInTestNG.java
import org.testng.annotations.Test; public class OrderofTestExecutionInTestNG { // test case 3 @Test public void testCase3() { System.out.println("in test case 3 of OrderofTestExecutionInTestNG"); } // test case 4 @Test public void testCase4() { System.out.println("in test case 4 of OrderofTestExecutionInTestNG"); } }
testng.xml
这是一个配置文件,用于组织和运行 TestNG 测试用例。当需要执行有限的测试而不是完整的套件时,它非常方便。
<?xml version = "1.0" encoding = "UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" 7gt; <suite name = "Suite1"> <test name = "test1"> <classes> <class name = "NewTestngClass"/> <class name = "OrderofTestExecutionInTestNG"/> </classes> </test> </suite>
输出
in test case 1 of NewTestngClass in test case 2 of NewTestngClass in test case 3 of OrderofTestExecutionInTestNG in test case 4 of OrderofTestExecutionInTestNG in AfterTest of NewTestngClass testCase1 testCase2 testCase3 testCase4 =============================================== Suite1 Total tests run: 4, Passes: 4, Failures: 0, Skips: 0 ================================================