有没有办法用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参数?

对于参数注释 METHODCONSTRUCTORTYPE 目标 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>