selenium從入門到應用 - 8,selenium+testNG實現多線程的並發測試


本系列所有代碼 https://github.com/zhangting85/simpleWebtest
本文將介紹一個Java+TestNG+Maven+Selenium的web自動化測試腳本環境下selenium和testNG的多線程並發測試的實現,並提供全部代碼。

 

這里我的多線程的執行測試用例,目的首先是為了提高測試執行速度,然后是為做分布式測試提供技術基礎。

 

testNG自帶了多線程機制,那么為什么要我們還要自己寫一些代碼呢?

因為selenium webdriver本身不是線程安全的。比如說,我直接在一個testNG的case里新建兩個webdriver,再做操作,他們就會沖突。然后其中一個會死掉。

如果我們直接用testNG的多線程,也會遇到類似的問題。

這里,我用thread local來解決線程安全問題:

 

在DriverManager類中,

ThreadLocal的泛型變量的聲明如下:

1 /**
2 * 每個DriverManager只管理一個driver,所以他是static的,但是我引入ThreadLocal來處理多線程
3 * shares the same web driver and use thread local to handle the multi-thread
4 */
5 public static ThreadLocal<WebDriver> ThreadDriver=new ThreadLocal<WebDriver>() ;

之后是執行case時,要獲取一個可用的WebDriver對象來執行測試,此時調用DriverManger.getDriver()方法來取得。

當當前進程未綁定driver時,創建一個driver,如果已綁定driver,則直接返回。所謂給當前進程綁定一個driver,使用的是ThreadDriver.set(driver)

 1 /**
 2 * 如果當前進程沒有綁定driver,創建一個然后綁定上,如果已經有了就直接返回
 3 * create a driver for this thread if not exist. or return it directly
 4 */
 5 public static WebDriver getDriver(){
 6 WebDriver driver= DriverManager.ThreadDriver.get();
 7 if (driver==null){
 8 if (browserType.equals("firefox")){
 9 driver = new EventFiringWebDriver(new FirefoxDriver()).register(new LogEventListener());
10 ThreadDriver.set(driver);
11 //找東西前等三秒wait 3 second for every find by
12 DriverManager.getDriver().manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
13 }
14 //有需求的同學自己在這里添加IE等瀏覽器的支持
15 //you can add ie/chrome or other driver here
16 }
17 return driver;
18 }

 

這樣添加完之后,我們的webdriver已經變成了線程安全的。

之后就可以執行並發的測試,這里用了testng的dataprovider的多線程功能:

 1     /**
 2 * JD首頁上搜索一個商品 主要介紹定位某個商品名稱的N種寫法
 3 * 這里用了DataProvider
 4 * (不會用DataProvier不要說自己懂testNG)
 5 */
 6 @Test(dataProvider="product_to_search")
 7 public void searchProduct(String keyword) throws InterruptedException {
 8 log.info("keyword="+keyword);
 9 String actual_procut_name= new JDHomepage().init().searchHeader.search(keyword).getProductNameByIndexMethodTwo(1);
10 log.info("actual_procut_name="+actual_procut_name);
11 assert(actual_procut_name.contains(keyword));
12 log.info("--------------------------------");
13 }
14 
15 /**
16 * 用了DataProvider並且是並行的。但是這個是運行不通過的。因為WebDriver不是線程安全的。
17 * 稍后我會再修復這個。。。暫時先這樣吧。
18 *
19 * 2014-4-20:更新了DriverManager,現在這個框架里的WebDriver是線程安全的了,所以這個腳本就可以並行執行4個測試數據了。
20 * 詳見DriverManager類
21 *
22 */
23 @DataProvider(name="product_to_search",parallel = true)
24 public Iterator<Object[]> createData1() {
25 //一個Array
26 String[] astringarray={"巧克力","餅","糕","蛋"};
27 //轉成一個String的List
28 List<String> lines=Arrays.asList(astringarray);
29 
30 //一個Object的空的List
31 List<Object[]> data = new ArrayList<Object[]>();
32 
33 //往空List里放東西,然后返回
34 for (String line :lines )
35 {
36 data.add(new Object[]{line});//加了一個FirefoxDriver進去哦
37 }
38 return data.iterator();
39 
40 }
View Code

 

當dataprovider設置了parallel參數為true時,測試即會並發執行。這里的真實並發數受到CPU內核數限制。

具體代碼詳見我的github

 

另外,使用了這些代碼將webdriver和現成綁定,並使用testng提供的多線程功能后,這個測試框架下的測試用例變得可以簡單得移植到selenium grid上,實現分布式測試。只需要再改動一下啟動driver的代碼。

下期再見。


免責聲明!

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



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