国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

使用Coverage分析WSGI項(xiàng)目的代碼覆蓋率

YFan / 2038人閱讀

摘要:由于構(gòu)造函數(shù)不支持參數(shù),必須使用配置文件。使用文件作為的配置文件一般的項(xiàng)目都是多進(jìn)程,這需要分析子進(jìn)程的覆蓋率,需要用到配置文件。這里文檔說(shuō)在構(gòu)造函數(shù)里使用參數(shù)可以限制,實(shí)測(cè),沒(méi)有用會(huì)刪除文件,保證不會(huì)影響下次統(tǒng)計(jì)的結(jié)果。

關(guān)于Coverage

Coverage是Python代碼覆蓋率分析工具,有關(guān)它的介紹和安裝方法請(qǐng)見(jiàn):
Python代碼覆蓋率分析工具Coverage

用Python啟動(dòng)的web服務(wù)可以方便地使用Coverage分析其覆蓋率,具體請(qǐng)見(jiàn):
使用Coverage分析Python web項(xiàng)目的代碼覆蓋率

下面來(lái)說(shuō)說(shuō)WSGI項(xiàng)目的分析,這方面的資料較少,需要一定摸索。

使用Coverage分析WSGI項(xiàng)目的代碼覆蓋率

一個(gè)uWSGI + Django的項(xiàng)目,它的啟停命令如下:

sudo uwsgi --ini /xxx/uwsgi.cfg
sudo pkill -9 -f /xxx/uwsgi.cfg

所以,你是沒(méi)有辦法像使用Coverage分析Python web項(xiàng)目的代碼覆蓋率一樣用Coverage命令行coverage run的形式啟動(dòng)它的。必須使用Coverage api。

關(guān)于Coverage api,參見(jiàn)文檔:
http://coverage.readthedocs.org/en/latest/api_coverage.html

還需要用到一點(diǎn).coveragerc配置,參見(jiàn)文檔:
http://coverage.readthedocs.org/en/latest/config.html

修改wsgi.py文件

對(duì)于WSGI項(xiàng)目,需要修改創(chuàng)建WSGI application的文件,加入coverage api代碼。
本來(lái)它的代碼是這樣的:

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是指要統(tǒng)計(jì)分支代碼覆蓋率,加上這個(gè)參數(shù)可使統(tǒng)計(jì)更精確,具體區(qū)別參見(jiàn)文檔:http://coverage.readthedocs.org/en/latest/branch.html

concurrency指被測(cè)代碼使用的concurrency library,選項(xiàng)有g(shù)reenlet, eventlet, gevent, thread(默認(rèn))。本項(xiàng)目使用了gevent,這里設(shè)置成gevent。

config_file指Coverage的配置文件,這個(gè)配置文件主要用于指定parallel這個(gè)參數(shù)。由于Coverage構(gòu)造函數(shù)不支持parallel參數(shù),必須使用配置文件。

使用.coveragerc文件作為Coverage的配置文件

一般的Web項(xiàng)目都是多進(jìn)程,這需要Coverage分析子進(jìn)程的覆蓋率,需要用到Coverage配置文件。
官方文檔參見(jiàn):http://coverage.readthedocs.org/en/latest/config.html

在這個(gè)項(xiàng)目中,.coveragerc內(nèi)容如下,它需要與coverage api所在路徑一致,即與wsgi.py同目錄:

[run]
branch = True
parallel = True

這個(gè)配置使Coverage監(jiān)測(cè)被測(cè)代碼子進(jìn)程的覆蓋率,如果被測(cè)代碼是多進(jìn)程的,必須使用此參數(shù)。

在Coverage命令行啟動(dòng)中,可以這樣指定:

coverage run --parallel-mode xxx.py

但在api方式中,只能使用config_file設(shè)置。

關(guān)于Coverage構(gòu)造函數(shù)config_file參數(shù),文檔說(shuō)不設(shè)置默認(rèn)不使用配置文件,實(shí)際不是,只要有.coveragerc文件,就會(huì)使用其中的配置。

atexit.register方法

關(guān)于wsgi項(xiàng)目的覆蓋率統(tǒng)計(jì),最初我看到的資料(也是唯一的)是:
http://stackoverflow.com/questions/19025336/how-to-get-coverage-data-from-a-django-app-when-running-in-gunicorn

里面提到需要這樣保存覆蓋率結(jié)果:

def save_coverage():
    cov.stop()
    cov.save()
atexit.register(save_coverage)

意思是使用atexit.register注冊(cè)回調(diào)函數(shù),以在程序退出時(shí)保存結(jié)果。但為了觸發(fā)atexit.register,需要對(duì)被測(cè)進(jìn)程執(zhí)行kill -HUP。

經(jīng)過(guò)實(shí)測(cè),有的項(xiàng)目是不需要執(zhí)行kill -HUP的。子進(jìn)程在收到請(qǐng)求時(shí)會(huì)自動(dòng)退出,保存覆蓋率結(jié)果,同時(shí)主進(jìn)程會(huì)重啟一個(gè)子進(jìn)程。

這就意味著加入Coverage api以后,服務(wù)收到的每個(gè)請(qǐng)求都會(huì)重啟一個(gè)子進(jìn)程!這會(huì)嚴(yán)重影響性能。所以這種覆蓋率統(tǒng)計(jì)只能在線下做。

Coverage結(jié)果收集

經(jīng)過(guò)如上修改后,正常用uWSGI啟動(dòng)服務(wù):

sudo uwsgi --ini /xxx/uwsgi.cfg

啟動(dòng)后,執(zhí)行測(cè)試case,可以見(jiàn)到wsgi.py所在目錄下出現(xiàn)多個(gè).coverage開(kāi)頭的文件,文件名格式為.coverage.<機(jī)器名>.<進(jìn)程號(hào)>.<隨機(jī)數(shù)>。

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個(gè)文件,意味著發(fā)送了7個(gè)請(qǐng)求。

測(cè)試結(jié)束后,需要合并測(cè)試結(jié)果,生成報(bào)告:

coverage combine
coverage report -m yyy/*
coverage html yyy/*
coverage xml yyy/*
coverage erase

combine會(huì)合并7個(gè)文件成1個(gè).coverage,因?yàn)樽詈驝overage統(tǒng)計(jì)的是.coverage的結(jié)果。

report/html/xml:直接在終端顯示報(bào)告/生成html報(bào)告/生成xml報(bào)告,后面加路徑可以限制顯示哪些代碼的覆蓋率。(這里文檔說(shuō)在Coverage構(gòu)造函數(shù)里使用include參數(shù)可以限制,實(shí)測(cè),沒(méi)有用…)

erase會(huì)刪除.coverage文件,保證不會(huì)影響下次統(tǒng)計(jì)的結(jié)果。

生成的報(bào)告非常清晰,html和xml可以直接點(diǎn)擊進(jìn)入代碼文件查看。

coverage report結(jié)果:

  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:

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/37616.html

相關(guān)文章

  • Python代碼蓋率分析工具Coverage

    摘要:簡(jiǎn)介是一種用于統(tǒng)計(jì)代碼覆蓋率的工具,通過(guò)它我們可以檢測(cè)測(cè)試代碼的有效性,即測(cè)試對(duì)被測(cè)代碼的覆蓋率如何。支持分支覆蓋率統(tǒng)計(jì),可以生成報(bào)告。 Coverage簡(jiǎn)介 Coverage是一種用于統(tǒng)計(jì)Python代碼覆蓋率的工具,通過(guò)它我們可以檢測(cè)測(cè)試代碼的有效性,即測(cè)試case對(duì)被測(cè)代碼的覆蓋率如何。Coverage支持分支覆蓋率統(tǒng)計(jì),可以生成HTML/XML報(bào)告。XML報(bào)告可以集成入Jenk...

    zombieda 評(píng)論0 收藏0
  • 使用Coverage分析Python web項(xiàng)目代碼蓋率

    摘要:被測(cè)腳本只有正常退出或者以信號(hào)退出才能出發(fā),才能得到覆蓋率結(jié)果。如果直接或者用其他信號(hào)終止進(jìn)程,覆蓋率結(jié)果將會(huì)丟失參考文章腳本覆蓋率分析方法介紹。 關(guān)于Coverage Coverage是Python代碼覆蓋率分析工具,有關(guān)它的介紹和安裝方法請(qǐng)見(jiàn):Python代碼覆蓋率分析工具Coverage 用Python啟動(dòng)的web服務(wù)可以方便地使用Coverage分析其覆蓋率,假設(shè)一個(gè)web服務(wù)...

    marser 評(píng)論0 收藏0
  • Chrome DevTools 代碼蓋率功能詳解

    摘要:本文會(huì)介紹新增的代碼覆蓋率功能如何收集數(shù)據(jù)如何基于它收集的數(shù)據(jù)來(lái)改進(jìn)應(yīng)用的性能。動(dòng)態(tài)分析是指在應(yīng)用運(yùn)行狀態(tài)下收集代碼執(zhí)行數(shù)據(jù)的過(guò)程,換句話說(shuō),覆蓋率數(shù)據(jù)就是在代碼執(zhí)行過(guò)程中通過(guò)標(biāo)記收集到的。 showImg(https://segmentfault.com/img/remote/1460000009013741); 共 1812 字,讀完需 3 分鐘。工欲善其事必先利其器,前端周刊本周...

    robin 評(píng)論0 收藏0
  • phpunit 單元測(cè)試之代碼蓋率

    摘要:最近團(tuán)隊(duì)在不斷完善項(xiàng)目中的單元測(cè)試用例,會(huì)用到代碼覆蓋率分析,本來(lái)以為應(yīng)該默認(rèn)安裝了,所以使用來(lái)生成報(bào)告,但是執(zhí)行后提示如下錯(cuò)誤這是因?yàn)闆](méi)有安裝或啟用導(dǎo)致。 最近團(tuán)隊(duì)在不斷完善項(xiàng)目中的單元測(cè)試用例,會(huì)用到代碼覆蓋率分析,本來(lái)以為 homestead 應(yīng)該默認(rèn)安裝了 xdebug ,所以使用 phpunit --coverage-html ./tests/codeCoverage 來(lái)生成...

    blankyao 評(píng)論0 收藏0
  • 前端單元測(cè)試之Karma環(huán)境搭建

    摘要:主要完成一下工作啟動(dòng)一個(gè)服務(wù)器,生成包含源代碼和測(cè)試腳本的頁(yè)面運(yùn)行瀏覽器加載頁(yè)面,并顯示測(cè)試的結(jié)果如果開(kāi)啟檢測(cè),則當(dāng)文件有修改時(shí),執(zhí)行繼續(xù)執(zhí)行以上過(guò)程。如果我們引入了一些其它的庫(kù),比如之類(lèi)的,將源代碼和庫(kù)代碼打包在一起后,覆蓋率會(huì)更難看。。 前言 在前端開(kāi)發(fā)中,測(cè)試常常是被忽略的一環(huán)。因此最近在研究前端自動(dòng)化測(cè)試框架Karma,把個(gè)人的學(xué)習(xí)過(guò)程分享出來(lái),希望對(duì)大家有幫助。 什么是Kar...

    mrli2016 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<