Selenium自動化測試Python六:持續集成

持續集成

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

持續集成的概念

持續集成的定義

持續集成,Continuous integration ,簡稱CI。java

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

持續集成正是針對這一類問題的一種軟件開發實踐。首先咱們看一下,敏捷教父 Martin Fowler 對持續集成的定義:git

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. web

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

具體的流程圖以下:數據庫


Paste_Image.png

持續集成強調開發人員提交了新代碼以後,馬上進行構建、(單元、自動化)測試。根據測試結果,咱們能夠肯定新代碼和原有代碼可否正確地集成在一塊兒。apache

首先,解釋下集成。咱們全部項目的代碼都是託管在SVN服務器上。每一個項目都要有若干個單元測試,並有一個所謂集成測試。所謂集成測試就是把全部的單元測試跑一遍以及其它一些能自動完成的測試。只有在本地電腦上經過了集成測試的代碼才能上傳到SVN服務器上,保證上傳的代碼沒有問題。因此,集成指集成測試。api

再說持續。不言而喻,就是指長期的對項目代碼進行集成測試。既然是長期,那確定是自動執行的,不然,人工執行則沒有保證,並且耗人力。對此,咱們有一臺服務器,它會按期的從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 SelectChannelConnector@0.0.0.0: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
相關文章
相關標籤/搜索