ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# TestNG `@Parameters` – 测试参数示例 > 原文: [https://howtodoinjava.com/testng/testng-parameters/](https://howtodoinjava.com/testng/testng-parameters/) [TestNG](https://howtodoinjava.com/java-testng-tutorials/) 的重要功能之一是参数化。 此功能允许用户**将参数作为参数**传递给测试。 通过使用 testng `@Parameters`注解支持此功能。 我们可以通过两种方式为 testng 测试提供参数值。 1. 通过`testng.xml` XML 配置文件 2. 通过`DataProviders` > `@Parameters`注解可用于任何`@Before`,`@After`,`@Factory`和`@Test`注解方法。 它可以用于初始化变量并将其用于类,测试中,也可以用于整个测试执行。 ## 1\. TestNG `@Parameters` – 使用`testng.xml`测试参数 如果需要在运行时将一些简单的值(例如`String`类型)传递给测试方法,则可以使用这种通过 testng XML 配置文件发送参数值的方法。 您必须使用`@Parameters`注解将参数值传递给测试方法。 ```java @Parameters({ "param-name" }) ``` 让我们编写一个简单的示例,通过 XML 配置文件将参数传递给测试方法。 #### 1.1 测试 在下面的测试中,我们创建了一个包含多个方法的测试类,这些方法接受来自 testng 的参数。 在 testng XML 文件中的套件级别和测试级别都设置了参数值。 如果在套件级别定义,则在测试级别定义的任何参数值都将覆盖具有相同名称的参数值。 您可以在测试方法`prameterTestThree()`的测试三中看到这一点。 ```java 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" }) @Test public 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" }) @Test public 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" }) @Test public 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`文件添加到项目根目录,并将以下代码放入其中。 在这里,我们定义要传递的参数值。 ```java <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`运行以上测试。 以上测试运行的输出如下: ```java [TestNG] Running: C:\somepath\testng.xml Test one suite param is: suite level parameter Test two param is: Test two parameter Test three suite param is: overiding suite parameter Test three param is: test three parameter =============================================== Parameter test Suite Total tests run: 3, Failures: 0, Skips: 0 =============================================== ``` 从测试结果中可以看出,只有`timeTestTwo()`被执行,因为它的执行时间少于`testng.xml`文件中定义的超时时间。 `timeTestOne()`执行被取消,因为完成所需的时间超过配置的超时时间。 ## 2\. TestNG `@Parameters` – 可选参数 TestNG 还提供了提供**可选参数**的选项,如果在定义的文件中找不到参数值,则将使用此值。 #### 2.1 使用`@Optional`注解进行测试 要传递可选参数,请使用`@Optional`注解。 ```java 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" }) @Test public 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`”的参数。 ```java <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 演示 将以上代码作为测试套件运行的输出为: ```java [TestNG] Running: C:\somepath\testng.xml This is: optional value This is: passed from xml =============================================== Optional test Suite Total tests run: 2, Failures: 0, Skips: 0 =============================================== ``` 从先前的测试结果可以看出,TestNG 在第一次执行测试时就将可选值传递给了测试方法。 发生这种情况是因为 TestNG 在第一次测试中无法在 XML 文件中找到名为`optional-value`的参数。 在第二次测试期间,它在 XML 中找到了参数值,并将该值传递给执行过程中的测试方法。 学习愉快!