我是Selenium WebDriver和Java的新手。我的网站/someservice.php上有一些web服务。我在Selenuim上写了一些测试,但它们运行良好。代码示例(主类):
public class SiteClass {
static WebDriver driver;
private static boolean findElements(String xpath,int timeOut ) {
public static void open(String url){
//Here we initialize the firefox webdriver
driver=new FirefoxDriver();
driver.get(url);
}
public static void close(){
driver.close();
}
WebDriverWait wait = new WebDriverWait( driver, timeOut );
try {
if( wait.until( ExpectedConditions.visibilityOfElementLocated( By.xpath( xpath ) ) ) != null ) {
return true;
} else {
return false;
}
} catch( TimeoutException e ) {
return false;
}}
public static Boolean CheckDiameter(String search,String result){
driver.findElement(By.xpath("//input[@id='search_diam']")).sendKeys(search);
WebDriverWait wait = new WebDriverWait(driver, 5);
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@class='ac_results'][last()]/ul/li")));
WebElement searchVariant=driver.findElement(By.xpath("//div[@class='ac_results'][last()]/ul/li"));
Actions action = new Actions(driver);
action.moveToElement(searchVariant).perform();
driver.findElement(By.xpath("//li[@class='ac_over']")).click();
Boolean iselementpresent = findElements(result,5);
return iselementpresent;
}
}
代码示例(测试类)
@RunWith(Parameterized.class)
public class DiamTest {@Parameters
public static Collection<Object[]> diams() {
return Arrays.asList(new Object[][] {
{ "111", "//div[@class='jGrowl-message']",true},
{ "222", "//div[@class='jGrowl-message']",false},
{ "333", "//div[@class='jGrowl-message']",true},
});
}
private String inputMark;
private String expectedResult;
private Boolean assertResult;
public DiamTest(String mark, String result, boolean aResult) {
inputMark=mark;
expectedResult=result;
assertResult=aResult;
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
/**
* Test of CheckDiameter method, of class CableRu.
*/
@Test
public void testCheckDiameter() {
SiteClass obj=new SiteClass();
obj.open("http://example.com/services.php");
assertEquals(assertResult, obj.CheckDiameter(inputMark, expectedResult));
obj.close();
}
}
现在我有2个测试,每个测试有3个参数(总共6个变体)。正如您在每个变体中所看到的,我创建了新的浏览器窗口,当我运行所有6个变体时,需要花费太多时间(最多80秒)。
如何在一个浏览器窗口中运行所有变体以加快测试速度?
答案 0 :(得分:1)
只需将 public static void close()方法的内容从SiteClass移动到DiamTest类中的tearDownClass()方法。这样,当类执行完成时(由于@AfterClass注释),浏览器窗口将被关闭。那么你的代码应该是这样的:
//DiamTest class
@AfterClass
public static void tearDownClass() {
driver.close();
}
将浏览器窗口初始化移动到setUpClass()方法也是一种很好的做法,该方法将在每个测试类之前执行(根据@BeforeClass注释)
//DiamTest class
@BeforeClass
public static void setUpClass() {
//Here we initialize the firefox webdriver
driver=new FirefoxDriver();
driver.get(url);
}
答案 1 :(得分:0)
您需要做的是与所有测试分享您的帮助类,这意味着您应该在 setUpClass 方法中创建 SiteClass 的实例。 此方法使用@BeforeClass进行注释,确保您的测试类将在执行所有测试之前执行此方法。
您可以在jUnit doc中阅读有关@BeforeClass的更多信息:或者在this响应中进行简单概述。
您还需要重写一些代码以允许与另一个测试共享驱动程序,如下所示:
@RunWith(Parameterized.class)
public class DiamTest {
@Parameters
public static Collection<Object[]> diams() {
return Arrays.asList(new Object[][] {
{ "111", "//div[@class='jGrowl-message']",true},
{ "222", "//div[@class='jGrowl-message']",false},
{ "333", "//div[@class='jGrowl-message']",true},
});
}
private String inputMark;
private String expectedResult;
private Boolean assertResult;
private static SiteUtil siteUtil;
public DiamTest(String mark, String result, boolean aResult) {
inputMark=mark;
expectedResult=result;
assertResult=aResult;
}
@BeforeClass
public static void setUpClass() {
siteUtil = new SiteUtil();
}
@AfterClass
public static void tearDownClass() {
siteUtil.close();
}
@Test
public void testCheckDiameter() {
siteUtil.open("http://example.com/services.php");
assertEquals(assertResult, obj.CheckDiameter(inputMark, expectedResult));
}
}
和
public class SiteClass {
static WebDriver driver;
public SiteClass() {
driver = new FirefoxDriver();
}
public void open(String url){
driver.get(url);
}
...
提示: 您应该阅读TestPyramid。
由于功能测试很昂贵,你应该关心什么是真正必要的测试。这篇文章就是这个。