使用基本测试类时的TestNg并行测试/类

时间:2018-08-28 09:36:04

标签: selenium testing parallel-processing testng

我正在尝试使用TestNg并行运行测试。我有3个类(两个扩展BaseTest类的测试类)

BaseTest类只有“设置”内容和“拆卸”内容,

当我尝试以这种方式并行运行测试时,将运行一个带有测试的类,而对于其他类,仅打开浏览器(但不执行测试)

但是!!当我从BaseTest类中剪切代码并将其直接放置到我的每个测试类中(从而不扩展BaseClass)时,代码就会起作用并且测试并行运行

为什么?我根本不做任何代码更改...并且当我希望不并行运行测试(只是一个接一个地运行)时,使用BaseTest类的扩展就可以了

在testing.xml中尝试放置parallel =“ methods”“ tests”,“ true” ...

下面是我的课程和testing.xml


public class BaseTest {

    public static WebDriver driver;
    public static WebDriverWait wait;

    @BeforeClass
    public static void setup() {
        System.setProperty("webdriver.gecko.driver", System.getProperty("user.dir") + "\\src\\files\\geckodriver.exe");

        driver = new FirefoxDriver();

        wait = new WebDriverWait(driver, 10);

        driver.manage().window().maximize();
    }

    @AfterClass
    public static void teardown() {
        driver.quit();
    }
}

-----------------------
public class HomePageHotelsSearchTest extends BaseTest {

    @Test
    public void giveNameProperly() throws IOException {
        HomePage homePage = new HomePage(driver, wait);

        homePage.openUrl("https://www.phptravels.net/");

        homePage.openHotelsSearchTab();
        homePage.inputCityInHotelsSearch("London");
        homePage.selectCityFromSearchResult(0);
        homePage.inputCheckInDateInHotelsSearch("23/08/2018");
        homePage.inputCheckOutDateInHotelsSearch("27/08/2018");
        homePage.openPeopleAmountTabInHotelsSearch();
        homePage.addAdultsInHotelsSearch(1);
        homePage.startSearchingHotels();
        homePage.elementClickable(By.linkText("Grand Plaza Apartments"));

        String firstResult = homePage.readText(By.linkText("Grand Plaza Apartments"));
        Assert.assertEquals("Grand Plaza Apartments", firstResult);

        //Reporter.log("Test owned!", true);

    }

}

-----------------------
public class LoginTest extends BaseTest {

    @Test
    public void loginTest() throws InterruptedException, IOException {
        HomePage homePage = new HomePage(driver, wait);

        homePage.openUrl("https://www.phptravels.net/");


        LoginPage loginPage = homePage.goToLoginPage();
        loginPage.waitForPageToLoad("Login");
        loginPage.inputEmail("user@phptravels.com");
        loginPage.inputPassword("demouser");

        loginPage.login();

        loginPage.waitForPageToLoad("My Account");

        String myAccountPageTitle = driver.getTitle();
        Assert.assertEquals(myAccountPageTitle, "My Account");

        //Reporter.log("Test owned!", true);


    }

}

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >
    <suite name="Suite" thread-count="2" parallel="true">
        <test name="test1">
            <classes>
                <class name="tests.LoginTest" />
                <class name="tests.HomePageHotelsSearchTest"/>
            </classes>
        </test>
    </suite>

2 个答案:

答案 0 :(得分:0)

您必须在每个将要调用Execute的类中定义TestNG批注。您不能在BaseTest中定义@BeforeClass @AfterClass批注。您可以调用的是BaseTest方法。使用示例引用代码:

public class BaseTest {

    public WebDriver driver;
    public WebDriverWait wait;

    public void setup() {
        ....
    }

    public void teardown() {
        driver.quit();
    }
}

 public class HomePageHotelsSearchTest extends BaseTest {    

    @BeforeClass
    public void startTest(){
    setup(); 
    }

    @Test
    public void giveNameProperly() {
            ...
    }

    @AfterClass
    public void stopTest(){
    teardown();
    }
}

您可以在没有对象的情况下直接调用BaseTest方法,因为扩展了BaseTest类。


 public class HomePageHotelsSearchTest {

    BaseTest testObj = new BaseTest();

    @BeforeClass
    public void startTest(){
    testObj.setup(); 
    }

    @Test
    public void giveNameProperly() {
            ...
    }

    @AfterClass
    public void stopTest(){
    testObj.teardown();
    }    
 }

如果不扩展BaseTest类,则需要引用对象来调用这些方法。

因此,在每个类中必须有@BeforeClass和@AfterClass批注,因此TestNG将在@Test执行之前调用它。

答案 1 :(得分:0)

谢谢大家的快速答复,它现在正在工作:-)

好吧,基本上现在BaseTest类只有方法来初始化/创建webdriver对象并启动浏览器会话。以后的测试类具有自己的webdriver实例,并使用这些方法来初始化它们