当前位置: 首页 > 知识库问答 >
问题:

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

岳承悦
2023-03-14

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

BaseTest类只有“设置”和“拆卸”,没有其他东西。

当我尝试像这样并行运行测试时,一个带有测试的类运行,而另一个类只打开一个浏览器(但不执行测试)

但是当我从BaseTest类中剪切代码并将其直接放到我的每个测试类中(因此不扩展BaseTClass)时,代码工作,测试并行运行

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

在测试中。xml试图将parallel=“methods”“tests”“true”。。。

下面是我的课程和测试。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个答案

王声
2023-03-14

感谢所有快速回复,它现在工作:-)

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

屈宏爽
2023-03-14

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

 类似资料:
  • 我试图用TestNG并行运行一个示例测试项目。但它是在一个线程中顺序执行的。我漏掉什么了吗? 谢了。

  • 我正在尝试运行配置套件文件的并行测试。测试是针对使用Selenium的web应用程序。套件文件由多个测试组成。每个测试都包含多个测试类。每个测试中的第一个类用于初始化(@beforetest)WebDriver并关闭它(@aftertest)。WebDriver是静态的,以便将其传递给其他类(原因是我们需要从最后一个测试类结束的地方继续测试)。 当套件配置为按顺序运行测试时,测试将成功运行。但是当

  • 我试图使用testng并行运行测试,但我的配置有一些问题。 我有一个包含许多类文件的项目,每个类文件包含许多测试。 我目前正在使用parallel='methods'标志运行测试,以最大化在给定时间运行的测试数量。 我的目标是避免同一类的测试同时运行,同时最大化并行测试的数量。 因此,给定一个示例xml文件: 给定40个可用线程,我希望在任何给定时间运行40个测试。 我使用了一个方法拦截器来随机化

  • 我有一个testNG方法,如下所示: 我的数据提供程序返回10个元素。我的方法将在一个线程中执行10次。这怎么可能平行?举个例子 我想有5个并行的方法。网络驱动程序应该同时打开5个浏览器。在这5个测试并行后,应执行其他5个测试 或 webdriver应该打开10个浏览器,并并行执行所有10个元素 有人有主意吗?

  • 我一个类有5到6个方法,想在不同的节点上并行运行方法,我有网格2设置,里面有4个节点。 下面是我的测试。xml 我有一个测试工具,它初始化了login、common和utils类 在我的测试类中,我扩展了测试工具,在@Beforemethod中,我调用了inilze方法 如果我运行测试,我会看到以下问题 两个浏览器在每个节点中打开一个,但只有一个浏览器启动应用程序,另一个不启动。 如果我遗漏了什么

  • 我已经使用selenium创建了测试用例,之前我可以使用maven(从命令行和eclipse)执行我的测试用例。但是现在它不起作用了。请帮助 请在下面找到控制台日志:(运行为- 我没有得到任何错误,它成功地构建了一个项目。但是跳过所有测试用例 请找到我的pom。xml配置如下: 请找到E2E。xml如下: