【持續集成你的項目】爲你的項目建立自動化測試和代碼覆蓋率測試

本文以PHP項目做爲例子
所須要擁有(準備)的:php

  • Github帳號html

  • 一個項目git

看着篇幅挺大的,不免有什麼遺漏,若是文中有錯誤的地方,還請各位斧正!謝謝。
由於原本篇幅就大,因此就沒配圖了,若是有不少人反饋看不懂或者失敗了,我再後期補下圖。謝謝!github

Travis-CI

項目爲保證項目始終處於健康穩定的狀態,咱們須要一個能夠持續的自動的對貢獻的代碼進行自動化測試的服務。
Travis-CI就是在這樣的背景下於2011年開啓服務,到如今爲止已經有超過300k個開源項目和235k的用戶在使用。json

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

Composer

開源項目之間通常有着相互依賴的關係,好比項目A的一個組件依賴於另外一個項目B。當這種依賴關係多了以後就須要一個管理依賴的工具。數組

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

Packagist

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

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

登陸以後能夠提交本身的項目,不過須要項目中有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.xml
json_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文件的內容爲

<phpunit bootstrap="tests/Bootstrap.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         >
    <testsuites>
        <testsuite name="Class Test Suite">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist>
            <directory>./src</directory>
            <exclude>
                <directory>./vendor</directory>
                <directory>./tests</directory>
                <file>./example.php</file>
            </exclude>
        </whitelist>
    </filter>
    <logging>
        <log type="coverage-clover" target="build/logs/clover.xml"/>
        <log type="coverage-text" target="php://stdout" showUncoveredFiles="true"/>
    </logging>
</phpunit>
  • 根元素<phpunit>中的屬性

    • bootstrap 表示在測試運行前先運行一個 "Bootstrap" PHP文件,通常用於配合Composer中的自動載入,確保不會發生找不到類的狀況

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

    • convertErrorsToExceptions PHPUnit 將會安插一個錯誤處理函數來將錯誤轉換爲異常,設置爲 false 則表示禁用

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

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

  • 帶有一個或多個 <testsuite> 子元素的 <testsuites> 元素用於多組的測試套件

  • <filter> 顧名思義,過濾器,對目錄下的文件或文件夾進行過濾

  • <filter>下的<whitelist> 表示白名單,即須要的部分

  • <whitelist>下的<directory> 顧名思義,即須要的目錄

  • <whitelist>下的<exclude> 這是須要排除的部分,底下的排除項目看標籤名就知道了,能夠排除目錄或者單個文件

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

    • <log type="coverage-clover" target="build/logs/clover.xml"/> 表示導出coverage-clover格式的文件,導出文件名爲build/logs/clover.xml

    • <log type="coverage-text" target="php://stdout" showUncoveredFiles="true"/> 表示將日誌直接輸出到標準輸出,即終端上。

完整的XML格式,內容能夠參考 XML配置文件

須要注意的是在根元素<phpunit>中的屬性並非全部都在那個頁面介紹的,還有一部分在命令行選項之中,因此若是在附錄C找不到,那就去命令行選項(注意根元素屬性在命令行選項中是以-分隔的)那一節找找,確定有的。

Travis-CI

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

  • 點擊本身的頭像進行我的資料界面,在下面你的項目中,點擊你所須要自動構建的項目前的按鈕,這個按鈕就會變成綠色的勾

  • 在點擊到本身的用戶信息界面以後,在你的Repo上面會有一個簡單的使用介紹,開啓Travis-CI是很簡單的。

在你的項目根目錄新建.travis.yml文件,其中的內容爲

language: php

php:
  - '5.4'
  - '5.5'
  - '5.6'
  - '7.0'

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

script:
  - mkdir -p build/logs
  - phpunit -c phpunit.xml.dist --coverage-clover build/logs/clover.xml

after_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-CIBuild Jobs下看到

git push

接下來就是把這些文件push到Github上,Travis-CI就會自動構建,而後開始單元測試,並把測試結果中的代碼覆蓋率發送到Coveralls。如此,一套流程就結束了。

展現

辛辛苦苦大半天,就是爲了展現本身的成績啊。
因此咱們看到的別人家項目地下這麼漂亮的圖標咱們也要有啊。

README.md文件中添加(注意將如下 Github_ID 替換爲本身的 Github-ID,將 Repo_Name 替換爲你的項目名字。沒有尖括號哦~還有注意區分大小寫哦~若是還須要改分支(branch)的話,看到連接你應該也懂吧?我相信你! )

[![Build Status](https://travis-ci.org/<Github_ID>/<Repo_Name>.svg?branch=master)](https://travis-ci.org/<Github_ID>/<Repo_Name>)
[![Coverage Status](https://coveralls.io/repos/github/<Github_ID>/<Repo_Name>/badge.svg?branch=master)](https://coveralls.io/github/<Github_ID>/<Repo_Name>?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/<Github_ID>/<Repo_Name>

  • Packagit會在後臺clone你的項目,而且檢查項目中的composer.json文件,第一個要檢查的就是包的名字,若是包名中有大寫的字母,Packagit就會報一個包名不該該有大寫字母的錯誤,因此,這就是上文所說包名最好是小寫的來由。

  • 提交以後就能夠看到本身的這個包的一些信息了,好比被下載了多少次,被安裝了多少次。

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

  • 以後會讓你輸入用戶名和Token,這些信息都在你的Packagit主頁中 我的主頁

  • 我的主頁有個Your API Token的按鈕,按下按鈕,就能夠看到本身的API TOKEN了,注意保密哦

  • 其中packagist海油4個小圖標,記得替換 PACKAGIST_IDPACKAGE_NAME 哦,不是 Github_IDRepo_Name

相關文章
相關標籤/搜索