我正在尝试使用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>
答案 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实例,并使用这些方法来初始化它们