7

ノーズテストとカバレッジ モジュールを使用して、コードのカバレッジ レポートにテスト対象のバージョンを反映させたいと考えています。次のコードを検討してください。

import sys
if sys.version_info < (3,3):
    print('older version of python')

Python バージョン 3.5 でテストするとprint()、未テストとして表示されます。カバレッジでその行を無視したいのですが、python バージョン 3.3 以降を使用してテストしている場合のみです。

が未満でない場合にのみ# pragma: no coverprint()ステートメントのようなことを行う方法はありますか? 事実上、私は次のようなことをしたいと思います:sys.version_info(3,3)

import sys
if sys.version_info < (3,3):
    print('older version of python') # pragma: [py26,py27,py32] no cover
4

3 に答える 3

8

もう 1 つのオプションは、Python のバージョンごとに異なる .coveragerc ファイルを使用し、バージョンexclude_linesごとに異なる正規表現を設定することです。

たとえば、 # no cover 3.xvsなど、別のコメント文字列を使用する人もいます。# no cover 2.x

ただし、コメント プラグマを使用する必要はまったくないことに注意してください。正規表現は行全体に適用されます。たとえば、次のように条件文に短い表記を使用するとします。

if PY2:
    blah_py2_stuff_blah()

次に、Python 3 の .coveragerc ファイルには次のものが含まれる可能性があります。

[report]
exclude_lines =
    # pragma: no cover
    if PY2:

その後、if PY2:余分なコメントや労力を費やすことなく、行が除外されます。

于 2016-02-21T21:27:14.177 に答える
2

コメントで説明しているように、カバレッジ レポートには行番号のみが表示されるので、これらを何度も再確認する必要はありません。

一方で、どちらか一方のツールを満足させるためにコードをコメントで雑然とさせることにはあまり賛成ではありません。したがって、コードの乱雑さを回避しながら、常に再チェックを行う負担を取り除く別のアプローチを提案したいと思います。

アイデアは、将来のカバレッジ分析結果を比較できるカバレッジ状況のベースラインを作成することです。たとえば、coverage.py からのカバレッジ レポートは次のようになります ( http://coverage.readthedocs.org/en/coverage-4.0.3/index.htmlから引用)。

Name                      Stmts   Miss  Cover   Missing
-------------------------------------------------------
my_program.py                20      4    80%   33-35, 39
my_other_module.py           56      6    89%   17-23
-------------------------------------------------------
TOTAL                        76     10    87%

この出力は「ベースライン」の基礎として使用できます: 大まかなアイデア (改善については以下を参照) は、この出力を「受け入れられた」カバレッジ状況として保存し、将来のカバレッジ レポートと比較することです。残念ながら、行番号が変更されるたびに、レポートを比較すると相違点が表示されます。これを回避するには、この基本的な考え方を改善できます。

簡単なスクリプトを使用して、行番号の代わりに関連行の内容が表示されるようにレポートを変換できます。たとえば、上記のコード例に基づく架空のレポートは次のようになります。

Name                      Stmts   Miss  Cover   Missing
-------------------------------------------------------
my_program.py                20      1     5%   3

このレポートから、Python バージョン >= 3.3 の次の「カバレッジ ベースライン」を、たとえば file に作成できますcoverage-baseline-33andabove.txt

my_program.py:
-    print('older version of python')

このベースラインは、ファイルの先頭にインポート行などを追加しても同じように見えます。カバレッジを決定する他の Python バージョン用に、さらにベースライン ファイルが作成されます。

さらに可能な改善は、次のような行のグループを分離することです。

my_program.py:
*
-    print('older version of python')
*
-    cleanup()
-    assert False
my_program2.py:
*
-    print('older version of python')

カバーされていないコードが変更 (追加、削除、変更、移動) されたとき、およびファイル名が変更されたときにのみ違いが見られます。その後、差異が発生すると、新しい「カバレッジ ベースライン」を保存するか、元のベースライン コンテンツに再び到達するまでテストを追加する必要があります。

于 2016-02-20T22:43:19.383 に答える