web-dev-qa-db-ja.com

カバレッジでpy.testを使用する場合、インポートは含まれません

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内で修正してください。一般公開されています。

39
Dave Halter

@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と組み合わせることで、カバレッジレポートを高速化できます。

65
Dave Halter

テストのカバレッジを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__.pysettings.pyもレポートから除外しました。これらはシンプルで完全なカバレッジを備えていますが、conftestの依存関係で時期尚早にインポートされたためです。

8
hynekcer

私の場合、すべてのテストが実行されますが、カバレッジは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ツールを使用するようアドバイスに従いました。

5
Jan Vlcinsky

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():
  ...
2
Fabian Kreutz