TestNg параллельные тесты / классы при использовании базового тестового класса - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь запустить тесты параллельно, используя TestNg. У меня есть 3 класса (два тестовых класса, которые расширяют класс BaseTest)

В классе BaseTest есть только вещи "setup" и "teardown", больше ничего.

Когда я пытаюсь запустить тесты параллельно, как один, запускается один класс с тестами, а для другого класса открывается только браузер (но тест не выполняется)

Но !! когда я вырезал код из класса BaseTest и поместил его непосредственно в каждый из моих тестовых классов (и, следовательно, не расширяя BaseClass), тогда код работает, и тесты выполняются параллельно

почему ?? Я не делаю никаких изменений кода вообще ... и когда я хочу запускать тесты не параллельно (только по одному), тогда использование расширения класса BaseTest работает просто отлично

в testing.xml пытался выставить параллельные = "методы", "тесты", "истина" ...

ниже мои классы и 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 голосов
/ 28 августа 2018

Спасибо всем за быстрые ответы, теперь работает: -)

Ну, по сути, теперь класс BaseTest имеет только методы для инициации / создания объектов веб-драйвера и запуска сеанса браузера. Более поздние тестовые классы имеют свои собственные экземпляры webdriver и используют эти методы для их запуска

0 голосов
/ 28 августа 2018

Вы должны определить аннотацию TestNG в каждом классе, который вы будете вызывать для выполнения. Вы не можете определить аннотацию @BeforeClass @AfterClass в BaseTest. Вы можете вызвать метод 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...