# 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 中找到了参数值，并将该值传递给执行过程中的测试方法。

学习愉快！