摘要:由于構造函數不支持參數,必須使用配置文件。使用文件作為的配置文件一般的項目都是多進程,這需要分析子進程的覆蓋率,需要用到配置文件。這里文檔說在構造函數里使用參數可以限制,實測,沒有用會刪除文件,保證不會影響下次統計的結果。
關于Coverage
Coverage是Python代碼覆蓋率分析工具,有關它的介紹和安裝方法請見:
Python代碼覆蓋率分析工具Coverage
用Python啟動的web服務可以方便地使用Coverage分析其覆蓋率,具體請見:
使用Coverage分析Python web項目的代碼覆蓋率
下面來說說WSGI項目的分析,這方面的資料較少,需要一定摸索。
使用Coverage分析WSGI項目的代碼覆蓋率一個uWSGI + Django的項目,它的啟停命令如下:
sudo uwsgi --ini /xxx/uwsgi.cfg sudo pkill -9 -f /xxx/uwsgi.cfg
所以,你是沒有辦法像使用Coverage分析Python web項目的代碼覆蓋率一樣用Coverage命令行coverage run的形式啟動它的。必須使用Coverage api。
關于Coverage api,參見文檔:
http://coverage.readthedocs.org/en/latest/api_coverage.html
還需要用到一點.coveragerc配置,參見文檔:
http://coverage.readthedocs.org/en/latest/config.html
對于WSGI項目,需要修改創建WSGI application的文件,加入coverage api代碼。
本來它的代碼是這樣的:
import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxx.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
需要在其前后加入coverage控制,以下代碼須安裝Coverage 4.0:
########### import coverage, atexit cov = coverage.Coverage(branch=True, concurrency="gevent", config_file=".coveragerc") cov.start() ########### import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xxx.settings") from django.core.wsgi import get_wsgi_application application = get_wsgi_application() ########### def save_coverage(): cov.stop() cov.save() atexit.register(save_coverage) ###########
解釋一下這一句:
cov = coverage.Coverage(branch=True, concurrency="gevent", config_file=".coveragerc")
branch是指要統計分支代碼覆蓋率,加上這個參數可使統計更精確,具體區別參見文檔:http://coverage.readthedocs.org/en/latest/branch.html
concurrency指被測代碼使用的concurrency library,選項有greenlet, eventlet, gevent, thread(默認)。本項目使用了gevent,這里設置成gevent。
config_file指Coverage的配置文件,這個配置文件主要用于指定parallel這個參數。由于Coverage構造函數不支持parallel參數,必須使用配置文件。
使用.coveragerc文件作為Coverage的配置文件一般的Web項目都是多進程,這需要Coverage分析子進程的覆蓋率,需要用到Coverage配置文件。
官方文檔參見:http://coverage.readthedocs.org/en/latest/config.html
在這個項目中,.coveragerc內容如下,它需要與coverage api所在路徑一致,即與wsgi.py同目錄:
[run] branch = True parallel = True
這個配置使Coverage監測被測代碼子進程的覆蓋率,如果被測代碼是多進程的,必須使用此參數。
在Coverage命令行啟動中,可以這樣指定:
coverage run --parallel-mode xxx.py
但在api方式中,只能使用config_file設置。
關于Coverage構造函數config_file參數,文檔說不設置默認不使用配置文件,實際不是,只要有.coveragerc文件,就會使用其中的配置。
atexit.register方法關于wsgi項目的覆蓋率統計,最初我看到的資料(也是唯一的)是:
http://stackoverflow.com/questions/19025336/how-to-get-coverage-data-from-a-django-app-when-running-in-gunicorn
里面提到需要這樣保存覆蓋率結果:
def save_coverage(): cov.stop() cov.save() atexit.register(save_coverage)
意思是使用atexit.register注冊回調函數,以在程序退出時保存結果。但為了觸發atexit.register,需要對被測進程執行kill -HUP。
經過實測,有的項目是不需要執行kill -HUP的。子進程在收到請求時會自動退出,保存覆蓋率結果,同時主進程會重啟一個子進程。
這就意味著加入Coverage api以后,服務收到的每個請求都會重啟一個子進程!這會嚴重影響性能。所以這種覆蓋率統計只能在線下做。
Coverage結果收集經過如上修改后,正常用uWSGI啟動服務:
sudo uwsgi --ini /xxx/uwsgi.cfg
啟動后,執行測試case,可以見到wsgi.py所在目錄下出現多個.coverage開頭的文件,文件名格式為.coverage.<機器名>.<進程號>.<隨機數>。
xxx@xxx:/xxx$ ll total 2708 drwxr-xr-x 11 root root 4096 Sep 25 11:46 ./ drwxr-xr-x 6 root root 4096 Sep 25 08:30 ../ -rw-rw-rw- 1 root root 284691 Sep 25 11:46 .coverage.xxx.15845.747211 -rw-rw-rw- 1 root root 284917 Sep 25 11:45 .coverage.xxx.15846.592706 -rw-rw-rw- 1 root root 284274 Sep 25 11:45 .coverage.xxx.15847.688607 -rw-rw-rw- 1 root root 284583 Sep 25 11:45 .coverage.xxx.15858.136003 -rw-rw-rw- 1 root root 284274 Sep 25 11:46 .coverage.xxx.15867.746159 -rw-rw-rw- 1 root root 284691 Sep 25 11:46 .coverage.xxx.15876.004083 -rw-rw-rw- 1 root root 283820 Sep 25 11:46 .coverage.xxx.15886.921243
有7個文件,意味著發送了7個請求。
測試結束后,需要合并測試結果,生成報告:
coverage combine coverage report -m yyy/* coverage html yyy/* coverage xml yyy/* coverage erase
combine會合并7個文件成1個.coverage,因為最后Coverage統計的是.coverage的結果。
report/html/xml:直接在終端顯示報告/生成html報告/生成xml報告,后面加路徑可以限制顯示哪些代碼的覆蓋率。(這里文檔說在Coverage構造函數里使用include參數可以限制,實測,沒有用…)
erase會刪除.coverage文件,保證不會影響下次統計的結果。
生成的報告非常清晰,html和xml可以直接點擊進入代碼文件查看。
coverage report結果:
Name Stmts Miss Branch BrPart Cover Missing ------------------------------------------------------------------------ yyy/__init__.py 0 0 0 0 100% yyy/111.py 89 12 16 3 86% 82, 89-91, 104, 108-110, 123, 127-129, 81->82, 103->104, 122->123 yyy/222.py 60 44 14 0 22% 30-89, 97-103 yyy/333.py 268 31 74 16 85% 48, 56-57, 70, 78-79, 92, 109, 117, 131, 154, 175, 195-206, 217, 235, 256, 277, 304, 327, 344, 366-367, 45->48, 67->70, 89->92, 106->109, 116->117, 128->131, 151->154, 172->175, 184->181, 214->217, 232->235, 253->256, 274->277, 301->304, 324->327, 341->344 ……(略) ------------------------------------------------------------------------ TOTAL 7180 1872 1976 414 70%
XML(集成到Jenkins):
XML(集成到Sonar):
HTML:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37616.html
摘要:簡介是一種用于統計代碼覆蓋率的工具,通過它我們可以檢測測試代碼的有效性,即測試對被測代碼的覆蓋率如何。支持分支覆蓋率統計,可以生成報告。 Coverage簡介 Coverage是一種用于統計Python代碼覆蓋率的工具,通過它我們可以檢測測試代碼的有效性,即測試case對被測代碼的覆蓋率如何。Coverage支持分支覆蓋率統計,可以生成HTML/XML報告。XML報告可以集成入Jenk...
摘要:被測腳本只有正常退出或者以信號退出才能出發,才能得到覆蓋率結果。如果直接或者用其他信號終止進程,覆蓋率結果將會丟失參考文章腳本覆蓋率分析方法介紹。 關于Coverage Coverage是Python代碼覆蓋率分析工具,有關它的介紹和安裝方法請見:Python代碼覆蓋率分析工具Coverage 用Python啟動的web服務可以方便地使用Coverage分析其覆蓋率,假設一個web服務...
摘要:本文會介紹新增的代碼覆蓋率功能如何收集數據如何基于它收集的數據來改進應用的性能。動態分析是指在應用運行狀態下收集代碼執行數據的過程,換句話說,覆蓋率數據就是在代碼執行過程中通過標記收集到的。 showImg(https://segmentfault.com/img/remote/1460000009013741); 共 1812 字,讀完需 3 分鐘。工欲善其事必先利其器,前端周刊本周...
摘要:最近團隊在不斷完善項目中的單元測試用例,會用到代碼覆蓋率分析,本來以為應該默認安裝了,所以使用來生成報告,但是執行后提示如下錯誤這是因為沒有安裝或啟用導致。 最近團隊在不斷完善項目中的單元測試用例,會用到代碼覆蓋率分析,本來以為 homestead 應該默認安裝了 xdebug ,所以使用 phpunit --coverage-html ./tests/codeCoverage 來生成...
摘要:主要完成一下工作啟動一個服務器,生成包含源代碼和測試腳本的頁面運行瀏覽器加載頁面,并顯示測試的結果如果開啟檢測,則當文件有修改時,執行繼續執行以上過程。如果我們引入了一些其它的庫,比如之類的,將源代碼和庫代碼打包在一起后,覆蓋率會更難看。。 前言 在前端開發中,測試常常是被忽略的一環。因此最近在研究前端自動化測試框架Karma,把個人的學習過程分享出來,希望對大家有幫助。 什么是Kar...
閱讀 2315·2021-09-28 09:45
閱讀 3599·2021-09-24 09:48
閱讀 2266·2021-09-22 15:49
閱讀 3099·2021-09-08 16:10
閱讀 1592·2019-08-30 15:54
閱讀 2327·2019-08-30 15:53
閱讀 3021·2019-08-29 18:42
閱讀 2873·2019-08-29 16:19