我正在尝试使用 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>
您必须在每个要调用执行的类中定义 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执行之前调用它。
谢谢大家的快速回复,现在正在运行:-)
嗯,基本上现在 BaseTest 类只有启动/创建 webdriver 对象和启动浏览器会话的方法。后面的测试类有自己的 webdriver 实例,并使用这些方法来启动它们