我正在与SauceLab和Jenkins使用一个TestNG脚本。我坚持一个问题。当我从Jenkins运行项目时,我将从那里选择浏览器,因此可以将其与“ dataProvider”一起使用,但是dataProvider仅与@Test批注一起使用,我想将dataProvider与@before一起使用。

脚步:


@Before将初始化驱动程序(Webdriver)对象。
@Test与执行带有驱动程序对象的第一个测试用例。
@Test(2nd)与具有相同驱动程序对象的第二个测试用例一起执行。


public class test
{
    Webdriver driver;

    // Over here I want to use @Before
    @Test(dataProvider = "dynamicParameters", priority = 0, alwaysRun = true)
    public void init(String browser, String version, String os, Method method) throws Exception
    {
        System.out.println("Init Method");
        String BASE_URL = System.getProperty("baseUrl");
        PCRUtils pcrUtils = new PCRUtils();
        driver = pcrUtils.createDriver(browser, version, os, method.getName());

        driver.get(BASE_URL);
        driver.manage().window().maximize();
        Thread.sleep(50000);
     }

     @Test(priority = 1)
     public void verifyTitle() throws InterruptedException
     {
        AccountPage accountPage = new AccountPage();
        accountPage.verifyTitle(driver);
     }
}

最佳答案

TestNG的“ @before”方法不能直接与@DataProvider一起使用。

@BeforeMethod可以访问参数列表(TestNG - 5.18.1 - Native dependency injection):


  任何@BeforeMethod都可以声明Object[]类型的参数。此参数将接收即将馈入即将到来的测试方法的参数列表,该列表可以由TestNG注入,例如java.lang.reflect.Method或来自@DataProvider


但是@BeforeMethod“将在每个测试方法之前运行”,而您想要的更像@BeforeClass,它“将在调用当前类中的第一个测试方法之前运行”(TestNG - 2 - Annotations)。不幸的是,@BeforeClass无法像@BeforeMethod一样通过TestNG的本机依赖项注入来访问参数列表。

但是,可以使用@Factory通过@DataProvider完成数据驱动的初始设置。例如。:

public class test
{
    WebDriver driver;

    @Factory(dataProvider = "dynamicParameters")
    public test(String browser, String version, String os, Method method) throws Exception
    {
        System.out.println("Init Method");
        String BASE_URL = System.getProperty("baseUrl");
        PCRUtils pcrUtils = new PCRUtils();
        driver = pcrUtils.createDriver(browser, version, os, method.getName());

        driver.get(BASE_URL);
        driver.manage().window().maximize();
        Thread.sleep(50000);
    }

    @Test(priority = 1)
    public void verifyTitle() throws InterruptedException
    {
        AccountPage accountPage = new AccountPage();
        accountPage.verifyTitle(driver);
    }

    @Test(priority = 2)
    public void verifySomethingElse() throws InterruptedException
    {
        // execute second test case with same driver object.
    }
}


有关更多详细信息,请参见TestNG - 5.8 - Factories

关于selenium - 具有@Before testng的dataProvider,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35893294/

10-15 08:13