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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM