使用Coverage分析Python web項目的代碼覆蓋率



http://www.thinksaas.cn/group/topic/396057/


用Python啓動的web服務可以方便地使用Coverage分析其覆蓋率,假設一個web服務,它的啓停命令如下:

sudo python xxx/main.py --port=8888 --logging=none > /dev/null 2>&1 &
ps auxf|grep xxx/main.py |grep -v grep |awk '{print $2}'|sort -r| sudo xargs kill

像這樣用python啓動的服務可以使用Coverage命令行啓動,用kill -2的關閉,即可統計代碼覆蓋率。

啓停命令

使用如下啓停命令:

sudo coverage run --parallel-mode --branch --include="yyy/*"xxx/main.py --port=8888 --logging=none > /dev/null 2>&1 &
ps auxf|grep xxx/main |grep -v grep |awk '{print $2}'|sort -r|sudo xargs kill -2

與原來的命令區別在啓動命令用coverage run和一組參數替代python,停止命令用kill -2殺進程

解釋一下啓動命令參數:

  • --parallel-mode:使Coverage監測被測代碼子進程的覆蓋率,如果被測代碼是多進程的,必須使用此參數;

  • --branch:統計分支代碼覆蓋率,加上這個參數可使統計更精確,具體區別參見文檔:http://coverage.readthedocs.org/en/latest/branch.html

  • --include: 限定要統計代碼的路徑,如果不限定,Coverage會把請求涉及到的所有代碼,包括系統庫和Tornado框架的代碼都分析一遍,會大大拉低代碼覆蓋率;

各參數具體可參見:http://coverage.readthedocs.org/en/latest/cmd.html

  • 停止命令,必須使用kill -2。 這是因爲Coverage在實現上使用了atexit模塊註冊一個回調函數,在Python退出時將內存中的覆蓋率結果寫到文件中。被測腳本只有正常退出或者以SIGINT 2信號退出才能出發atexit,才能得到覆蓋率結果。如果直接kill(SIGTERM 15)或者用其他信號終止進程,覆蓋率結果將會丟失(參考文章:Python腳本覆蓋率分析方法介紹)。

  • CTRL+C發的即是SIGINT 2信號,所以前臺啓動的服務用CTRL+C停止後可以出結果

Coverage結果收集

服務必須以coverage run啓動,並以kill -2終止後,纔出現統計結果:
<code>
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

每個.coverage.xxx文件代表一個子進程的覆蓋率,文件名格式爲.coverage.<機器名>.<進程號>.<隨機數>。

測試結束後,需要合併測試結果,生成報告:

coverage combine
coverage report -m
coverage html
coverage xml
coverage erase
  • combine會合並7個.coverage.xxx文件成1個.coverage,因爲最後Coverage統計的是.coverage的結果。

  • report/html/xml:直接在終端顯示報告/生成html報告/生成xml報告。

  • erase會刪除.coverage文件,保證不會影響下次統計的結果。

生成的報告非常清晰,html和xml可以直接點擊進入代碼文件查看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章