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にはtest.pyファイルが表示されない場合があるため、テスト関数をsample.py
ファイルしてカバレッジを再度実行しました。
次に、次のコードブロックを追加しました。
if __name__ == "__main__":
print(sum(2, 4))
print(sum_only_positive(2, 4))
print(sum_only_positive(-1, 3))
すべてのテスト機能を削除しました。その後、Coverage.pyは100%を示します。
なぜそうですか? Coverage.pyは、実行カバレッジだけでなく、コードテストカバレッジも表示すべきではありませんか? Coverage.pyの公式 F.A.Q。 を読みましたが、解決策が見つかりません。
多くのSOユーザーはコードテストとコードカバレッジに精通しているので、間違っている箇所を教えてください。
ここで考えたことが1つあります。Coverage.pyは、どのコード行が実行されていないかを単純に監視する可能性があるため、これらの行のテストを作成する必要があります。しかし、すでに実行されているがテストでカバーされていない行があるため、Coverage.pyはここで失敗します。
カバレッジは、.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
実験を解析するのは少し難しく、各実験で使用したコマンドラインは含まれていません。しかし:テストを次のように実行する場合:
python -m py.test test.py
次に、coverage.pyで以下を実行できます。
coverage run -m py.test test.py