TestNG 的重要功能之一是参数化。 此功能允许用户将参数作为参数传递给测试。 通过使用 testng @Parameters注解支持此功能。
我们可以通过两种方式为 testng 测试提供参数值。
- 通过
testng.xmlXML 配置文件 - 通过
DataProviders
@Parameters注解可用于任何@Before,@After,@Factory和@Test注解方法。 它可以用于初始化变量并将其用于类,测试中,也可以用于整个测试执行。
1. TestNG @Parameters – 使用testng.xml测试参数
如果需要在运行时将一些简单的值(例如String类型)传递给测试方法,则可以使用这种通过 testng XML 配置文件发送参数值的方法。 您必须使用@Parameters注解将参数值传递给测试方法。
@Parameters({ "param-name" })
让我们编写一个简单的示例,通过 XML 配置文件将参数传递给测试方法。
1.1 测试
在下面的测试中,我们创建了一个包含多个方法的测试类,这些方法接受来自 testng 的参数。 在 testng XML 文件中的套件级别和测试级别都设置了参数值。
如果在套件级别定义,则在测试级别定义的任何参数值都将覆盖具有相同名称的参数值。 您可以在测试方法prameterTestThree()的测试三中看到这一点。
package com.howtodoinjava.test;import org.testng.annotations.Parameters;import org.testng.annotations.Test;public class ParameterTest {/*** Following method takes one parameter as input. Value of the* said parameter is defined at suite level.*/@Parameters({ "suite-param" })@Testpublic void prameterTestOne(String param) {System.out.println("Test one suite param is: " + param);}/*** Following method takes one parameter as input. Value of the* said parameter is defined at test level.*/@Parameters({ "test-two-param" })@Testpublic void prameterTestTwo(String param) {System.out.println("Test two param is: " + param);}/*** Following method takes two parameters as input. Value of the* test parameter is defined at test level. The suite level* parameter is overridden at the test level.*/@Parameters({ "suite-param", "test-three-param" })@Testpublic void prameterTestThree(String param, String paramTwo) {System.out.println("Test three suite param is: " + param);System.out.println("Test three param is: " + paramTwo);}}
1.2 testng.xml
现在将testng.xml文件添加到项目根目录,并将以下代码放入其中。 在这里,我们定义要传递的参数值。
<suite name="Parameter test Suite" verbose="1"><!-- This parameter will be passed to every test in this suite --><parameter name="suite-param" value="suite level parameter" /><test name="Parameter Test one"><classes><class name="com.howtodoinjava.test.ParameterTest"><methods><include name="prameterTestOne" /></methods></class></classes></test><test name="Parameter Test two"><!-- This parameter will be passed this test only --><parameter name="test-two-param" value="Test two parameter" /><classes><class name="com.howtodoinjava.test.ParameterTest"><methods><include name="prameterTestTwo" /></methods></class></classes></test><test name="Parameter Test three"><!-- Overriding suite level parameter --><parameter name="suite-param" value="overiding suite parameter" /><!-- Test specific parameter --><parameter name="test-three-param" value="test three parameter" /><classes><class name="com.howtodoinjava.test.ParameterTest"><methods><include name="prameterTestThree" /></methods></class></classes></test></suite>
1.3 演示
现在使用testng.xml运行以上测试。 以上测试运行的输出如下:
[TestNG] Running: C:\somepath\testng.xmlTest one suite param is: suite level parameterTest two param is: Test two parameterTest three suite param is: overiding suite parameterTest three param is: test three parameter===============================================Parameter test SuiteTotal tests run: 3, Failures: 0, Skips: 0===============================================
从测试结果中可以看出,只有timeTestTwo()被执行,因为它的执行时间少于testng.xml文件中定义的超时时间。 timeTestOne()执行被取消,因为完成所需的时间超过配置的超时时间。
2. TestNG @Parameters – 可选参数
TestNG 还提供了提供可选参数的选项,如果在定义的文件中找不到参数值,则将使用此值。
2.1 使用@Optional注解进行测试
要传递可选参数,请使用@Optional注解。
package com.howtodoinjava.test;import org.testng.annotations.Optional;import org.testng.annotations.Parameters;import org.testng.annotations.Test;public class ParameterTest{@Parameters({ "optional-value" })@Testpublic void optionTest(@Optional("optional value") String value) {System.out.println("This is: " + value);}}
前面的类文件包含一个将一个参数作为输入的测试方法。 所述执行中的测试方法打印使用System.out.println方法传递到控制台的参数值。
使用 XML 文件中名为optional-value的参数将参数值传递到测试方法。 使用针对所述参数的@Optional注解定义所述参数的可选值。
2.2 使用@Optional注解进行测试
在此testng.xml文件中,上面定义了两个测试。 在第一个测试中未定义任何参数,第二个测试在其中声明了一个名为“optional-value”的参数。
<suite name="Optional test Suite" verbose="1"><test name="Optional Test one"><classes><class name="test.parameter.OptionalTest" /></classes></test><test name="Optional Test two"><parameter name="optional-value" value="passed from xml" /><classes><class name="test.parameter.OptionalTest" /></classes></test></suite>
2.3 演示
将以上代码作为测试套件运行的输出为:
[TestNG] Running: C:\somepath\testng.xmlThis is: optional valueThis is: passed from xml===============================================Optional test SuiteTotal tests run: 2, Failures: 0, Skips: 0===============================================
从先前的测试结果可以看出,TestNG 在第一次执行测试时就将可选值传递给了测试方法。 发生这种情况是因为 TestNG 在第一次测试中无法在 XML 文件中找到名为optional-value的参数。
在第二次测试期间,它在 XML 中找到了参数值,并将该值传递给执行过程中的测试方法。
学习愉快!
