1. 程式人生 > >Selenium自動化測試Python六:持續整合

Selenium自動化測試Python六:持續整合

持續整合

歡迎閱讀WebDriver持續整合講義。本篇講義將會重點介紹Selenium WebDriver API的在持續整合中的使用方法,以及使用Jenkins持續整合工具進行自動化測試的設計。

持續整合的概念

持續整合的定義

持續整合,Continuous integration ,簡稱CI。

隨著軟體開發複雜度的不斷提高,團隊開發成員間如何更好地協同工作以確保軟體開發的質量已經慢慢成為開發過程中不可迴避的問題。尤其是近些年來,敏捷(Agile) 在軟體工程領域越來越紅火,如何能再不斷變化的需求中快速適應和保證軟體的質量也顯得尤其的重要。

持續整合正是針對這一類問題的一種軟體開發實踐。首先我們看一下,敏捷教父 Martin Fowler

 對持續整合的定義:

Martin Fowler:Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly.

具體定義:持續整合式一種軟體開發實踐。它倡導團隊的成員必須經常的整合他們的工作,通常至少每天一次甚至更多次整合。每次整合都需要通過自動化的構建(包括編譯程式碼、構建應用、部署程式以及自動化測試)來驗證,從而儘早儘快的發現整合中的錯誤。大量的團隊利用這樣的方式來更快的開發內聚的軟體。大大減少此過程中的整合問題。

具體的流程圖如下:

Paste_Image.png

持續整合強調開發人員提交了新程式碼之後,立刻進行構建、(單元、自動化)測試。根據測試結果,我們可以確定新程式碼和原有程式碼能否正確地整合在一起。

首先,解釋下整合。我們所有專案的程式碼都是託管在SVN伺服器上。每個專案都要有若干個單元測試,並有一個所謂整合測試。所謂整合測試就是把所有的單元測試跑一遍以及其它一些能自動完成的測試。只有在本地電腦上通過了整合測試的程式碼才能上傳到SVN伺服器上,保證上傳的程式碼沒有問題。所以,整合指整合測試。

再說持續。不言而喻,就是指長期的對專案程式碼進行整合測試。既然是長期,那肯定是自動執行的,否則,人工執行則沒有保證,而且耗人力。對此,我們有一臺伺服器,它會定期的從SVN中檢出程式碼,並編譯,然後跑整合測試。每次整合測試結果都會記錄在案。完成這方面工作的就是下面要介紹的Jenkins軟體。當然,它的功能遠不止這些。在我們的專案中,執行這個工作的週期是1天。也就是,伺服器每1天都會準時地對SVN伺服器上的最新程式碼自動進行一次整合測試。

Paste_Image.png

持續整合的特點

  • 它是一個自動化的週期性的整合測試過程,從檢出程式碼、編譯構建、執行測試、結果記錄、測試統計等都是自動完成的,無需人工干預;
  • 需要有專門的整合伺服器來執行整合構建;
  • 需要有程式碼託管工具支援;

持續整合的作用

  • 程式碼庫存越是積壓,就越得不到生產檢驗,積壓越多,程式碼間交叉感染的概率越大,下個釋出(release)的複雜度和風險越高,持續整合可以保證團隊開發人員提交程式碼的質量,減輕了軟體釋出時的壓力;
  • 持續整合中的任何一個環節都是自動完成的,無需太多的人工干預,有利於減少重複過程以節省時間、費用和工作量;
  • 及早的發現程式碼中的問題,及早解決,程式碼越早推送(PUSH)出去,使用者能越早用到,快就是商業價值;

舉個例子,你家裝修廚房,其中一項是鋪地磚,邊角地磚要切割大小。如果一次全切割完再鋪上去,發現尺寸有誤的話浪費和返工時間就大了,不如切一塊鋪一塊。裝修廚房有很多部分,每個部分都有檢測手段,如地磚鋪完了要測試漏水與否,線路鋪完了要通電測試電路通順,水管裝好了也要測試冷水熱水。如果全部裝完了再測,出現問題可能會互相影響,比如電路不行可能要把地磚給挖開……。全部裝修完了,你去驗收,發現地磚顏色不合意,水池太小,灶臺位置不對,返工嗎?所以不如沒完成一部分,你就去用一下試用驗收……這就是持續整合。在敏捷的思想裡面,不光強調上面的過程,還需要強調自動化這個過程。過技術手段自動化這三個工作。加快交付速度,自動化測試是一個重要的組成部分。

Jenkins

Jenkins介紹

Jenkins,原名Hudson,2011年改為現在的名字,它 是一個開源的實現持續整合的軟體工具。官方網站:http://jenkins-ci.org/

Hudson是在2004年的夏天由Sun公司開發的(就是開發Java的那家),2005年2月開源併發布了第一個版本。Hudson釋出的時候CruiseControl是CI界的老大哥,但是很快,在大約2007年的時候Hudson已經超越CruiseControl。2008年5月的JavaOne大會上,Hudson獲得了開發解決方案類的Duke's Choice獎項。從此,小弟翻身做大哥,Hudson成為CI的代名詞。

2009年6月,Oracle收購Sun。2010年9月,Oracle註冊了Hudson的商標,然後就沒有然後了。

mv -f Hudson Jenkins

Jenkins 能實施監控整合中存在的錯誤,提供詳細的日誌檔案和提醒功能,還能用圖表的形式形象地展示專案構建的趨勢和穩定性。

Jenkins特點

  • 易安裝:僅僅一個 java -jar jenkins.war,從官網下載該檔案後,直接執行,無需額外的安裝,更無需安裝資料庫;
  • 易配置:提供友好的GUI配置介面;
  • 變更支援:Jenkins能從程式碼倉庫(git/Subversion/CVS)中獲取併產生程式碼更新列表並輸出到編譯輸出資訊中;
  • 支援永久連結:使用者是通過web來訪問Jenkins的,而這些web頁面的連結地址都是永久連結地址,因此,你可以在各種文件中直接使用該連結;
  • 整合E-Mail/RSS/IM:當完成一次整合時,可通過這些工具實時告訴你整合結果(據我所知,構建一次整合需要花費一定時間,有了這個功能,你就可以在等待結果過程中,幹別的事情);
  • JUnit/TestNG測試報告:也就是用以圖表等形式提供詳細的測試報表功能;
  • 支援分散式構建:Jenkins可以把整合構建等工作分發到多臺計算機中完成;
  • 檔案日誌資訊:Jenkins會儲存哪次整合構建產生了哪些jars檔案,哪一次整合構建使用了哪個版本的jars檔案等構建記錄;
  • 支援第三方外掛:使得 Jenkins 變得越來越強大;

Jenkins的安裝

需要從官網下載Jenkins的檔案,在本地安裝Java(jdk)的環境以後,直接執行以下語句進行安裝:

java -jar jenkins.war

注意上述操作,一定是在Java環境已經配置好的情況下進行。輸出如下:

Microsoft Windows [Version 10.0.10532]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Users\erha>java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)

C:\Users\erha>java -jar d:\Jenkins\jenkins.war
Running from: D:\Jenkins\jenkins.war
webroot: $user.home/.jenkins
Jun 19, 2016 12:52:18 AM winstone.Logger logInternal
INFO: Beginning extraction from war file
Jun 19, 2016 12:52:29 AM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: jetty-winstone-2.9
Jun 19, 2016 12:52:33 AM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: NO JSP Support for , did not find org.apache.jasper.servlet.JspServlet
Jenkins home directory: C:\Users\erha\.jenkins found at: $user.home/.jenkins
Jun 19, 2016 12:52:35 AM org.eclipse.jetty.util.log.JavaUtilLog info
INFO: Started [email protected]:8080
Jun 19, 2016 12:52:35 AM winstone.Logger logInternal
INFO: Winstone Servlet Engine v2.0 running: controlPort=disabled
Jun 19, 2016 12:52:36 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started initialization
Jun 19, 2016 12:53:11 AM jenkins.InitReactorRunner$1 onAttained
INFO: Listed all plugins
Jun 19, 2016 12:53:12 AM jenkins.InitReactorRunner$1 onAttained
INFO: Prepared all plugins
Jun 19, 2016 12:53:12 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started all plugins
Jun 19, 2016 12:53:12 AM jenkins.InitReactorRunner$1 onAttained
INFO: Augmented all extensions
Jun 19, 2016 12:53:15 AM jenkins.InitReactorRunner$1 onAttained
INFO: Loaded all jobs
Jun 19, 2016 12:53:25 AM hudson.model.AsyncPeriodicWork$1 run
INFO: Started Download metadata
Jun 19, 2016 12:53:26 AM org.jenkinsci.main.modules.sshd.SSHD start
INFO: Started SSHD at port 10556
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Completed initialization
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started initialization
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Listed all plugins
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Prepared all plugins
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Started all plugins
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Augmented all extensions
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Loaded all jobs
Jun 19, 2016 12:53:26 AM jenkins.InitReactorRunner$1 onAttained
INFO: Completed initialization
Jun 19, 2016 12:53:26 AM hudson.WebAppMain$3 run
INFO: Jenkins is fully up and running
Jun 19, 2016 12:53:32 AM hudson.model.UpdateSite updateData
INFO: Obtained the latest update center data file for UpdateSource default
Jun 19, 2016 12:53:33 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
Jun 19, 2016 12:53:34 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tasks.Ant.AntInstaller
Jun 19, 2016 12:53:37 AM hudson.model.DownloadService$Downloadable load
INFO: Obtained the updated data file for hudson.tools.JDKInstaller
Jun 19, 2016 12:53:37 AM hudson.model.AsyncPeriodicWork$1 run
INFO: Finished Download metadata. 12,471 ms

隨後訪問http://localhost:8080即可

最後,將Jenkins安裝成Windows服務啟動

在Jenkins的主頁中選擇 Manager Jenkins

img

接下來選擇 Install as Windows Service

img

在Installation Directory中選擇jenkin的安裝路徑。這裡會預設產生,直接點選Install就可以了。

img

隨後我們點選Yes,然後可以看到Windows服務中添加了Jenkins的服務,並已經設定為自動和啟動狀態。

img

持續整合的實踐

建立Jenkins Job

Jenkins提供了四種類型的Job:

  1. 構建一個自由風格的軟體專案:這個是Jenkins的主要功能,可以構建一個你自己需要的專案。
  2. 構建一個maven專案:這是基於maven構建的專案,整個過程將會基於你的.pom檔案進行構建,大大減輕構建的配置
  3. 構建一個多配置專案:這種專案適用多配置的專案,比如多個平臺定製的構建,多個測試環境的部署構建等。
  4. 監控一個外部的任務:這種事允許你記錄和執行不在Jenkins中的Job,這些Job可以執行在遠端的主機上,Jenkins通過遠端自動構建,作為一個控制面板而存在。

執行Jenkins Job

執行Job只需要在頁面的左側選中已經列出的專案,進行操作就可以了。選擇立即構建,便可以進行自動構建的工作了。

定時構建 Job

目前有一個每日構建的概念。

Daily Build,每日構建。需要Jenkins在每日固定的時間進行程式碼自動構建、整合和測試的工作。那麼需要定製執行時間。Jenkins的自動構建定製時間是遵循cron語法的。具體來說,每一行包括了5個用白空格或者Tab隔開的欄位,分別是:MINUTE HOUR DOM MONTH DOW。具體的格式我們參考下圖

欄位 說明 示例
MINUTE Minutes within the hour (0–59) 30
HOUR The hour of the day (0–23) 17
DOM The day of the month (1–31) 1
MONTH The month (1–12) 5
DOW The day of the week (0–7) where 0 and 7 are Sunday. 5

 

 

 

 

 

 

然後每個格式,都可以由*-/,4種字元組成:

  • *代表所有可能的值
  • -代表整數之間的範圍
  • /代表指定的時間的間隔頻率
  • ,代表指定的列表範圍

命令的格式參考和示例

分鐘 小時 月份 星期 執行的命令  
* 16 1,10,20 * * python xxx 每個月的1,10,20日的16:00執行 python xxx 命令格式:* 16 1,10,20 * *
* 16 * * 1-5 python yyy 每個周的週一到週五的16:00執行 python yyy 命令格式:* 16 * * 1-5
30 17 * * 1,5 python zzz 每個周的週一和週五的17:30執行 python zzz 命令格式:30 17 * * 1,5

 

 

 

 

 

ps: 注意時間是倫敦時間

至此,我們將會對Jenkins有一個非常範和初步的瞭解過程。

示例:

1. 建立SVN倉庫 
    https://172.31.95.168/svn/DemoRepo/
    ciuser / ciuser
2. 從SVN倉庫簽出檔案到CI Server
3. 構建 build
4. 部署 
    4.1 備份目標資料夾 
        若有ranzhi_bak 需要先刪除
        rd /s /q c:\xampp\htdocs\ranzhi_bak
        把 htdoc的ranzhi改成 ranzhi_bak
        xcopy c:\xampp\htdocs\ranzhi c:\xampp\htdocs\ranzhi_bak\ /s /e /y
        rd /s /q c:\xampp\htdocs\ranzhi
    4.2 複製構建的版本到目標資料夾
        把workspace的 ranzhi 複製到 htdocs下面
        xcopy "%WORKSPACE%\ranzhi" c:\xampp\htdocs\ranzhi\ /s /e /y
    4.3 恢復配置檔案
        複製 ranzhi_bak\config\my.php 到 ranzhi\config\my.php
        xcopy c:\xampp\htdocs\ranzhi_bak\config\my.php c:\xampp\htdocs\ranzhi\config\ /e
5. 自動化測試
    python D:\Git\Coding\BWFTraining\3.03_Selenium\codes\weekend2demo\ranzhi_test_runner.py

轉載來源:http://www.jianshu.com/p/9411f16e0132