Answer
@Parameters in TestNG
@Parameters lets you pass values from testng.xml into test methods or @Before*/@After* setup methods — without hardcoding environment-specific values in test code.
Step 1 — Define Parameters in testng.xml
XML
<suite name="Suite">
<parameter name="env" value="staging"/>
<parameter name="baseUrl" value="https://staging.automateqa.online"/>
<parameter name="browser" value="chrome"/>
<test name="SmokeTests">
<parameter name="emailUser" value="smoke@test.com"/>
<parameter name="emailPass" value="smoke123"/>
<classes>
<class name="tests.LoginTest"/>
</classes>
</test>
</suite>
Step 2 — Read in Test Class
Java
public class LoginTest extends BaseTest {
@Parameters({"browser"})
@BeforeMethod
public void setUp(String browser) {
// browser = "chrome" from testng.xml
initDriver(browser);
}
@Parameters({"baseUrl", "emailUser", "emailPass"})
@Test
public void loginTest(String baseUrl, String email, String password) {
driver.get(baseUrl + "/login");
driver.findElement(By.id("email")).sendKeys(email);
driver.findElement(By.id("password")).sendKeys(password);
driver.findElement(By.id("loginBtn")).click();
Assert.assertTrue(driver.getTitle().contains("Dashboard"));
}
}
@Optional — Default Values
Java
@Parameters({"browser"})
@BeforeMethod
public void setUp(@Optional("chrome") String browser) {
// Uses "chrome" if "browser" parameter not defined in testng.xml
initDriver(browser);
}
Multi-Environment testng.xml Files
XML
<!-- testng-staging.xml -->
<suite name="Staging Suite">
<parameter name="baseUrl" value="https://staging.automateqa.online"/>
<parameter name="env" value="staging"/>
</suite>
<!-- testng-prod.xml -->
<suite name="Prod Suite">
<parameter name="baseUrl" value="https://automateqa.online"/>
<parameter name="env" value="production"/>
</suite>
Run for specific environment:
Bash
mvn test -DsuiteXmlFile=testng-staging.xml
mvn test -DsuiteXmlFile=testng-prod.xml
Cross-Browser Matrix
XML
<suite name="CrossBrowserSuite" parallel="tests" thread-count="3">
<test name="Chrome">
<parameter name="browser" value="chrome"/>
<classes><class name="tests.LoginTest"/></classes>
</test>
<test name="Firefox">
<parameter name="browser" value="firefox"/>
<classes><class name="tests.LoginTest"/></classes>
</test>
<test name="Edge">
<parameter name="browser" value="edge"/>
<classes><class name="tests.LoginTest"/></classes>
</test>
</suite>
@Parameters vs @DataProvider
| Aspect | @Parameters | @DataProvider |
|---|---|---|
| Data source | testng.xml | Java method (array) |
| Multiple data sets | No | Yes |
| Runtime override | Maven -D flags | Code change needed |
| Use case | Config values, env, browser | Functional data sets |
