Jedi の場合、 テストカバレッジ を生成します。 stackoverflowには 関連する質問 がありますが、助けにはなりませんでした。
テストランナーとしてpy.testを使用しています。ただし、インポートおよびその他の「インポートされた」ものをレポートに追加することはできません。たとえば、__init__.py
は常に発見されたと報告されます。
Name Stmts Miss Cover
--------------------------------------------------
jedi/__init__ 5 5 0%
[..]
明らかに、このファイルはインポートされているため、テスト済みとして報告する必要があります。
次のようなテストを開始します[*]:
py.test --cov jedi
ご覧のとおり、pytest-coverage
を使用しています。
それでは、__init__.py
などのファイルのカバレッジを適切にカウントする方法はありますか?
[*] --doctest-modules
なしでテストを開始し(pytest.ini
から削除)、py.test -p pytest_cov --cov jedi
でカバレッジモジュールを以前にアクティブ化することも試みました。どちらも機能しません。
私は賞金を提供しました。 Jedi内で修正してください。一般公開されています。
@hynekcerは私に正しい考えを与えてくれました。しかし、基本的に最も簡単な解決策はどこかにあります:
- 取り除く pytest-cov
!
使用する
coverage run --source jedi -m py.test
coverage report
代わりに!!!このように、現在のpy.test構成でカバレッジを実行しているだけで、完全にうまく機能します!また、哲学的に正しい方法でもあります。各プログラムに1つのことを正しく実行させる-py.test
はテストを実行し、coverage
はコードカバレッジをチェックします。
今、これは暴言のように聞こえるかもしれませんが、本当に。 pytest-cov
はしばらくの間適切に動作していません。一部のテストは、使用しただけで失敗しました。
2014の時点で、pytest-covは手を変えたようです。 py.test --cov jedi test
は再び便利なコマンドのようです(コメントを見てください)。ただし、使用する必要はありません。ただし、xdist
と組み合わせることで、カバレッジレポートを高速化できます。
テストのカバレッジを94%に修正しました このパッチ によりインポートの依存関係が簡略化され、コマンドにより:
py.test --cov jedi test # or
py.test --cov jedi test --cov-report=html # + a listing with red uncovered lines
カバーされていない行は条件付きコマンドまたはあまり使用されていない関数にのみありますが、すべてのヘッダーは完全にカバーされています。
問題は、テスト構成test/conftest.py
がプロジェクト内のほぼすべてのファイルの依存関係により時期尚早にインポートすることでした。 conftestファイルは、テストを実行する前に設定する必要がある追加のコマンドラインオプションと設定も定義します。したがって、このファイルと一緒にインポートされたすべてを無視する場合、pytest_covプラグインは正しく動作すると思いますが、それは苦痛です。 __init__.py
とsettings.py
もレポートから除外しました。これらはシンプルで完全なカバレッジを備えていますが、conftestの依存関係で時期尚早にインポートされたためです。
私の場合、すべてのテストが実行されますが、カバレッジは0%でした。
修正は次のとおりです。
$ export PYTHONPATH="."
結果が正しかった後。
過去にいくつかのpy.test
コマンドに問題があり、何かをインポートするのに問題があり、PYTHONPATH
env varを設定することが解決策でした。今回もうまくいきました。
awslogs
の実際の例
最初にPYTHONPATH
を設定解除します:
$ py.test --cov=awslogs tests/
========================================= test session starts =========================================
platform linux2 -- Python 2.7.9, pytest-2.8.5, py-1.4.31, pluggy-0.3.1
rootdir: /home/javl/sandbox/awslogs/github/awslogs, inifile:
plugins: cov-2.2.0
collected 11 items
tests/test_it.py ...........Coverage.py warning: No data was collected.
--------------------------- coverage: platform linux2, python 2.7.9-final-0 ---------------------------
Name Stmts Miss Cover
-------------------------------------------
awslogs/__init__.py 2 2 0%
awslogs/bin.py 85 85 0%
awslogs/core.py 143 143 0%
awslogs/exceptions.py 12 12 0%
-------------------------------------------
TOTAL 242 242 0%
====================================== 11 passed in 0.38 seconds ======================================
結果のカバレッジは0%です。
次に、PYTHONPATH
を設定します。
$ export PYTHONPATH="."
そして、テストを再実行します。
$ py.test --cov=awslogs tests/
========================================= test session starts =========================================
platform linux2 -- Python 2.7.9, pytest-2.8.5, py-1.4.31, pluggy-0.3.1
rootdir: /home/javl/sandbox/awslogs/github/awslogs, inifile:
plugins: cov-2.2.0
collected 11 items
tests/test_it.py ...........
--------------------------- coverage: platform linux2, python 2.7.9-final-0 ---------------------------
Name Stmts Miss Cover
-------------------------------------------
awslogs/__init__.py 2 0 100%
awslogs/bin.py 85 9 89%
awslogs/core.py 143 12 92%
awslogs/exceptions.py 12 2 83%
-------------------------------------------
TOTAL 242 23 90%
====================================== 11 passed in 0.44 seconds ======================================
今、カバー率は90%です。
[〜#〜] warning [〜#〜]:PYTHONPATH
を操作すると、奇妙な副作用が生じる可能性があります。現在、pbr
ベースのパッケージが配布可能ビルド時にEggディレクトリを作成し、PYTHONPATH
が "。"に設定されている場合、Egg関連パッケージがインストール済みと自動的に見なされるという問題に遭遇します。このため、私はpytest-cov
の使用をやめ、代わりにcoverage
ツールを使用するようアドバイスに従いました。
Py.test、カバレッジ、およびDjangoプラグイン。この問題は、カバレッジが開始される前にモデルファイルがインポートされているようです。 -プラグインは機能しました。
Sys.modulesからモデルモジュールを削除し、モデルをテストするテストファイルに再インポートすることで修正しました(ugい?)。
import sys
del sys.modules['project.my_app.models']
from project.my_app import models
def test_my_model():
...