ノーズ カバレッジの出力を (パッケージではなく) ディレクトリに制限できますか?
-
21-08-2019 - |
質問
私のSUTは次のようになります:
foo.py
bar.py
tests/__init__.py [empty]
tests/foo_tests.py
tests/bar_tests.py
tests/integration/__init__.py [empty]
tests/integration/foo_tests.py
tests/integration/bar_tests.py
走るとき nosetests --with-coverage
, 、私は無視したいあらゆる種類のモジュールの詳細を取得します。しかし、私は使用できません--cover-package=PACKAGE
オプションだから foo.py
& bar.py
パッケージには含まれていません。(後のスレッドを参照してくださいhttp://lists.idyll.org/pipermail/testing-in-python/2008-April/001091.htmlパッケージに入れなかったのは私の理由です。)
カバレッジ出力を foo.py と bar.py だけに制限できますか?
アップデート - これより良い答えがないと仮定すると、 ナディア以下に追加の質問をしました。 「ディレクトリ内の一致するすべてのファイル名をコマンドライン オプションに変換する (bash) シェル スクリプトを作成するにはどうすればよいですか?」
解決
次のように使用できます。
--cover-package=foo --cover-package=bar
確認するために、nose のソースコードをざっと調べてみました。 これがラインです
if options.cover_packages:
for pkgs in [tolist(x) for x in options.cover_packages]:
他のヒント
次のものが使用できます。
--cover-package=.
または環境変数を設定することもできます
NOSE_COVER_PACKAGE=.
ノーズ 1.1.2 でテスト済み
トップレベルの Python ファイル/パッケージがたくさんあり、--cover-package を使用してそれらをすべて手動でリストするのは面倒なので、自分用に 2 つのエイリアスを作成しました。エイリアス nosetests_cover
--cover-package にリストされているすべてのトップレベルの Python ファイル/パッケージを使用してカバレッジを実行します。エイリアス nosetests_cover_sort
は同じことを実行し、さらにカバレッジの割合によって結果を並べ替えます。
nosetests_cover_cmd="nosetests --with-coverage --cover-erase --cover-inclusive --cover-package=\$( ls | sed -r 's/[.]py$//' | fgrep -v '.' | paste -s -d ',' )"
alias nosetests_cover=$nosetests_cover_cmd
alias nosetests_cover_sort="$nosetests_cover_cmd 2>&1 | fgrep '%' | sort -nr -k 4"
ノート:
- これは私の .bashrc ファイルからのものです。bash を使用しない場合は、適切に変更してください。
- これらは最上位ディレクトリから実行する必要があります。そうしないと、パッケージ名が正しくなくなり、カバレッジはそれらの処理に黙って失敗します (つまり、--cover-package が正しくないことを通知するのではなく、オプションをまったく指定しなかったかのように動作します)。
- 現在、Ubuntu 13.10 で Python 2.7.6 を使用しており、nose バージョン 1.3.0 とカバレッジ バージョン 3.7.1 を使用しています。これは、私がこれらのコマンドをテストした唯一のセットアップです。
- 使用法において、ニーズに合わない場合は、--cover-erase と --cover-inclusive を削除してください。
- 逆順ではなく通常の順序で並べ替えたい場合は、次のように置き換えます。
-nr
と-n
並べ替えコマンドで。 - これらのコマンドは、すべてのトップレベル Python ファイル/パッケージの名前がドットなし (「.py」のドット以外) であることを前提としています。これに当てはまらない場合は、以下の「詳細」セクションを読んでコマンド部分を理解し、必要に応じてコマンドを変更してください。
詳細:
これらが私が望む結果を達成するための最も効率的なコマンドであるとは主張しません。これらは私がたまたま思いついたコマンドです。=P
主に説明するのは、--cover-package の引数です。次のように、トップレベルの Python ファイル/パッケージ名のカンマ区切りリスト (ファイル名から「.py」が取り除かれたもの) が作成されます。
\$
-- を逃れます$
二重引用符で囲まれた文字列内の文字。$( )
-- に含まれるコマンドの結果を挿入します。ls
-- 現在のディレクトリ内のすべての名前をリストします (最上位の Python ディレクトリである必要があります)。| sed -r 's/[.]py$//'
-- リスト内の「foo_bar.py」を「foo_bar」に置き換えます。| fgrep -v '.'
-- リスト内で、ドットのないすべての名前を削除します (例:foo_bar.pyc とnotes.txt を削除します)。| paste -s -d ','
-- リストを改行区切りからカンマ区切りに変更します。
並べ替えについても説明する必要があります。
2>&1
-- stderr と stdout を結合します。| fgrep '%'
-- を含まないすべての出力行を削除します。%
キャラクター。| sort -nr -k 4
-- 残りの行を 4 番目の列 (カバレッジ パーセンテージの列) ごとに逆の番号順に並べ替えます。逆順ではなく通常順にしたい場合は、次のように置き換えます。-nr
と-n
.
これが誰かの役に立てば幸いです!=)
使用する場合 カバレッジ:py 3.0, の場合、標準ライブラリとインストールされているすべてのパッケージを含む、Python ディレクトリ内のコードはデフォルトで無視されます。
私だったらこうします:
nosetests --with-coverage --cover-package=foo,bar tests/*
私は他の提案された解決策よりもこの解決策を好みます。シンプルですが、どのパッケージを対象にしたいのかを明示的に指定できます。ナディアの答えにははるかに冗長な入力が含まれており、スチュアートの答えは sed を使用し、それでも呼び出してパッケージを作成します touch __init__.py
, 、 そして--cover-package=.
私にはうまくいきません。
setup.cfg を使用してこれを実行しようとしている人は、次のように機能します。複数のパッケージを指定する方法を理解するのに少し苦労しました。
[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'`
受け入れられた回答を次のように改善できます --cover-package=foo,bar