参数在TestNG中传递默认值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了参数在TestNG中传递默认值相关的知识,希望对你有一定的参考价值。

我正面临着这个奇怪的问题。在写这篇文章之前,我已经对此做了一些研究,但无法解决这个问题。

我正在传递参数,但它采用参数的默认值,即“无值”。

这是我的代码

package rough;


import org.testng.annotations.AfterMethod;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.Assert;

import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;

import org.junit.*;

import static org.hamcrest.CoreMatchers.*;

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.ui.Select;

public class Browsers {
    private WebDriver driver;
    private String baseUrl;
    private boolean acceptNextAlert = true;
    private StringBuffer verificationErrors = new StringBuffer();

    @BeforeMethod
    public void tearDown1() throws Exception {
        System.out.println("Hello starting");

    }
    @Test
    @Parameters({ "BROWSER" })
    public void setUp(@Optional String BROWSER) throws Exception {

        if(BROWSER.equalsIgnoreCase("FF"))
        {   
            driver = new FirefoxDriver();
        }
        else
        if(BROWSER.equalsIgnoreCase("IE"))
        {    
            System.setProperty("webdriver.ie.driver", "g:/Selenium Jar Files/IEDriverServer.exe");
            driver = new InternetExplorerDriver();
        }

        baseUrl = "http://book.theautomatedtester.co.uk/";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

        System.out.println("Hello starting1111");
        driver.get(baseUrl+"/chapter1");
        driver.findElement(By.id("radiobutton")).click();
        Select(driver.findElement(By.id("selecttype"))).selectByVisibleText("Selenium RC");
    }

    @AfterMethod
    public void tearDown() throws Exception {

        String verificationErrorString = verificationErrors.toString();
        if (!"".equals(verificationErrorString)) {
            Assert.fail(verificationErrorString);
        }
    }

    private boolean isElementPresent(By by) {
        try {
            driver.findElement(by);
            return true;
        } catch (NoSuchElementException e) {
            return false;
        }
    }

    private boolean isAlertPresent() {
        try {
            driver.switchTo().alert();
            return true;
        } catch (NoAlertPresentException e) {
            return false;
        }
    }

    private String closeAlertAndGetItsText() {
        try {
            Alert alert = driver.switchTo().alert();
            String alertText = alert.getText();
            if (acceptNextAlert) {
                alert.accept();
            } else {
                alert.dismiss();
            }
            return alertText;
        } finally {
            acceptNextAlert = true;
        }
    }
}

这里使用的XML是

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="True">
  <test name="Test">
  <parameter name = "BROWSER" value="FF"/>
    <classes>
          <class name="rough.Browsers"/>
    </classes>
    <test name="Test">
    <parameter name = "BROWSER" value="IE"/>
    <classes>
       <class name="rough.Browsers"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

当我运行代码时出现此错误:

[TestNG] Running:
  C:UsersAdministratorAppDataLocalTemp	estng-eclipse-2137105747	estng-customsuite.xml

Hello starting
FAILED: setUp("not-found")
java.lang.NullPointerException
    at rough.Browsers.setUp(Browsers.java:55)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
    at org.testng.TestRunner.privateRun(TestRunner.java:767)
    at org.testng.TestRunner.run(TestRunner.java:617)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
    at org.testng.SuiteRunner.run(SuiteRunner.java:240)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
    at org.testng.TestNG.run(TestNG.java:1057)
    at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
答案

从testng文档中可以看出@optional是如何使用的。

@Parameters("db")
@Test
public void testNonExistentParameter(@Optional("mysql") String db) { ... }

If no parameter named "db" is found in your testng.xml file, your test method will receive the default value specified inside the @Optional annotation: "mysql".

请尝试相应地更正您的代码。我认为应该解决这个问题。如果它仍然没有,那么在testng.xml中的套件标签级别声明参数并测试它。

以上是关于参数在TestNG中传递默认值的主要内容,如果未能解决你的问题,请参考以下文章

TestNG 参数在值中声明变量问题

无法使用 Cucumber 和 TestNG 在 xml 文件上传递参数

使用TestNG运行代码时出现空指针异常

如何从maven传递java代码一个参数进行测试

如何简化 testng XML 文件中的参数传递?

Jenkins参数化构建 - Maven Command Line传递TestNG的参数