参数在 TestNG 中传递默认值

Posted

技术标签:

【中文标题】参数在 TestNG 中传递默认值【英文标题】:Parameters is passing default value in TestNG 【发布时间】:2014-04-09 08:38:00 【问题描述】:

我正面临一个奇怪的问题。在写到这里之前,我对此进行了一些研究,但无法解决问题。

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

这是我的代码

包装粗糙; 导入 org.testng.annotations.AfterMethod; 导入 org.testng.annotations.Optional; 导入 org.testng.annotations.Parameters; 导入 org.testng.annotations.Test; 导入 org.testng.annotations.BeforeMethod; 导入 org.testng.Assert; 导入 java.util.regex.Pattern; 导入 java.util.concurrent.TimeUnit; 导入 org.junit.*; 导入静态 org.hamcrest.CoreMatchers.*; 导入 org.openqa.selenium.*; 导入 org.openqa.selenium.chrome.ChromeDriver; 导入 org.openqa.selenium.firefox.FirefoxDriver; 导入 org.openqa.selenium.ie.InternetExplorerDriver; 导入 org.openqa.selenium.support.ui.Select; 公共类浏览器 私有 WebDriver 驱动程序; 私有字符串baseUrl; 私人布尔acceptNextAlert = true; 私有 StringBuffer 验证错误 = new StringBuffer(); @BeforeMethod 公共 void tearDown1() 抛出异常 System.out.println("你好开始"); @测试 @Parameters( "浏览器" ) public void setUp(@Optional String BROWSER) 抛出异常 if(BROWSER.equalsIgnoreCase("FF")) 驱动程序 = 新的 FirefoxDriver(); 别的 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("你好,starting1111"); driver.get(baseUrl+"/chapter1"); driver.findElement(By.id("radiobutton")).click(); Select(driver.findElement(By.id("selecttype"))).selectByVisibleText("Selenium RC"); @AfterMethod public void tearDown() 抛出异常 字符串验证错误字符串 = 验证错误.toString(); if (!"".equals(verificationErrorString)) Assert.fail(verificationErrorString); 私人布尔isElementPresent(由) 尝试 driver.findElement(by); 返回真; 捕捉(NoSuchElementException e) 返回假; 私人布尔 isAlertPresent() 尝试 driver.switchTo().alert(); 返回真; 捕捉(NoAlertPresentException e) 返回假; 私人字符串 closeAlertAndGetItsText() 尝试 警报警报 = driver.switchTo().alert(); 字符串 alertText = alert.getText(); 如果(接受下一个警报) 警报.accept(); 别的 alert.dismiss(); 返回警报文本; 最后 接受下一个警报 = 真;

这里使用的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)

【问题讨论】:

谁能帮帮我,我不明白为什么我会变得“无价值” 我看到 htis 参数:线程“主”com.beust.jcommander.ParameterException 中的异常:未知选项:-serport 【参考方案1】:

根据 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 中的套件标签级别声明参数并对其进行测试。

【讨论】:

我看到 htis 参数:线程“主”com.beust.jcommander.ParameterException 中的异常:未知选项:-serport 任何想法 假设方法取的是一个类Database而不是String db,那我们还能用Optional吗?

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

在 C++ 中通过引用传递时参数的默认值

在函数反应中传递默认参数值

VB系统中默认的参数传递方式?

TestNG的參数化測试共享线程池配置參数默认值配置

vb当中,参数传递默认方式是传值?传址?还是传址和传值?

Jenkins 远程参数化构建始终使用默认参数值而不是传递的参数值