Java+Selenium3框架設計篇6-如何解決多條類下用例執行只啟動一次瀏覽器的問題
前面我們實現了在setUp方法中新增登入的用例。今天,還是為了解決我們遺留的問題,如果執行多條測試用例,這些用例在不同類檔案下,我們只需要啟動一次瀏覽器,登入一次,然後根據順序去執行多個類檔案下的用例,最後退出並關閉瀏覽器。
解決思路:
1.在一個類檔案中執行多個用例,我們現在沒有問題
2.假如我有兩個類檔案,每個類檔案都包含一個測試用例。如何保證用例A執行完後的driver如何傳遞給用例B
這個如何傳遞是我們的重點,我之前犯了一個錯誤,在用例A和用例B都寫了一個類變數,那就是WebDriver driver。當時執行完了用例A之後,我也思考過如何把driver傳遞給用例B中去。正確的做法是,用例A執行完後,@AfterClass裡面不能執行driver.quit()語句,這裡我們替換成時間等待語句。在用例B類檔案中,千萬不要再定義WebDriver driver這樣的變數,在B中,我們先在@BeforeClass中什麼也不寫,也就是沒有前提條件,這個時候不用去管driver如何傳遞過來。接下來在我們的@Test方法中,直接用A.driver來傳遞我們的driver例項物件,所以,我們在A中需要把driver定義為static變數。說了這麼多,我們來看具體檔案中程式碼如何寫,你就明白。
這篇文章,只需要上面三個檔案,其他檔案不變,具體參考前面文章。
1.A類,這裡我們的測試京東搜尋。
2.B類,點選搜尋結果的第一個商品,點選進入詳情頁,點選新增購物車按鈕package testSuite; import java.io.IOException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.PageFactory; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import pageObject.HomePage; import pageObject.functions.Login; public class Test_HomePage_Search { public static WebDriver driver; @BeforeClass public void setUp() throws IOException{ Login login = new Login(); login.initSetup(); login.loginValid(); driver = login.driver; } @Test public void test_searchGoods(){ HomePage hp = PageFactory.initElements(driver, HomePage.class); hp.searchWithKeyword("Java"); } @AfterClass public void tearDown() throws InterruptedException{ Thread.sleep(3000); } }
上面舉例的是兩個測試類檔案,如果是N個也是這個原理,只有測試類A中定義WebDriver driver,然後其他測試類直接呼叫靜態driver這個變數,其他測試類只要遇到了driver,就換成A.driver,執行到最後一個用例,需要A.driver.quit()。通過這個方式,我們解決了,如何只啟動一次瀏覽器就,執行多次測試用例的目標。package testSuite; import org.openqa.selenium.support.PageFactory; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import pageObject.GoodsDetailsPage; import pageObject.SearchResultListPage; public class Test_AddGoodToCart { @BeforeTest public void setUp() { } @Test public void testAddToCart() throws InterruptedException{ SearchResultListPage srlp = PageFactory.initElements(Test_HomePage_Search.driver, SearchResultListPage.class); srlp.clickItemImg(); // 切換視窗到商品詳情頁 srlp.switchWindow(); GoodsDetailsPage gdp = PageFactory.initElements(Test_HomePage_Search.driver, GoodsDetailsPage.class); gdp.addGoodToCart(); } @AfterClass public void tearDown(){ Test_HomePage_Search.driver.quit(); } }
3.TestNG.xml設定用例執行順序
專案最終用例執行是通過設定TestNG.xml來管理和執行測試用例。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
<test name="TestJDActions">
<classes>
<class name="testSuite.Test_HomePage_Search"/>
<class name="testSuite.Test_AddGoodToCart"/>
</classes>
</test>
</suite>
2017/09/04更新
一些感受:
最近好久沒有更新這個Java+Selenium3系列文章。主要有兩個原因,第一個是到目前,其實簡單的框架設計已經完成,剩下的功能都是一些定製的功能,例如如何設定監聽,如何測試完後,找到報告資料夾裡面最新報告通過郵件傳送。如何做資料驅動,如果設計關鍵字驅動框架,如何設計行為驅動框架,如何selenium做持續整合操作。這些話題,有些我已經實現,有些知道一些而已,如果要展開,還是有很大篇幅。
第二個是有一個新的觀點想分享給大家。如果你學到這裡,你要不繼續學下去,學點資料庫相關的操作,實現一些資料初始化指令碼。其實,這裡,也是有點打擊的。我在介紹介面測試的文章提到,現在webui自動化已經不受重視,已經開始向介面自動化測試和百合測試遷移。因為webui是變化非常平凡的,特別是敏捷開發的專案。記住,測試三層金字塔模型,UI層的測試花再多時間,對程式碼的覆蓋可能都不到30%,我們需要向介面測試,程式碼測試轉移,測試更多的程式碼覆蓋率,從而發現更多軟體的缺陷。webui自動化真的沒有什麼技術含量,我們不需要成為什麼selenium專家,測試領域還有很多方向和技術需要我們去掌握,例如app自動化測試,app穩定性測試。安全測試,效能測試,任何一個方向,都不比webui自動化測試要簡單。
所以,目前,考慮先把webui自動化先放一放,花時間去學習介面測試和效能測試,以及程式碼的技能,甚至web開發或者android開發,學web開發是更好去做介面測試和網站功能測試,學android開發是更好去學習android自動化測試。這裡先把目前,java+selenium框架設計部分程式碼放在網盤。後面,如果有必要,會繼續更新這個系列文章。