web自動化測試從入門到持續集成
來自專欄猿論5 人贊了文章
在很多剛學習自動化的可能會認為我只需要會運用selenium,我只需要在一個編輯器中實用selenium +java編寫了一些腳本那麼就會自動化了,是真的嗎?答案肯定是假的。自動化肯定是需要做到真的完全自動化,那如何實現呢?接著往下看。
首先我們需要準備的環境:
1、jdk環境配置好2、maven環境配置3、jenkins環境配置(jenkins.war的包)4、在eclipse中創建一個maven工程(不是java工程,為什麼?因為java工程還需要自己去下載selenium等等包然後引入,但是maven工程只需要在pom文件中將各種包的配置添加進去就行)
5、在maven工程中的pom.xml文件中將selenium、testng包引入,其他的都不要。環境準備好之後就準備創建包,寫代碼吧。
我這裡拿pageobject做為例子,首先看一下我工程的一個目錄結構:
在這個結構中會拿部分來講:
base:主要是放driver的基類,他主要是對webdriver進行了第二次封裝business、handle、page這三個類主要是pageobject模型中實用的頁面分離,page裡面放的全是頁面元素,handle放的是該頁面元素的操作、business放的是該頁面的操作元素之間的一些業務。testcase:顧名思義就是放我們case的地方
util:一些工具類的存放地方
下面的testNG.xml就是我們testng的一個配置文件,如果我們需要用testng運行那麼就直接右鍵運行。pom.xml:是我們maven的文件,我們所有的依賴文件都添加在裡面,當我們使用jenkins來集成時,jenkins裡面配置的就是這個pom文件
首先來看我們的DriverBase的代碼:public class DriverBase { public WebDriver driver; public DriverBase(String browser){ SelectDriver selectDriver =new SelectDriver(); this.driver = selectDriver.driverName(browser); } /** * get封裝 * */ public void get(String url){ driver.get(url); } /* * 返回 * **/ public void back(){ driver.navigate().back(); } /** * 點擊 * */ public void click(WebElement element){ element.click(); } /** * 獲取當前url * */ public String getUrl(){ return driver.getCurrentUrl(); } /** * 獲取title * */ public String getTitle(){ return driver.getTitle(); } /** * 關閉瀏覽器 * */ public void close(){ driver.close(); }}
在這個裡面我們對webdriver常用的一些方法進行了一個第二次封裝。
當我們把基礎的封裝了後,我們再次看我們整個框架的結構:在page裡面我們需要再次封裝一個BasePage的類,這個是主要封裝我們頁面一些公用的方法,一些常用的方法我們只需要在這個類裡面寫一次就好,其他的page頁面繼承這個類。
來看我們base類裡面的部分方法:public class BasePage { public DriverBase driver; public BasePage(DriverBase driver){ this.driver = driver; } /** * 定位Element * @param By by * */ public WebElement element(By by){ WebElement element = driver.findElement(by); return element; } /** * 層級定位,通過父節點定位到子節點 * 需要傳入父節點和子節點的by * */ public WebElement nodeElement(By by,By nodeby){ WebElement el = this.element(by); return el.findElement(nodeby); }}
我們封裝了一些常用的方法,然後我們的page頁面都可以拿過去運用,這樣減少了我們後期寫這些方法的成本,下面來看我們loginpage。
在我們loginpage裡面存放的全是登陸頁面獲取元素的方法,首先看我們我們的登陸頁面:這個是我們的登陸頁面,登陸頁面中我們常用的就用戶名、密碼、記住登陸、登陸按鈕幾個元素,那麼我們只需要把這幾個元素都封裝在我們的loginpage頁面就好,看下面代碼:
public class loginPage extends BasePage{ public loginPage(DriverBase driver){ super(driver); } /** * 獲取用戶名輸入框 * */ public WebElement getUserElement(){ return element(getByLocator.getLocator("username")); } /** * 獲取密碼輸入框Element * */ public WebElement getPasswordElement(){ return element(getByLocator.getLocator("userpass")); } /** * 獲取登陸按鈕element * */ public WebElement getLoginButtonElement(){ return element(getByLocator.getLocator("loginbutton")); }}
在這裡我們看不到任何的元素,我們所有的定位元素都進行了二次封裝,在我們的BasePage裡面有相應的封裝,但是他也會去調用其他的一些定位類。當我們有了所有的元素之後我們是不是就需要再次對這些元素操作呢?接下來看我們的操作類:
public class loginPageHandle { public DriverBase driver; public loginPage lp; public loginPageHandle(DriverBase driver){ this.driver = driver; lp = new loginPage(driver); } /** * 輸入用戶名 * */ public void sendKeysUser(String username){ lp.sendkeys(lp.getUserElement(), username); } /** * 輸入密碼 * */ public void sendKeysPassword(String password){ lp.sendkeys(lp.getPasswordElement(), password); } /** * 點擊登陸 * */ public void clickLoginButton(){ lp.click(lp.getLoginButtonElement()); }}
在我們的操作類裡面所有的方法都是對單一的一個元素進行操作,這裡並不是很全,並沒有把所有元素都羅列進去,我們可以自行思考。在一些po模型中一些人是把這個放在了page裡面,其實這個看個人,沒有對錯,只需要記住一個思想就行,我們的目的是把所有的元素、操作、數據都分離開就好。有操作後我們可以對業務或者一些人認為是case來看了:
public class LoginPro { public loginPageHandle lph; public DriverBase driver; public LoginPro(DriverBase driver){ this.driver = driver; lph = new loginPageHandle(driver); } public void login(String username,String password){ if(lph.assertLoginPage()){ lph.sendKeysUser(username); lph.sendKeysPassword(password); lph.clickLoginButton(); }else{ System.out.println("頁面不存在或者狀態不正確。"); } }}
在這個類如果放在case裡面也是合適的,只是那樣會有一點兒長,所以我單獨拿出來了,我們可以看到我首先判斷的是我處於的頁面是否在我們的登陸頁面,如果字我才會進行下面的操作。當完成這個之後我們就可以單獨的寫case了:
public class SuiteTestLogin extends CaseBase{ public DriverBase driver; public LoginPro loginpro; public HomePagePro homepagepro; public ProUtil pro; public HandleCookie handcookie; @BeforeClass public void beforeClass(){ this.driver = InitDriver("chrome"); pro = new ProUtil("loginTest.properties"); driver.driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); loginpro = new LoginPro(driver); handcookie = new HandleCookie(driver); homepagepro = new HomePagePro(driver); driver.get(pro.getPro("url")); } @Test public void testLogin(){ String username = pro.getPro("username"); String password = pro.getPro("passwd"); loginpro.login(username, password); try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(homepagepro.AssertLogin(pro.getPro("yq"))){ System.out.println("登陸成功"+username); handcookie.writeCookie(); } } @AfterClass public void afterClass(){ driver.close(); }
case裡面我們有一些基礎的方法來至於case的基類,我們再這case裡面只做一件事情那就是打開頁面然後登陸,最後退出。
當處於當前頁面時我們可以運行,但是這個不是我們的目的,我們的目的是要整個自動化起來,所以我們需要在testng.xml裡面去配置<?xml version="1.0" encoding="UTF-8"?><suite name="Suite" parallel="false"> <test name="Test1"> <listeners> <listener class-name="com.mushishi.selenium.util.RetryListener" /> <listener class-name="com.mushishi.selenium.util.TestNGListenerScreen" /> </listeners> <classes> <class name="com.mushishi.selenium.testCase.SuiteTestLogin"/> </classes> </test></suite>
我們這個配置有一個監聽事件,這個監聽是為了當遇見錯誤時實現截圖的。這個配置弄好後你可以右鍵該xml直接運行,最後你會得到一個一樣而又不一樣的結果。
testng.xml配置完畢後我們接著需要在我們的pom.xml中接著進行配置編譯插件: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.12</version> <inherited>true</inherited> <configuration> <suiteXmlFiles> <suiteXMLfile>testNG.xml</suiteXMLfile> </suiteXmlFiles> </configuration> </plugin> </plugins> </build>
我們需要把這兩個插件加入,加入後我們就可以直接右鍵運行該xml,得到的結果也是一樣,可以運行剛我們的整個case。最後一步集成jenkins
在打開的jenkins頁面只需要選擇新建,然後進入到了創建工程頁面,在這個頁面你需要選擇創建一個maven工程:作者:Mushishi_Xu
鏈接:https://www.imooc.com/article/18756
來源:慕課網
【web前端專題推薦】:web前端性能優化方法必備,web前端性能優化必看之課,為你解決幾乎所有的開發者都會面臨的網頁載入問題。
推薦閱讀:
【官方】手記欄目認證作者招募,長期有效,隨時報名!_慕課手記
有獎徵文005期 |人生路上得一良師,是何感受?
測試人員如何避免背黑鍋?
HTTP / 2的來歷與應用,向現代Web進擊!
HTTP協議原理+實踐 Web開發工程師必學
推薦閱讀:
※2. 掀起介面測試的蓋頭-HTTP 初窺 (一)
※Xebium詳解01-簡介
※乾貨—Go語言編寫單元測試
※python 變數的定義
※版本為何總是延遲上線/發布?