【问题标题】:dataProvider with @Before testng带有@Before testng 的dataProvider
【发布时间】:2023-03-14 20:00:01
【问题描述】:

我正在与 SauceLab 和 Jenkins 一起使用一个 TestNG 脚本。我遇到了一个问题。当我从 Jenkins 运行我的项目时,我将从那里选择浏览器,因此我可以将它与“dataProvider”一起使用,但 dataProvider 仅适用于 @Test 注释,我想将 dataProvider 与 @before 一起使用。

步骤:

  1. @Before 将初始化驱动程序(Webdriver)对象。
  2. @Test 使用驱动程序对象执行第一个测试用例。
  3. @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);
     }
}

【问题讨论】:

    标签: selenium testing jenkins testng


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 2022-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多