TestNG中参数传递默认值

5

我遇到了奇怪的问题。在写这里之前,我已经做了一些研究,但是无法解决这个问题。

我正在传递参数,但它正在使用参数的默认值,即“no-Value”。

这是我的代码

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:\Users\Administrator\AppData\Local\Temp\testng-eclipse-2137105747\testng-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)

有人可以帮我吗?我不明白为什么会得到“无值”。 - Learner
我看到了这个参数:Exception in thread "main" com.beust.jcommander.ParameterException: Unknown option: -serport。 - Vish
1个回答

16

从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中的suite标记级别声明参数并测试它。

我看到了这个参数:Exception in thread "main" com.beust.jcommander.ParameterException: Unknown option: -serport 你有什么想法吗? - Vish
假设该方法接受一个 Database 类而不是 String db,那么我们仍然可以使用 Optional 吗? - MasterJoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接