有没有办法用testng在class级别声明一个参数
Is there a way to declare a parameter at class level with testng
我正在努力使用 testNG 在 class 级别声明参数。我有一个 browser
参数,在方法级别声明时可以正常工作。
因为我将测试映射到 Cucumber 步骤定义并将在方法级别声明一个 url
参数,所以我想将浏览器参数从方法中移到 class (全球)水平。因此,在 xml 文件中,我将浏览器参数从测试级别移动到套件级别,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="5">
<!-- Parametter moved to suite level -->
<parameter name="Browser" value="CHROME"/>
<parameter name="Browser" value="FF"/>
<test name="Chrome Test">
<classes>
<class name="tests.web.WebTest"/>
</classes>
</test>
<test name="Firefox Test">
<classes>
<class name="tests.web.WebTest"/>
</classes>
</test>
</suite>
然后在测试 class 中,我从方法中删除了 browser
参数并添加到 class
并将 browser
声明为 public static
。可悲的是,在运行时无法找到浏览器,导致 NullPointerException
:
@Parameters("Browser") //parameter declared at class level
public class WebTest {
WebDriver driver = null;
BasePageWeb basePage;
public static String browser; //class variable
@BeforeClass
public void navigateToUrl() {
switch (browser) { //NullpointerException thrown here
case "CHROME":
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
break;
case "FF":
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver();
break;
default:
driver = null;
break;
}
driver.get("www.google.com");
}
如何在class级别成功声明browser
参数?
对于参数注释 METHOD
、CONSTRUCTOR
、TYPE
目标 ElementTypes 已定义。
@Retention(RUNTIME)
@Target({METHOD, CONSTRUCTOR, TYPE})
public @interface Parameters {|
...
TYPE
表示它可能定义在 class 级别。
并且我试图找到具有这种用法的任何示例,并且还尝试使它自己工作(也尝试分配给静态变量)。
但运气不好..
所以我可以建议这个替代方案(为 CONSTRUCTOR
定义@Parameter):
public class WebTest {
public String browser;
@Parameters({ "Browser" })
public WebTest(String browser) {
this.browser = browser;
}
...
}
和xml似乎是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="5">
<test name="Chrome Test">
<parameter name="Browser" value="CHROME"/>
<classes>
<class name="tests.web.WebTest"/>
</classes>
</test>
<test name="Firefox Test">
<parameter name="Browser" value="FF"/>
<classes>
<class name="tests.web.WebTest"/>
</classes>
</test>
</suite>
我正在努力使用 testNG 在 class 级别声明参数。我有一个 browser
参数,在方法级别声明时可以正常工作。
因为我将测试映射到 Cucumber 步骤定义并将在方法级别声明一个 url
参数,所以我想将浏览器参数从方法中移到 class (全球)水平。因此,在 xml 文件中,我将浏览器参数从测试级别移动到套件级别,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="5">
<!-- Parametter moved to suite level -->
<parameter name="Browser" value="CHROME"/>
<parameter name="Browser" value="FF"/>
<test name="Chrome Test">
<classes>
<class name="tests.web.WebTest"/>
</classes>
</test>
<test name="Firefox Test">
<classes>
<class name="tests.web.WebTest"/>
</classes>
</test>
</suite>
然后在测试 class 中,我从方法中删除了 browser
参数并添加到 class
并将 browser
声明为 public static
。可悲的是,在运行时无法找到浏览器,导致 NullPointerException
:
@Parameters("Browser") //parameter declared at class level
public class WebTest {
WebDriver driver = null;
BasePageWeb basePage;
public static String browser; //class variable
@BeforeClass
public void navigateToUrl() {
switch (browser) { //NullpointerException thrown here
case "CHROME":
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
break;
case "FF":
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver();
break;
default:
driver = null;
break;
}
driver.get("www.google.com");
}
如何在class级别成功声明browser
参数?
对于参数注释 METHOD
、CONSTRUCTOR
、TYPE
目标 ElementTypes 已定义。
@Retention(RUNTIME)
@Target({METHOD, CONSTRUCTOR, TYPE})
public @interface Parameters {|
...
TYPE
表示它可能定义在 class 级别。
并且我试图找到具有这种用法的任何示例,并且还尝试使它自己工作(也尝试分配给静态变量)。
但运气不好..
所以我可以建议这个替代方案(为 CONSTRUCTOR
定义@Parameter):
public class WebTest {
public String browser;
@Parameters({ "Browser" })
public WebTest(String browser) {
this.browser = browser;
}
...
}
和xml似乎是:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="5">
<test name="Chrome Test">
<parameter name="Browser" value="CHROME"/>
<classes>
<class name="tests.web.WebTest"/>
</classes>
</test>
<test name="Firefox Test">
<parameter name="Browser" value="FF"/>
<classes>
<class name="tests.web.WebTest"/>
</classes>
</test>
</suite>