用 Coveralls 來透過「程式碼涵蓋率」檢測你的「單元測試覆蓋量」!

一旦你的專案有了先前提到的單元測試後,你可以透過程式碼涵蓋率來查看你的單元測試涵蓋了你整個專案的多少百分比,和相關資料。

我為什麼要知道涵蓋率?

透過得知涵蓋率和其資料,你能夠更加地完善你的單元測試,讓你的專案更加完固。

什麼是 Coveralls?

Coveralls 是一家程式碼涵蓋率資料分析平台,當我們的單元測試結束後會生成一個涵蓋率資料,接著 Coveralls 會接收到這個資料,然後做分析,我們就可以在網站上直接觀看相關的資料。


1. 事前準備

在這裡我們是透過 PHPUnit 產生 Coverage 的報表,然後自動上傳到 Coveralls,這裡是必要事項。

  1. 必須要有 XDebug這部分我卡了兩天才發現我沒裝這個,導致報表生不出來..)。
  2. PHP 的 curl 要安裝。
  3. 要有 Coveralls 帳號
  4. 要有 PHPUnit這部分請參考「透過 PHPUnit 來幫你的 PHP 專案進行單元測試!)。

2. 啟用 Coveralls

因為可以直接透過 Github 登入,在這裡就不敘述如何註冊 Coveralls 了,現在來到 ADD REPO 的頁面,將要啟用涵蓋率紀錄的倉庫切換成 ON 即可。

記住:如果你要替私人倉庫啟用 Coveralls 則要付費。

3. 撰寫 .Coveralls.yml

這個檔案是用來設定 Coveralls 的,如果你是私人倉庫的話,你專案中的根目錄必須要有這個檔案。

(私人倉庫)取得你的 Coveralls Token

公開的倉庫可省略此步驟,如果你是私人倉庫要套用 Coveralls,請取得寫在你 Coveralls 倉庫裡的 Token,這個 Token 是很私人的一個東西,還請不要和其他人分享

現在進到 Coveralls 裡的倉庫,有個 repo_token: 接著後面就是你的 Token,請將這個複製下來稍後會用到。

(私人倉庫)撰寫 .coveralls.yml

記住,這個步驟僅有私人倉庫才需要,現在你需要在你專案中的跟目錄底下新增一個 .coveralls.yml 的檔案,其內容如下。

repo_token: 你的TOKEN放在這  
coverage_clover: build/logs/clover.xml  
json_path: build/logs/coveralls-upload.json  
service_name: 服務名稱  

服務名稱就是自動建置的服務,例如 travis-protravis-ci 或者你使用的是自己架設的 drone如果都不是,請移除該行

4. 安裝 php-coveralls

接著我們要安裝 php-coveralls,由 satooshi 撰寫的(Github 在這裡),這個套件用來協助我們在稍後可以將 PHPUnit 的報表上傳至 Coveralls。

先透過下列指令安裝 php-coveralls

$ wget https://github.com/satooshi/php-coveralls/releases/download/v1.0.0/coveralls.phar
$ chmod +x coveralls.phar
$ mv coveralls.phar /usr/local/bin/coveralls

5. 改寫 PHPUnit 設定

接著要改寫原有的 phpunit.xml 設定,在之前曾經提到像下面這樣的內容。

<?xml version="1.0" encoding="UTF-8"?>  
<phpunit colors="true">  
    <testsuites>
        <testsuite name="My PHP Project">
            <directory>test</directory>
        </testsuite>
    </testsuites>
</phpunit>  

這個時候我們為了要在結束時產生 Coverage 報表,我們要改成下列這樣。

<?xml version="1.0" encoding="UTF-8"?>  
<phpunit colors="true">  
    <testsuites>
        <testsuite name="My PHP Project">
            <directory>test</directory>
        </testsuite>
    </testsuites>
    <logging>
        <log type="coverage-clover" target="build/logs/clover.xml"/>
    </logging>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">你程式專案的路徑</directory>
        </whitelist>
    </filter>
</phpunit>  

如此一來就會將「你程式專案的路徑」底下的所有 .php 檔案納入程式碼涵蓋率的計算中,並在 PHPUnit 完成測試後自動在 build/logs/clover.xml 產生相關報表。

如果你不清楚什麼是「你程式專案的路徑」,假設我們設定成 application,那麼 PHPUnit 就會把 application 底下的所有 .php 檔案納入報表中。

6. 執行 Coveralls

通常你會透過 PHPUnit 測試你的單元,在這之後你還需要新增一行指令

$ coveralls -v -x build/logs/clover.xml

如此一來就會將 clover.xml 自動上傳至 Coveralls 了。

7. 觀看結果

接著你就可以回到 Coveralls 來觀看相關結果了。


圖示來源:span by Arthur Shlain from the Noun Project