pHp程式碼覆蓋率
一 安裝php環境
二 統計php程式碼覆蓋率
1 需要安裝xdebug
安裝步驟:
測試環境
- LNMP 軍哥一鍵包1.3版本
- PHP 7.0.7
- Xdebug 2.6
配置步驟
1
2
3
4
5
6
7
8 |
git clone git:
//github
.com
/xdebug/xdebug
.git cd
xdebug find
/ -name phpize /usr/bin/phpize // 生成configure 檔案 find
/ -name php-config .
/configure
--
enable
-xdebug --with-php-config=
/usr/local/php/bin/php-config make make
install |
注意此處./configure 可能會報錯,是因為linux 5之後不支援 ( 了,需要轉義 \( --- 應該是php版本的問題,可以聯絡公司運維也可以自己轉義下
開啟擴充套件
1
2
3
4 |
find
/ -name php.ini vi
/usr/local/php/etc/php
.ini 新增 extension=xdebug.so [Xdebug]
service restart php-fpm |
成功驗證:①在linux輸入php -version,如下:
② 訪問index.php(phpinfo())
2 安裝composer
curl -sS | phpphp composer.phar --version Composer version 1.6.5 2018-05-04 11:44:59
3 安裝phpcov 和 phpunit
此處選了phpunit 6.5.0 和phpcov 4.0.8,編輯composer.json檔案(phpcov是根據phpunit自動匹配的,php和phpunit對應關係可百度或看底部)
1
2
3
4
5
6
7 |
#composer.json {
"name"
:
"root/php-code-coverage"
,
"require-dev"
: {
"phpunit/phpunit"
:
"6.5.0"
,
"phpunit/phpcov"
:
"*" } |
執行命令安裝 php composer.phar install
安裝完成後校驗 如下即可(phpunit和phpcov一定要在這個目錄下使用)
1
2
3
4
5
6
7
8
9 |
vendor
/
bin [root@mt
-
jry
-
01
bin
]
# ll lrwxrwxrwx
1
root root
24
Jul
13
10
:
22
phpcov
-
> ..
/
phpunit
/
phpcov
/
phpcov lrwxrwxrwx
1
root root
26
Jul
13
10
:
21
phpunit
-
> ..
/
phpunit
/
phpunit
/
phpunit [root@mt
-
jry
-
01
bin
]
# .vendor/bin/phpunit --version PHPUnit
6.5
.
0
by Sebastian Bergmann
and
contributors. [root@mt
-
jry
-
01
bin
]
# .vendor/bin/phpcov --version phpcov
4.0
.
5
by Sebastian Bergmann. |
4 編寫測試程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 |
#userinfo.php <?php include_once(
"*****/prepend.php"
); $
id
=
$_POST[
"user_id"
]; if
($
id
!
=
10086
){
exit(); } $userinfo
=
array(
'username'
=
>
'jason'
,
'password'
=
>
'123456'
, ); $result
=
array(
'code'
=
>
10000
,
'message'
=
>
"success"
,
'data'
=
>$userinfo,
); echo json_encode($result); |
1
2
3
4
5
6
7 |
#prepend.php <?php require_once dirname(__FILE__).
'/vendor/autoload.php'
;
# 在composer生成的vender同級目錄 use SebastianBergmann\CodeCoverage\CodeCoverage; $coverage
=
new CodeCoverage; $coverage
-
>
filter
()
-
>addDirectoryToWhitelist(
'/var/www/html/userinfo.php'
);
# 白名單<br>$coverage->filter()->removeDirectoryFromWhitelist('/var/www/html/userinfo.php'); # 從白名單中移除資料夾<br>$coverage->filter()->removeFileFromWhitelist('/var/www/html/userinfo.php'); # 從白名單中移除檔案 |
1
2
3
4
5
6
7
8
9
10
11
12 |
$coverage
-
>start(
'<Site coverage>'
);
#開始統計 register_shutdown_function(
'__coverage_stop'
,$coverage);
#註冊關閉方法 function __coverage_stop(CodeCoverage $coverage){
$coverage
-
>stop();
#停止統計
$cov
=
'<?php return unserialize('
. var_export(serialize($coverage), true) .
');'
;
#獲取覆蓋結果,注意使用了反序列化
/
/
echo $cov;
file_put_contents(dirname(__FILE__).
'/cov/site.'
. date(
'U'
) .
'.'
.uniqid().
'.cov'
, $cov);
#將結果寫入到檔案中 } 若多個域名或者介面請求要在同一個prepend檔案裡分別統計,在新建$coverage前加
if
條件即可,如 if
(strpos($_SERVER[
'HTTP_HOST'
],
'
)
=
=
=
true){} |
5 測試
執行命令
1
2 |
[root@mt
-
jry
-
01
html]
# curl -d "user_id=10086" "127.0.0.1/userinfo.php" {
"code"
:
10000
,
"message"
:
"success"
,
"data"
:{
"username"
:
"jason"
,
"password"
:
"123456"
}} |
檢視prepend.php統計目錄cov下
-rw-r--r-- 1 apache apache 4609 Jul 13 14:45 site.1531464305.5b484a71c0a1c.cov
生成xml或者html報告命令如下:
1
2 |
./vendor/bin/phpcov merge --clover cov/coverage.xml cov/ -vvv # 在cov目錄下生成xml報告 ./vendor/bin/phpcov merge --html=
"cov/coverage_html"
cov/ -vvv # 在cov目錄下生成html報告 |
6 檢視報告結果
8 工程配置
在實際專案中有三種配置方式
- 在php.ini中引入prepend檔案:auto_prepend_file = /***/prepend.php (配置後重啟php) --- 所有php請求均會預載入該檔案,檔案有錯誤時影響整個php服務
- 在檔案入口檔案中引入prepend檔案:include_once(/www/***/prepend.conf); (一般為index.php) --- 效果同3,重新部署清掉配置
- 在nginx.conf中引入prepend檔案 --- 對於該域名的請求會載入該檔案(配置後重啟nginx)
1
2
3
4
5
6
7
8 |
location ~ .*\.php?$ {
fastcgi_pass 127.0.0.1:9200;
fastcgi_index index.php;
include common/fastcgi.conf;
fastcgi_param MY_ENV pre;
fastcgi_param PHP_VALUE
'auto_prepend_file=/www/data/phpcoverage/prepend.php'
; } |
7 問題:
① 開始使用的phpcov 2.0.2 & phpunit 4.8.7 生成的報告資料全為0 - phpunit4 不能支援 php7,對應版本見⑦
② 開始總是報錯PHP Fatal error: Uncaught Error: Class 'SebastianBergmann\CodeCoverage\CodeCoverage' not found in
是因為沒有引用vender目錄,在prepend.php里加一句require_once dirname(__FILE__).'/vendor/autoload.php'; 即可
③ 配置nginx
④ 請求域名沒有生成site檔案:請求許可權不夠,不能在對應目錄下寫檔案
chmod 777 -R 域名請求是apache許可權,如果與cov資料夾許可權不一致則不可寫入
⑤ 生成覆蓋率檔案有要統計的程式碼檔案,但是命中情況count全為0,有兩種可能
A xdebug的collect_param 與collect_return沒開啟,導致未收集到資料,需要在php.ini裡配置
B 如果在php.ini裡配置了auto_prepend_file=‘**/prepend.php’,則只有用指定目錄下的prepend.php檔案才能生成覆蓋率資料,否則覆蓋行全為0
⑥ 將xml報告整合到jenkins
注意:go 和 c++ 的xml報告可以用 Cobertura 統計到jenkins展示,php 的要用Clover PHP 外掛統計,phpcov生成的xml格式Cobertura解析不了會報錯
⑧ 問題:觀察每日構建的覆蓋率,在程式碼未更新,用例未更新的前提下,覆蓋率降低
- 該方式統計的程式碼總行數變化,與之前不一致 -- 實際兩天的程式碼完全一致
- 同一個檔案 的覆蓋行數不一致,發現會出現同一個分支中,上下行未覆蓋,而中間行覆蓋 和 空行被覆蓋(空白行 綠色,滑鼠放置提示 1test covers..)的
原因:猜測是 xdebug 統計抽風,因為 xdebug 負責收集統計程式碼,phpunit phpcov只是彙總整理為可讀報告。
解決:暫不能解決,可觀察xdebug和phpcoverage官網有類似問題
⑨ jenkins 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
cur_path=`pwd` echo ${cur_path} # 刪除歷史cov檔案,保證覆蓋率乾淨 find /www/data/phpcoverage/admin_cov/ -name
"site*"
| xargs rm -rf rm -rf ${cur_path}/reports/* #在工程入口檔案引入 prepend 檔案 sed -i
'2cinclude_once("/www/data/phpcoverage/prepend.php");'
/www/my_project/index.php # 更新自動化用例並執行用例 source /www/data/project3/venv/bin/activate git checkout master git pull python run.py # 統計html和xml報告,html更易讀,xml更直觀反映歷史情況 cd /www/data/phpcoverage ./vendor/bin/phpcov merge --clover ${cur_path}/reports/coverage.xml admin_cov/ -vvv ./vendor/bin/phpcov merge --html=
"${cur_path}/reports/coverage_html"
admin_cov/ -vvv # 從入口檔案刪除引用 sed -i
'2c//'
/www/my_project/index.php |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990585/viewspace-2746570/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 程式碼覆蓋率與測試覆蓋率比較
- 什麼是程式碼覆蓋率
- go 程式碼覆蓋率測試Go
- JaCoCo計算程式碼覆蓋率原理
- 在做服務端程式碼覆蓋率或者準備做程式碼覆蓋率的兄弟們,來聊聊???服務端
- Java 程式碼覆蓋率調研報告Java
- iOS 覆蓋率檢測原理與增量程式碼測試覆蓋率工具實現iOS
- Web端進行PHP程式碼函式覆蓋率測試的解決方案WebPHP函式
- 【譯】Visual Studio Enterprise 中的程式碼覆蓋率特性
- ReactNative 多端程式碼覆蓋率調研及實踐React
- 聊聊Go程式碼覆蓋率技術與最佳實踐Go
- 【Lua】實現程式碼執行覆蓋率統計工具
- [lua][openresty]程式碼覆蓋率檢測的解決方式REST
- idea2022.1 檢視單測覆蓋率展示分支覆蓋率Idea
- 前端質量提升利器-馬可程式碼覆蓋率平臺前端
- 唯品會iOS程式碼覆蓋率的應用實踐iOS
- Jenkins+Cobertura程式碼覆蓋率(學習筆記三十七)Jenkins筆記
- 基於Jacoco的單元測試程式碼覆蓋率統計
- C++語言的單元測試與程式碼覆蓋率C++
- James Shore:不要使用單元測試的程式碼覆蓋率
- php實現矩形覆蓋PHP
- java覆蓋率檢測-jacocoJava
- 關於程式碼覆蓋率,你不可不知的兩大陷阱!
- 自動化會提高測試覆蓋率,那測試覆蓋率是什麼?
- 開源專案核心程式碼單元測試 100% 覆蓋率實戰
- 進化的覆蓋率-程式碼實時染色系統 - 周為 / 翟帥
- 單元測試接入覆蓋率
- Jacoco--測試覆蓋率工具
- PHP變數覆蓋漏洞小結PHP變數
- 從零入門專案整合Karate和Jacoco,配置測試程式碼覆蓋率
- jacoco-1-java程式碼測試覆蓋率之本地環境初體驗Java
- 圖資料庫 Nebula Graph 的程式碼變更測試覆蓋率實踐資料庫
- 谷歌檢視CSS程式碼被誰覆蓋谷歌CSS
- Mockito提升單元測試覆蓋率Mockito
- 測試覆蓋率二改實現
- 覆蓋率檢查工具:JaCoCo 食用指南
- 測試覆蓋率 之 Cobertura的使用
- 如何提高全城wifi訊號覆蓋率WiFi