解决TestNG多线程并发时,线程不安全问题
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 ,感谢原作者。