45

For Jedi we want to generate our test coverage. There is a related question in stackoverflow, but it didn't help.

We're using py.test as a test runner. However, we are unable to add the imports and other "imported" stuff to the report. For example __init__.py is always reported as being uncovered:

Name                           Stmts   Miss  Cover
--------------------------------------------------
jedi/__init__                      5      5     0%
[..]

Clearly this file is being imported and should therefore be reported as tested.

We start tests like this [*]:

py.test --cov jedi

As you can see we're using pytest-coverage.

So how is it possible to properly count coverage of files like __init__.py?

[*] We also tried starting test without --doctest-modules (removed from pytest.ini) and activate the coverage module earlier by py.test -p pytest_cov --cov jedi. Neither of them work.

I've offered a bounty. Please try to fix it within Jedi. It's publicly available.

4

5 に答える 5

77

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

于 2013-05-13T14:23:27.667 に答える
9

インポートの依存関係を簡素化するこのパッチと次のコマンドにより、テスト カバレッジを 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 の依存関係で時期尚早にインポートされるからです。

于 2013-05-12T23:26:23.333 に答える
3

py.test、カバレッジ、および django プラグインでこの問題が発生しました。モデル ファイルは、カバレッジが開始される前にインポートされるようです。カバレッジ プラグインを早期にロードするための「-p カバレッジ」でさえ機能しませんでした。

models モジュールを sys.modules から削除し、モデルをテストするテスト ファイルに再インポートすることで (醜い?) 修正しました。

import sys
del sys.modules['project.my_app.models']
from project.my_app import models

def test_my_model():
  ...
于 2013-08-07T13:21:23.847 に答える