【持續整合你的項目】為你的項目建立自動化測試和程式碼涵蓋範圍測試

來源:互聯網
上載者:User
本文以PHP項目作為例子所需要擁有(準備)的:

  • Github帳號

  • 一個項目

看著篇幅挺大的,難免有什麼遺漏,如果文中有錯誤的地方,還請各位斧正!謝謝。因為本來篇幅就大,所以就沒配圖了,如果有很多人反饋看不懂或者失敗了,我再後期補。謝謝!

Travis-CI

項目為保證項目始終處於健康穩定的狀態,我們需要一個可以持續的自動的對貢獻的代碼進行自動化測試的服務。

Travis-CI就是在這樣的背景下於2011年開啟服務,到現在為止已經有超過300k個開源項目和235k的使用者在使用。

Travis-CI所做的工作就是自動在虛擬機器中運行 .travis.yml中設定的內容進行單元測試,產生並匯出報告。

Composer

開源項目之間一般有著相互依賴的關係,比如項目A的一個組件依賴於另一個項目B。當這種依賴關係多了之後就需要一個管理依賴的工具。

Composer就是PHP的一個 依賴管理工具。它允許你申明項目所依賴的程式碼程式庫,並且會在你的項目中安裝他們。 Composer中文

Packagist

Packagist is the main Composer repository. It aggregates public PHP packages installable with Composer.

這個網站是主要的Composer倉庫,通過Composer發布的項目,所儲存的倉庫就是這個網站,這也是Composer安裝依賴的下載來源。 可以使用Github帳號登入

登入之後可以提交自己的項目,不過需要項目中有 composer.json檔案,這在之後進行介紹。

Coveralls

單元測試中,程式碼涵蓋範圍經常被用來衡量測試好壞的指標。

所謂的程式碼涵蓋範圍簡單的說就是在運行完測試案例之後,走過了多少句的代碼,比如說,你要測試的一個函數有100行,但是測試案例只走過了80行,所以這個測試案例的程式碼涵蓋範圍就是80%

Coveralls就是一個根據單元測試匯出的資料進行分析,展現程式碼涵蓋範圍的一個工具。可以和很多的自動構建工具一起使用,本文以 Travis-CI為例。

項目最終的目錄結構

/├── src/│   └── ClassName.php|── tests/|   ├── ClassNameTest/|   |   └── ClassNameTest.php|   └── Bootstrap.php|── .coveralls.yml|── .travis.yml|── LICENSE|── README.md|── composer.json|── example.php└── phpunit.xml.dist

下面開始具體的配置方法。

Composer

如果想更深入的學習Composer可以查看官方文檔(地址在這一節最後)。一個重要的概念就是 每一個項目都是一個包 注

所以我們首先需要在 項目根目錄建立一個 composer.json檔案,其中的內容為( 稍後我們再看其中的意思)

{  "name": "jshadowman/package",  "description": "this is a test package",  "version": "0.0.1",  "type": "library",  "keywords": [ "database", "logging" ],  "license": "MIT",  "require": [    "php": ">=5.4.0"  ],  "require-dev": [    "satooshi/php-coveralls":"*",    "phpunit/phpunit": "*"  ],  "autoload": {    "files": [ "./src/ClassName.php" ]  }}
  • name:這個欄位顧名思義,包的名字,應該包含Verdor name(供應商)和Project Name(項目名)。值得注意的是這個欄位的值應該都是 小寫的,這和資產庫發布註冊有關。具體請參考 Packagist

  • description:這個欄位應該是這個項目的一個簡短的簡介。一行即可

  • version:項目的版本,並不是必須的, 而且建議忽略,具體請參考 Version 中文

  • type:項目的類型,可選的值有 library project metapackage composer-plugin具體請參考 Type 中文

  • keywords:用於在被搜尋時的關鍵字,可以是一個數組 Keywords 中文

  • license:項目發布所使用的開源協議,可選的值請參考 License 中文

  • require:這表示項目所依賴的軟體包列表,除非這些依賴被滿足,否則不會完成安裝。 Require 中文

  • require:我們的項目依賴於 平台軟體包,也就是PHP,PHP的擴充包和一些系統類別庫。所以我們在 require之中添加了對PHP的依賴,如果有依賴於其他的包,可以按照這種格式填寫。具體請參考 Platform-packages 中文

  • require-dev:這個欄位列出的依賴只有在測試和開發的時候才會安裝,屬於額外的依賴。具體請參考 Require-dev 中文

  • require & require-dev:這兩個欄位之下的清單項目應該是 包名到版本的映射,其中版本有很多種寫法,可以根據需求過濾。具體請參考 Package-Links 中文

  • autoload:表示的是 autoloader的自動載入映射。具體請參考 Autoload 中文

  • autoload:其中的映射關係設計到PHP命名空間(Name Space)的一些知識,具體請參考 PSR-0- PSR-4- PSR0-4_Github

composer.json中有很多可選的欄位和值,編寫的規範可以參考 Document, 中文文檔

Coveralls

在項目的 根目錄建立 .coveralls.yml檔案,其中的內容為

coverage_clover: build/logs/clover.xmljson_path: build/logs/coveralls-upload.json
  • coverage_clover:表示使用指定目錄的 Clover XML格式的XML檔案,預設指向 build/logs/clover.xml

  • json_path:用來指定將被上傳到 Coveralls網站的json檔案,預設指向 build/logs/coveralls-upload.json

值得注意的是舊版本所使用的 src_dir已經在1.0.0版本中 被移除了,所以請注意 不要使用這個選項

Removed src_dir from CoverallsConfiguration

還有其他的配置選項請參考 Github - satooshi/php-coveralls

接下來在 Coveralls網站中添加倉庫:

  • 進入 Coveralls網站 https://coveralls.io/

  • 點擊右上方的 SIGN IN,在接下來的頁面中選擇 GITHUB SIGN IN,然後使用自己的Github帳號授權登入

  • 如果你沒使用過 Coveralls的話,登入成功的介面應該是讓你添加一個代碼倉庫

  • 在 ADD REPO標題下列表中將你的項目從 OFF撥到 ON

  • 接下來配置 PHPunit單元測試。

PHPUnit

在你的 項目根目錄建立 phpunit.xml.dist檔案,其實這個檔案也不一定要建立在根目錄,主要記得 修改檔案內容中的路徑就行,不過最好就是根目錄和tests檔案夾內了。

phpunit.xml.dist檔案的內容為

                        ./tests                                    ./src                            ./vendor                ./tests                ./example.php                                                
  • 根項目 中的屬性

    • bootstrap表示在測試回合前先運行一個 "Bootstrap" PHP檔案,一般用於配合 Composer中的自動載入,確保不會發生找不到類的情況

    • colors表示是否使用彩色輸出

    • convertErrorsToExceptionsPHPUnit 將會安插一個錯誤處理函數來將錯誤轉換為異常,設定為 false 則表示禁用

    • convertNoticesToExceptions此選項設定為 true 時,由 convertErrorsToExceptions 安插的錯誤處理函數會將 E_NOTICE、E_USER_NOTICE、E_STRICT 錯誤轉換為異常。

    • convertWarningsToExceptions此選項設定為 true 時,由 convertErrorsToExceptions 安插的錯誤處理函數會將 E_WARNING 或 E_USER_WARNING 錯誤轉換為異常。

  • 帶有一個或多個 子項目的 元素用於多組的測試套件

  • 顧名思義,過濾器,對目錄下的檔案或檔案夾進行過濾

  • 下的 表示白名單,即需要的部分

  • 下的 顧名思義,即需要的目錄

  • 下的 這是需要排除的部分,底下的排除項目看標籤名就知道了,可以排除目錄或者單個檔案

  • 最後的 部分就是日誌紀錄的內容了。

    • 表示匯出 coverage-clover格式的檔案,匯出檔案名稱為 build/logs/clover.xml

    • 表示將日誌直接輸出到標準輸出,即終端上。

完整的XML格式,內容可以參考 XML設定檔

需要注意的是在根項目 中的屬性並不是所有都在那個頁面介紹的,還有一部分在 命令列選項之中,所以如果在附錄C找不到,那就去命令列選項(注意根項目屬性在命令列選項中是以 -分隔的)那一節找找,肯定有的。

Travis-CI

  • 使用 Github帳號登入 Travis-CI Sign Up

  • 點擊自己的頭像進行設定檔介面,在下面你的項目中,點擊你所需要自動構建的項目前的按鈕,這個按鈕就會變成綠色的勾

  • 在點擊到自己的使用者資訊介面之後,在你的Repo上面會有一個簡單的使用介紹,開啟Travis-CI是很簡單的。

在你的 項目根目錄建立 .travis.yml檔案,其中的內容為

language: phpphp:  - '5.4'  - '5.5'  - '5.6'  - '7.0'before_script:  - composer install --prefer-dist --dev --no-interactionscript:  - mkdir -p build/logs  - phpunit -c phpunit.xml.dist --coverage-clover build/logs/clover.xmlafter_script:  - travis_retry php vendor/bin/coveralls -v
  • language:顧名思義,這就是你項目所用的語言,所支援的語言和格式可以查閱 Document, 配置PHP

  • php:這個底下是自動構建所使用的環境。注意,有固定的格式

  • before_script:顧名思義,在正式 script之前啟動並執行指令碼( Shell)命令

  • script:開始測試所用的命令

  • after_script:在測試結束之後啟動並執行命令,比如用於匯出結果到 COVERALLS

其中所用到命令介紹

開始測試之前需要做的準備工作,即安裝項目需要的依賴包。

composer install --prefer-dist --dev --no-interaction

  • 這句命令的作用是根據 composer.json所描述的依賴關係進行依賴的安裝,具體請參考 Install 中文

    • --prefer-dist:composer 將儘可能的從 dist 擷取依賴的項目,這將大幅度的加快在 build servers 上的安裝

    • --dev:安裝 require-dev 欄位中列出的包

    • --no-interaction:不要詢問任何互動問題。因為是自動進行依賴安裝的,我們不能手動控制,所以發生任何需要互動的問題,我們都是處理不了的

準備工作做好之後,開始正式的測試工作,首先當然需要先建立一個存放日誌的目錄

mkdir -p build/logs

  • 這句命令會讓系統建立一個連續的目錄,如果父目錄不存在就先建立父目錄

開始進行單元測試並匯出程式碼涵蓋範圍報告

phpunit -c phpunit.xml.dist --coverage-clover build/logs/clover.xml

  • 這句命令是運行phpunit進行單元測試,具體請參考 PHPUnit- 命令列選項

    • -c phpunit.xml.dist:從指定的檔案中讀取配置資訊,這裡的設定檔是 phpunit.xml.dist

    • --coverage-clover build/logs/clover.xml:產生並匯出 Clover XML格式的程式碼涵蓋範圍報告

測試完之後接下來就是匯出報告到Coveralls了

travis_retry php vendor/bin/coveralls -v

  • 這句命令是其實是 php vendor/bin/coveralls -v,前面的 travis_retry的作用是檢查後面命令的傳回值,如果不是0(傳回值為0表示正常結束),那就重複執行3次,如果3次都不為0,那就報錯。

  • php vendor/bin/coveralls -v:

    • 這句命令是使用PHP執行vendor/bin/下的coveralls這個檔案, -v表示 verbose,即顯示詳細的報告。

      這個命令執行之後就可以在 Coveralls這個網站中看到詳細的資料了。

phpunit執行的結果和 coveralls匯出的結果都可以在 Travis-CI的 Build Jobs下看到

git push

接下來就是把這些檔案push到Github上, Travis-CI就會自動構建,然後開始單元測試,並把測試結果中的程式碼涵蓋範圍發送到 Coveralls。如此,一套流程就結束了。

展示

辛辛苦苦大半天,就是為了展示自己的成績啊。所以我們看到的別人家項目地下這麼漂亮的表徵圖我們也要有啊。

在 README.md檔案中添加( 注意將以下 Github_ID 替換為自己的 Github-ID,將 Repo_Name 替換為你的項目名字。沒有角括弧哦~還有注意區分大小寫哦~如果還需要改分支(branch)的話,看到連結你應該也懂吧?我相信你!)

[![Build Status](https://travis-ci.org//.svg?branch=master)](https://travis-ci.org//)[![Coverage Status](https://coveralls.io/repos/github///badge.svg?branch=master)](https://coveralls.io/github//?branch=master)

其實這些 markdown語句可以直接複製的

  • Travis-CI: Build表徵圖可以在 Travis-CI網站中自己項目名的右邊有一個 build:****的表徵圖,直接點擊這個表徵圖,將 Image URL改成 Makedown就可以看到啦

  • Coveralls:也是進入自己Repo的詳細資料中,中間是 LATEST BUILDS資訊,在最右邊有一個 README BADGE,底下那個表徵圖右邊有個按鈕 Embed ▾,點擊複製 Markdown的語句即可。

Packagist(可選)

在覺得自己的項目開發的差不多時,我們就可在在 Packagist上發布自己的包啦,發布之後,就可以被別人的項目通過 Composer所依賴~

  • 可以使用Github帳號登入,或者自己註冊個帳號登入,在右上方 Sign In選擇是註冊還是使用Github帳號登入

  • 註冊完之後,可以在右上方 Submit中提交一個包,點擊 Submit按鈕 - Submit

  • 接下來會讓你輸入 Repository URL,直接輸入 git://github.com//

  • Packagit會在後台clone你的項目,並且檢查項目中的 composer.json檔案,第一個要檢查的就是包的名字,如果包名中有大寫的字母,Packagit就會報一個包名不應該有大寫字母的錯誤,所以,這就是上文所說包名最好是小寫來由。

  • 提交之後就可以看到自己的這個包的一些資訊了,比如被下載了多少次,被安裝了多少次。

  • 回到Github,開啟代碼倉庫的 Settings -> Webhooks & services,然後在 Services右邊有個 Add Service的按鈕,點擊輸入尋找 Packagit

  • 之後會讓你輸入使用者名稱和Token,這些資訊都在你的 Packagit首頁中 個人首頁

  • 個人首頁有個 Your API Token的按鈕,按下按鈕,就可以看到自己的API TOKEN了, 注意保密哦

  • 其中 packagist海油4個小表徵圖,記得替換 PACKAGIST_ID和 PACKAGE_NAME哦,不是 Github_ID和 Repo_Name哦

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.