使用TestNG进行Parellel测试 - 测试仅在一个浏览器上运行

时间:2016-02-07 04:01:07

标签: java selenium-webdriver automated-tests testng testng-dataprovider

我已经创建了一个测试套件 DataProvider的 的DataFactory 我的TestNG文件正在发送浏览器详细信息作为参数。在testNG XML中,我正在调用我的数据工厂类。我也在使用browsestack进行测试(虽然我怀疑这与我所遇到的问题有关)

当我没有将parrellel =“true”添加到testng文件时,测试运行没有任何问题。

我觉得它与每个浏览器使用的相同驱动程序有关,但我现在还不能解决这个问题。

感谢任何指导。

这是代码。

的testng.xml

<suite name="Suite" verbose="1" parallel="tests">
  <!-- Test with Chrome -->
  <test name="ChromeTest" group-by-instances="true"> 
    <parameter name="browser" value="Chrome"></parameter>
    <parameter name="browserVersion" value="47"></parameter>
    <parameter name="platform" value="Windows"></parameter>
    <parameter name="platformVersion" value="7"></parameter>
    <classes>
      <class name="Resources.TestFactory"/>
    </classes>
  </test> 

  <!-- Test with Firefox -->
  <test name="FirefoxTest" group-by-instances="true"> 
    <parameter name="browser" value="Firefox"></parameter>
    <parameter name="browserVersion" value="43"></parameter>
    <parameter name="platform" value="Windows"></parameter>
    <parameter name="platformVersion" value="7"></parameter>
    <classes>
      <class name="Resources.TestFactory"/>
    </classes>
  </test> 

</suite> 

数据工厂类

public class TestFactory {
     @Factory(dataProvider = "LoginCredentials", dataProviderClass=TestData.class)
     public Object[] createInstances(int testNo, String userName, String password) {
         Object[] result = new Object[1];
         int i=0;
         System.out.println("Inside LoginCredentials Factory - " + userName + "---" + password);

         if(testNo==1){
             result[i] = new Test_BookingEngine_Login(userName, password);
             i++;
             System.out.println("Object Array : " + Arrays.deepToString(result));
         }
         else if(testNo==2){
             result[i] = new Test_BookingManagement_OpenBooking(userName);
             i++;
             System.out.println("Object Array : " + Arrays.deepToString(result));
         }
         System.out.println("outside for");
         return result;
     }
}

套件 - 驱动程序初始化

@BeforeTest
    @Parameters(value ={"browser", "browserVersion", "platform", "platformVersion"}) 
    public void initBrowser(String browser, String browserVersion, String platform, String platformVersion) throws Exception{

//Initializing browser in cloud
                cloudCaps = new DesiredCapabilities();
                cloudCaps.setCapability("browser", browser);
                cloudCaps.setCapability("browser_version", browserVersion);
                cloudCaps.setCapability("os", platform);
                cloudCaps.setCapability("os_version", platformVersion);
                cloudCaps.setCapability("browserstack.debug", "true");
                cloudCaps.setCapability("browserstack.local", "true");

                driver = new RemoteWebDriver(new URL(URL), cloudCaps);

}

样本测试

 public Test_BookingEngine_Login(String userName, String password) {  
        this.userName = userName;  
        this.password = password;  
    }  

    @Test (groups = {"Login"})
    public void testHomePageAppearCorrect() throws InterruptedException{

        //Starting test and assigning test category
        test = logger.startTest("Login to Temptation", "<b>Successful user login or Pop up advising incorrect login details</b><br/><br/>" + browserInfo)
        .assignCategory("Regression", "Booking Engine")
        .assignAuthor("Dinesh Cooray");

        System.out.println("Inside login test");
        System.out.println("Browser inside login test : ");

        driver.get("http://dev-thor2.tempoholidays.com/");
        test.log(LogStatus.INFO, "HTML", "Navigated to http://dev-thor2.tempoholidays.com/");

        //create Login Page object
        objLogin = new BookingEngine_Login(driver);

        //login to application
        objLogin.loginToTemptationBookingEngine(userName, password, test);

        //check if alert advising username or password is is incorrect
        try {
                //incorrect login details, user should not allow login
                if(driver.switchTo().alert().getText().toLowerCase().contains("user name or password is wrong")){
                    test.log(LogStatus.INFO, "HTML", "<b>Popup - </b>" + driver.switchTo().alert().getText());
                    driver.switchTo().alert().accept();
                    Assert.assertTrue(true);
            }
        }

1 个答案:

答案 0 :(得分:1)

我猜RemoteWebDriver driver;将是您在班级添加的一行。 发生的事情是你已经在类级别声明了变量。即内存已经分配给它。当你做这样的事情driver = new RemoteWebDriver(new URL(URL), cloudCaps);时,你只是在每个@BeforeTest中设置和重置相同变量的值

您需要做的是创建一个工厂,该工厂将根据您传递给它的参数返回RemoteWebDriver实例。实际上,工厂将创建一个新对象,并仅在现有对象不存在时返回。 在@Test Methods

中声明并初始化驱动程序(来自工厂)

工厂的示例代码类似于

static RemoteWebDriver firefoxDriver;
static RemoteWebDriver someOtherDriver;


static synchronized RemoteWebDriver getDriver(String browser, String browserVersion, String platform, String platformVersion)
{
if (browser == 'firefox')
{
  if (firefoxDriver == null)
  {
                DesiredCapabilities cloudCaps = new DesiredCapabilities();
                cloudCaps.setCapability("browser", browser);
                cloudCaps.setCapability("browser_version", browserVersion);
                cloudCaps.setCapability("os", platform);
                cloudCaps.setCapability("os_version", platformVersion);
                cloudCaps.setCapability("browserstack.debug", "true");
                cloudCaps.setCapability("browserstack.local", "true");

                firefoxDriver = new RemoteWebDriver(new URL(URL),cloudCaps); 
}
}
else
{
if (someOtherDriver == null)
  {
                 DesiredCapabilities cloudCaps = new DesiredCapabilities();
                cloudCaps.setCapability("browser", browser);
                cloudCaps.setCapability("browser_version", browserVersion);
                cloudCaps.setCapability("os", platform);
                cloudCaps.setCapability("os_version", platformVersion);
                cloudCaps.setCapability("browserstack.debug", "true");
                cloudCaps.setCapability("browserstack.local", "true");

                someOtherDriver = new RemoteWebDriver(new URL(URL),cloudCaps); 
}
return someOtherDriver;
}
}
}
相关问题