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

问题描述 投票:0回答:2

我正在尝试使用 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("[email protected]");
        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>
java selenium-webdriver testing parallel-processing testng
2个回答
1
投票

您必须在每个要调用执行的类中定义 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执行之前调用它。


0
投票

谢谢大家的快速回复,现在正在运行:-)

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

© www.soinside.com 2019 - 2024. All rights reserved.