1. 程式人生 > >Java+Selenium3框架設計篇6-如何解決多條類下用例執行只啟動一次瀏覽器的問題

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類,這裡我們的測試京東搜尋。

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);
	}
	

}
2.B類,點選搜尋結果的第一個商品,點選進入詳情頁,點選新增購物車按鈕
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();
	}

}
      上面舉例的是兩個測試類檔案,如果是N個也是這個原理,只有測試類A中定義WebDriver driver,然後其他測試類直接呼叫靜態driver這個變數,其他測試類只要遇到了driver,就換成A.driver,執行到最後一個用例,需要A.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框架設計部分程式碼放在網盤。後面,如果有必要,會繼續更新這個系列文章。