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 ,感謝原作者。
