Djangoプロジェクトのビューコード(およびビューコードによって呼び出されるコード)からコードカバレッジを取得するにはどうすればよいですか?gunicornで実行しているときにdjangoアプリケーションからカバレッジデータを取得する方法
coverage gunicorn <params>
には、行が表示されません。
Djangoプロジェクトのビューコード(およびビューコードによって呼び出されるコード)からコードカバレッジを取得するにはどうすればよいですか?gunicornで実行しているときにdjangoアプリケーションからカバレッジデータを取得する方法
coverage gunicorn <params>
には、行が表示されません。
coverage gunicorn <params>
は、作業者プロセスを作成し、coverage
モジュールはフォーク(基本的には新しいプロセスの作成)で動作できないため機能しません。あなたのWSGIアプリケーションが含まれているPythonのモジュール、例えば、しかし、the coverage API使用することができます。
# wsgi_with_coverage.py
import atexit
import sys
import coverage
cov = coverage.coverage()
cov.start()
from wsgi import application # adjust to python module containing your wsgi application
def save_coverage():
print >> sys.stderr, "saving coverage"
cov.stop()
cov.save()
atexit.register(save_coverage)
その後gunicorn -w 1 wsgi_with_coverage:application <other params>
を実行します。
問題は、CTRL + Cを使用してガンコンプロセスを終了すると、atexit
関数が呼び出されないということです。しかしはSIGHUP
で呼び出されるですので、kill -HUP $(cat <gunicorn_pidfile_here>)
を実行すると、カバレッジデータは(デフォルトでカレントディレクトリに ".coverage"に)保存する必要があります。
".coverage"ファイルをすべて上書きする可能性があるため、複数のgunicornワーカーでは動作しない可能性があります。複数の作業者が絶対必要な場合は、".coverage-%d" % os.getpid()
(ファイル名はvia the data_file
parameter to the coverage
constructorに設定)に書き込み、the combine()
methodを使用して個々の測定値をマージすることができます。
これは、ワーカープロセスがatexit
メソッドでクリーンアップできるかどうかによって、他のWSGIサーバーでも機能するはずです。
SIGHUPのアドバイスはあまり良くありません:)。 GunicornはSIGHUPの取得時にワーカープロセスをリロードします。つまり、収集されたカバレッジ・データは正確には保存されませんが、ロード時にのみ発生するもので上書きされます。一方、SIGTERを送信すると、atexitハンドラが正しく起動され、Gunicornが正常に終了します。 –