本文以PHP項目做爲例子
所須要擁有(準備)的:php
Github
帳號html一個項目git
看着篇幅挺大的,不免有什麼遺漏,若是文中有錯誤的地方,還請各位斧正!謝謝。
由於原本篇幅就大,因此就沒配圖了,若是有不少人反饋看不懂或者失敗了,我再後期補下圖。謝謝!github
項目爲保證項目始終處於健康穩定的狀態,咱們須要一個能夠持續的自動的對貢獻的代碼進行自動化測試的服務。Travis-CI
就是在這樣的背景下於2011年開啓服務,到如今爲止已經有超過300k個開源項目和235k的用戶在使用。json
Travis-CI
所作的工做就是自動在虛擬機中運行.travis.yml
中設定的內容進行單元測試,生成並導出報告。bootstrap
開源項目之間通常有着相互依賴的關係,好比項目A的一個組件依賴於另外一個項目B。當這種依賴關係多了以後就須要一個管理依賴的工具。數組
Composer
就是PHP的一個依賴管理工具。它容許你申明項目所依賴的代碼庫,而且會在你的項目中安裝他們。Composer中文markdown
Packagist is the main Composer repository. It aggregates public PHP packages installable with Composer.app
這個網站是主要的Composer倉庫,經過Composer發佈的項目,所儲存的倉庫就是這個網站,這也是Composer安裝依賴的下載來源。可使用Github帳號登陸composer
登陸以後能夠提交本身的項目,不過須要項目中有composer.json
文件,這在以後進行介紹。
單元測試中,代碼覆蓋率常常被用來衡量測試好壞的指標。
所謂的代碼覆蓋率簡單的說就是在運行完測試用例以後,走過了多少句的代碼,好比說,你要測試的一個函數有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.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:
這個字段應該是這個項目的一個簡短的簡介。一行便可
type:
項目的類型,可選的值有library
project
metapackage
composer-plugin
具體請參考 Type 中文
require:
咱們的項目依賴於平臺軟件包
,也就是PHP,PHP的擴展包和一些系統類庫。因此咱們在require
之中添加了對PHP的依賴,若是有依賴於其餘的包,能夠按照這種格式填寫。具體請參考 Platform-packages 中文
require-dev:
這個字段列出的依賴只有在測試和開發的時候纔會安裝,屬於額外的依賴。具體請參考 Require-dev 中文
require & require-dev:
這兩個字段之下的列表項應該是包名到版本的映射
,其中版本有不少種寫法,能夠根據需求過濾。具體請參考 Package-Links 中文
autoload:
其中的映射關係設計到PHP命名空間(Name Space)的一些知識,具體請參考 PSR-0 - PSR-4 - PSR0-4_Github
composer.json
中有不少可選的字段和值,編寫的規範能夠參考Document,中文文檔
在項目的根目錄新建.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.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找不到,那就去命令行選項(注意根元素屬性在命令行選項中是以-
分隔的)那一節找找,確定有的。
使用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
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
下看到
接下來就是把這些文件push到Github上,Travis-CI
就會自動構建,而後開始單元測試,並把測試結果中的代碼覆蓋率發送到Coveralls
。如此,一套流程就結束了。
辛辛苦苦大半天,就是爲了展現本身的成績啊。
因此咱們看到的別人家項目地下這麼漂亮的圖標咱們也要有啊。
在README.md
文件中添加(注意將如下 Github_ID 替換爲本身的 Github-ID,將 Repo_Name 替換爲你的項目名字。沒有尖括號哦~還有注意區分大小寫哦~若是還須要改分支(branch)的話,看到連接你應該也懂吧?我相信你! )
[](https://travis-ci.org/<Github_ID>/<Repo_Name>) [](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
上發佈本身的包啦,發佈以後,就能夠被別人的項目經過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_ID
和 PACKAGE_NAME
哦,不是 Github_ID
和 Repo_Name
哦