TestNG的强大功能之一就是支持多线程并发测试,但前提是需要我们的程序是线程安全的,否则实际测试过程中就会出错。例如当我们初始化两个driver时,如果不保证线程安全,则两个driver在运行时会相互干扰甚至死掉。
未进行线程安全优化之前的代码(用Selenium 3,firefox浏览器驱动需要特殊设置):
public static WebDriver driver;/*设置静态driver,可随时调用*/
public static void getDriver(String browser){
if(browser.equals("firefox")){
System.setProperty("webdriver.firefox.marionette","C:\\Program Files (x86)\\Mozilla Firefox\\geckodriver.exe");//selenium3中火狐浏览器需要设置geckodriver
driver = new FirefoxDriver();
}else if(browser.equals("chrome")){
System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe");
driver=new ChromeDriver();
}
}
此时通过getDriver()方法可直接调用对应driver,如果两个测试用例分别都创建相同浏览器driver,同时在TestNG的.xml文件中配置多线程并发执行,此时两浏览器执行的操作虽然分别在不同线程中,但因为引用的是同一个driver,因此会出现两浏览器相互跳跃操作的情况,即本该在浏览器1中的操作跳跃到浏览器2中执行,从而报错,解决办法是使用ThreadLocal来保证线程安全,具体代码如下:
/*使用ThreadLocal来保证程序的线程安全,以免TestNG在进行多线程并发测试时发生线程安全问题*/
public static ThreadLocal<WebDriver> ThreadDriver=new ThreadLocal<WebDriver>();
public static String browserType;
public static WebDriver getDriver(){
WebDriver driver=ThreadDriver.get();
if(driver==null){//如果当前线程没有绑定driver,则根据.xml配置文件创建driver并使用ThreadDriver.set()方法绑定到线程中。
if(browserType.equals("firefox")){
System.setProperty("webdriver.firefox.marionette","C:\\Program Files (x86)\\Mozilla Firefox\\geckodriver.exe");
driver=new FirefoxDriver();
ThreadDriver.set(driver);
}else if(browserType.equals("chrome")){
System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe");
driver=new ChromeDriver();
ThreadDriver.set(driver);
}
}
return driver;
}
public static void setupDriver(String browser){//设置driver类型
browserType=browser;
}
本文部分内容来自http://www.cnblogs.com/sdet/p/3677939.html ,感谢原作者。
|