web-dev-qa-db-ja.com

Djangoテストカバレッジとコードカバレッジ

インストールと設定が完了しました Django-nose with coverage

問題は、./manage.py Shellそして、そのシェルを終了します-37%のコードカバレッジを示しています。実行されたコードがtestedコードを意味しないことを完全に理解しています。私の唯一の質問は-今何をしているのですか?

私が想定しているのは、すべてのpythonモジュールをインポートして「解決」してからテストを実行し、coverageと直接通信して「OK、カウントを開始するここにコード。」

理想的には、これはnoseによって行われ、各テストスイートを実行する直前に、「変更された」コード行を本質的にリセットします。

どこから探して開発を始めるのかわかりません。オンラインで検索しましたが、実りのあるものは見つかりませんでした。ヘルプ/ガイドラインをいただければ幸いです。

追伸.

私はこのようなものを実行してみました:

Django_SETTINGS_MODULE=app.settings_dev coverage run app/tests/gme_test.py

そして、それは機能しました(1%のカバレッジを示しました)が、アプリ全体に対してこれを行う方法を理解できません

編集:これは私のカバレッジ設定です:

[run]
source = .
branch = False
timid = True
[report]
show_missing = False
include = *.py
omit =
    tests.py
    *_test.py
    *_tests.py
    */site-packages/*
    */migrations/*
[html]
title = Code Coverage
directory = local_coverage_report
29
Mikhail

django-noseを使用しているため、カバレッジを実行する方法には2つのオプションがあります。最初のものはすでにDaveBによって指摘されていました:

coverage run ./manage.py test myapp

上記は実際にカバレッジを実行し、テストコマンドによって実行されるすべてのコードを監視します。

ただし、Django-noseパッケージにはデフォルトでノーズカバレッジプラグインが含まれています( http://nose.readthedocs.org/en/latest/plugins/cover.html )。次のように使用できます。

./manage.py test myapp --with-coverage

(HTMLレポートを含めるかどうかなど、どのモジュールをカバーする必要があるかなどの追加オプションもあります。これらはすべて上記のリンクに記載されています-いくつかのクイック情報のために./manage.py test --helpと入力することもできます)。

ノーズカバレッジプラグインを実行すると、カバレッジが実行されますafter Djangoブートストラップコードが実行されるため、対応するコードはカバーされていると報告されません。

元の方法でカバレッジを実行するとカバーされると報告されるコードのほとんどは、インポートステートメント、クラス定義、クラスメンバーなどです。pythonはインポート時にそれらを評価するので、カバレッジはそれらを自然にマークしますただし、Django=環境がロードされた後にテストランナーが開始するため、ノーズプラグインを実行してもブートストラップコードはカバーされたものとして報告されません。もちろん、これの副作用として100を達成することはできません。 %scope(... or close :))グローバルスコープステートメントはカバーされないため。

前後に切り替えてカバレッジオプションで遊んだ後、次のようなカバレッジを使用することになりました。

coverage run --source=myapp,anotherapp ---omit=*/migrations/* ./manage.py test

そのため、a)対象範囲will対象となるインポートステートメント、クラスメンバー定義などを報告します(これは実際には真実です-このコードは正常にインポートおよび解釈されました)およびb)対象範囲myコードではなくDjangoコード、または私が使用する他のサードパーティアプリ。カバレッジパーセンテージは、プロジェクトがどの程度カバーされているかを反映しています。

31
ppetrid

同じ問題がありました。賞金を獲得した回答で概説されているものと同様のオプションを指定した.coveragercファイルを作成して、時間を節約しました。

ここで 'coverage run manage.py test'を実行し、次に 'coverage report -m'を実行すると、カバレッジレポートと対象外の行が表示されます。

(.coveragercファイルの詳細については、こちらをご覧ください: http://nedbatchelder.com/code/coverage/config.html

3

「ここで、到達したコードのカウントを開始します。」カバレッジモジュールのAPIを使用して実行できます。これはシェルからチェックアウトできます。 http://nedbatchelder.com/code/coverage/api.html から直接盗みました:

import coverage

cov = coverage.coverage()
cov.start()

# .. call your code ..

cov.stop()
cov.save()

cov.html_report()

独自のテストランナーを作成して、ニーズに正確に一致させることができます(ユニットテストから得られたカバレッジは問題ないと考える人もいれば、そのユニットのユニットテストによって引き起こされたユニットのカバレッジのみを受け入れる人もいます) 。)

あなたがここで達成しようとしていることに少し混乱しています。

Djangoでのテストはここで非常によくカバーされています: https://docs.djangoproject.com/en/dev/topics/testing/overview/

アプリでテストをtest.pyとして記述します-標準のDjango=方法は非常に単純なので、鼻の必要はありません。

次に、それらをcoverage run ./manage.py test mainとして実行します-'main'はアプリです

ここに記載されているように、コードのソースファイルを指定します: http://nedbatchelder.com/code/coverage/cmd.html コードのみがカウントされるようにします

例えばカバレッジ実行--source = main ./manage.py test main

例として提供されている簡単なテストでカバーされているとマークされた特定のパーセンテージが引き続き得られます。これは、モジュールの定義など、サーバーを起動するためにコードの一部が実行されるためです。

1
DaveB