web-dev-qa-db-ja.com

Pythonでcoverage.pyを適切に使用する方法は?

Coverage.py モジュールの使用を開始したばかりなので、動作を確認する簡単なテストを作成することにしました。

Sample.py

def sum(num1, num2):
    return num1 + num2


def sum_only_positive(num1, num2):
    if num1 > 0 and num2 > 0:
        return num1 + num2
    else:
        return None

test.py

from sample import sum, sum_only_positive

def test_sum():
    assert sum(5, 5) == 10

def test_sum_positive_ok():
    assert sum_only_positive(2, 2) == 4

def test_sum_positive_fail():
    assert sum_only_positive(-1, 2) is None

ご覧のように、私のコードはすべてテストで覆われており、py.testはすべてが合格したと言っています。 Coverage.pyが100%のカバレッジを表示することを期待しています。うーん、ダメ。

Coverage.py results

Coverage.pyにはtest.pyファイルが表示されない場合があるため、テスト関数をsample.pyファイルしてカバレッジを再度実行しました。
enter image description here

次に、次のコードブロックを追加しました。

if __name__ == "__main__":
    print(sum(2, 4))
    print(sum_only_positive(2, 4))
    print(sum_only_positive(-1, 3))

すべてのテスト機能を削除しました。その後、Coverage.pyは100%を示します。

enter image description here

なぜそうですか? Coverage.pyは、実行カバレッジだけでなく、コードテストカバレッジも表示すべきではありませんか? Coverage.pyの公式 F.A.Q。 を読みましたが、解決策が見つかりません。
多くのSOユーザーはコードテストとコードカバレッジに精通しているので、間違っている箇所を教えてください。

ここで考えたことが1つあります。Coverage.pyは、どのコード行が実行されていないかを単純に監視する可能性があるため、これらの行のテストを作成する必要があります。しかし、すでに実行されているがテストでカバーされていない行があるため、Coverage.pyはここで失敗します。

32
Groosha

カバレッジは、.coverageファイルを探して、そのレポートを読み取って生成します。 Py.test自体は作成しません。カバレッジのためにpy.testプラグインが必要です:

pip install pytest-cov

既にお持ちの場合は、次のように両方を一度に実行できます。

py.test test.py --cov=sample.py

つまり、テストモジュールtest.pyを実行し、sample.pyでカバレッジレポートを記録/表示します。

複数のテストを実行し、記録されたカバレッジを蓄積してから最終レポートを表示する必要がある場合、次のように実行できます。

py.test test.py --cov=sample.py --cov-report=
py.test test.py --cov=sample2.py --cov-report=
py.test test.py --cov=sample3.py --cov-report=

つまり、テストモジュールtest.pyを実行し、sample.pyのカバレッジ(のみ)を記録します-レポートを表示しません。

これで、完全なレポートのためにカバレッジコマンドを個別に実行できます。

coverage report -m

上記のコマンドは、以前のテスト実行で蓄積された.coverageデータファイルに基づいて、フォーマットされたカバレッジレポートを表示するだけです。 -mは、見逃した行、つまりテストでカバーされていない行を表示することを意味します。

Name        Stmts   Miss  Cover   Missing
-----------------------------------------
sample.py       6      0   100%  

カバレッジは、--include--omitなどのより多くのスイッチをサポートし、パスパターンを使用してファイルを含める/除外します。詳細については、ドキュメントをご覧ください: https://coverage.readthedocs.io/en/coverage-4.5.1/cmd.html#reporting

18
fips

実験を解析するのは少し難しく、各実験で使用したコマンドラインは含まれていません。しかし:テストを次のように実行する場合:

python -m py.test test.py

次に、coverage.pyで以下を実行できます。

coverage run -m py.test test.py
10
Ned Batchelder