原文: https://howtodoinjava.com/testng/testng-parameters/

TestNG 的重要功能之一是参数化。 此功能允许用户将参数作为参数传递给测试。 通过使用 testng @Parameters注解支持此功能。

我们可以通过两种方式为 testng 测试提供参数值。

  1. 通过testng.xml XML 配置文件
  2. 通过DataProviders

@Parameters注解可用于任何@Before@After@Factory@Test注解方法。 它可以用于初始化变量并将其用于类,测试中,也可以用于整个测试执行。

1. TestNG @Parameters – 使用testng.xml测试参数

如果需要在运行时将一些简单的值(例如String类型)传递给测试方法,则可以使用这种通过 testng XML 配置文件发送参数值的方法。 您必须使用@Parameters注解将参数值传递给测试方法。

  1. @Parameters({ "param-name" })

让我们编写一个简单的示例,通过 XML 配置文件将参数传递给测试方法。

1.1 测试

在下面的测试中,我们创建了一个包含多个方法的测试类,这些方法接受来自 testng 的参数。 在 testng XML 文件中的套件级别和测试级别都设置了参数值。

如果在套件级别定义,则在测试级别定义的任何参数值都将覆盖具有相同名称的参数值。 您可以在测试方法prameterTestThree()的测试三中看到这一点。

  1. package com.howtodoinjava.test;
  2. import org.testng.annotations.Parameters;
  3. import org.testng.annotations.Test;
  4. public class ParameterTest {
  5. /**
  6. * Following method takes one parameter as input. Value of the
  7. * said parameter is defined at suite level.
  8. */
  9. @Parameters({ "suite-param" })
  10. @Test
  11. public void prameterTestOne(String param) {
  12. System.out.println("Test one suite param is: " + param);
  13. }
  14. /**
  15. * Following method takes one parameter as input. Value of the
  16. * said parameter is defined at test level.
  17. */
  18. @Parameters({ "test-two-param" })
  19. @Test
  20. public void prameterTestTwo(String param) {
  21. System.out.println("Test two param is: " + param);
  22. }
  23. /**
  24. * Following method takes two parameters as input. Value of the
  25. * test parameter is defined at test level. The suite level
  26. * parameter is overridden at the test level.
  27. */
  28. @Parameters({ "suite-param", "test-three-param" })
  29. @Test
  30. public void prameterTestThree(String param, String paramTwo) {
  31. System.out.println("Test three suite param is: " + param);
  32. System.out.println("Test three param is: " + paramTwo);
  33. }
  34. }

1.2 testng.xml

现在将testng.xml文件添加到项目根目录,并将以下代码放入其中。 在这里,我们定义要传递的参数值。

  1. <suite name="Parameter test Suite" verbose="1">
  2. <!-- This parameter will be passed to every test in this suite -->
  3. <parameter name="suite-param" value="suite level parameter" />
  4. <test name="Parameter Test one">
  5. <classes>
  6. <class name="com.howtodoinjava.test.ParameterTest">
  7. <methods>
  8. <include name="prameterTestOne" />
  9. </methods>
  10. </class>
  11. </classes>
  12. </test>
  13. <test name="Parameter Test two">
  14. <!-- This parameter will be passed this test only -->
  15. <parameter name="test-two-param" value="Test two parameter" />
  16. <classes>
  17. <class name="com.howtodoinjava.test.ParameterTest">
  18. <methods>
  19. <include name="prameterTestTwo" />
  20. </methods>
  21. </class>
  22. </classes>
  23. </test>
  24. <test name="Parameter Test three">
  25. <!-- Overriding suite level parameter -->
  26. <parameter name="suite-param" value="overiding suite parameter" />
  27. <!-- Test specific parameter -->
  28. <parameter name="test-three-param" value="test three parameter" />
  29. <classes>
  30. <class name="com.howtodoinjava.test.ParameterTest">
  31. <methods>
  32. <include name="prameterTestThree" />
  33. </methods>
  34. </class>
  35. </classes>
  36. </test>
  37. </suite>

1.3 演示

现在使用testng.xml运行以上测试。 以上测试运行的输出如下:

  1. [TestNG] Running: C:\somepath\testng.xml
  2. Test one suite param is: suite level parameter
  3. Test two param is: Test two parameter
  4. Test three suite param is: overiding suite parameter
  5. Test three param is: test three parameter
  6. ===============================================
  7. Parameter test Suite
  8. Total tests run: 3, Failures: 0, Skips: 0
  9. ===============================================

从测试结果中可以看出,只有timeTestTwo()被执行,因为它的执行时间少于testng.xml文件中定义的超时时间。 timeTestOne()执行被取消,因为完成所需的时间超过配置的超时时间。

2. TestNG @Parameters – 可选参数

TestNG 还提供了提供可选参数的选项,如果在定义的文件中找不到参数值,则将使用此值。

2.1 使用@Optional注解进行测试

要传递可选参数,请使用@Optional注解。

  1. package com.howtodoinjava.test;
  2. import org.testng.annotations.Optional;
  3. import org.testng.annotations.Parameters;
  4. import org.testng.annotations.Test;
  5. public class ParameterTest
  6. {
  7. @Parameters({ "optional-value" })
  8. @Test
  9. public void optionTest(@Optional("optional value") String value) {
  10. System.out.println("This is: " + value);
  11. }
  12. }

前面的类文件包含一个将一个参数作为输入的测试方法。 所述执行中的测试方法打印使用System.out.println方法传递到控制台的参数值。

使用 XML 文件中名为optional-value的参数将参数值传递到测试方法。 使用针对所述参数的@Optional注解定义所述参数的可选值。

2.2 使用@Optional注解进行测试

在此testng.xml文件中,上面定义了两个测试。 在第一个测试中未定义任何参数,第二个测试在其中声明了一个名为“optional-value”的参数。

  1. <suite name="Optional test Suite" verbose="1">
  2. <test name="Optional Test one">
  3. <classes>
  4. <class name="test.parameter.OptionalTest" />
  5. </classes>
  6. </test>
  7. <test name="Optional Test two">
  8. <parameter name="optional-value" value="passed from xml" />
  9. <classes>
  10. <class name="test.parameter.OptionalTest" />
  11. </classes>
  12. </test>
  13. </suite>

2.3 演示

将以上代码作为测试套件运行的输出为:

  1. [TestNG] Running: C:\somepath\testng.xml
  2. This is: optional value
  3. This is: passed from xml
  4. ===============================================
  5. Optional test Suite
  6. Total tests run: 2, Failures: 0, Skips: 0
  7. ===============================================

从先前的测试结果可以看出,TestNG 在第一次执行测试时就将可选值传递给了测试方法。 发生这种情况是因为 TestNG 在第一次测试中无法在 XML 文件中找到名为optional-value的参数。

在第二次测试期间,它在 XML 中找到了参数值,并将该值传递给执行过程中的测试方法。

学习愉快!