20

私の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ため、このオプションを使用できません。 (パッケージに入れない理由については、http://lists.idyll.org/pipermail/testing-in-python/2008-November/001091.htmlの後のスレッドを参照してください 。)foo.pybar.py

カバレッジ出力をfoo.pyとbar.pyだけに制限できますか?

更新-以下のNadiaよりも良い答えがないと仮定して、フォローアップの質問をしました:「ディレクトリ内の一致するすべてのファイル名をコマンドラインオプションに変換する(bash)シェルスクリプトを作成するにはどうすればよいですか? 「」

4

8 に答える 8

22

次のように使用できます。

--cover-package=foo --cover-package=bar

私は確認するために鼻のソースコードをざっと見ました:これは行です

    if options.cover_packages:
        for pkgs in [tolist(x) for x in options.cover_packages]:
于 2009-05-12T22:23:05.487 に答える
15

次を使用できます。

--cover-package=.

または環境変数を設定する

NOSE_COVER_PACKAGE=.

鼻でテスト1.1.2

于 2011-10-07T18:58:42.803 に答える
4

トップレベルのPythonファイル/パッケージがたくさんあり、-cover-packageを使用してそれらすべてを手動で一覧表示するのは面倒なので、自分用に2つのエイリアスを作成しました。Aliasnosetests_coverは、-cover-packageにリストされているすべてのトップレベルのPythonファイル/パッケージでカバレッジを実行します。Aliasnosetests_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が正しくないことを通知する代わりに、オプションをまったく指定しなかったように動作します)。
  • 私は現在、Ubuntu13.10でPython2.7.6を使用しており、noseバージョン1.3.0とcoverageバージョン3.7.1を使用しています。これは、私がこれらのコマンドをテストした唯一のセットアップです。
  • 使用法で、必要に応じて--cover-eraseと--cover-inclusiveを削除します。
  • 逆順ではなく通常の順序で並べ替える場合は、sortコマンドで-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ください。

これが誰かに役立つことを願っています!=)

于 2014-03-26T22:44:04.397 に答える
3

Coverage:py 3.0を使用する場合、Pythonディレクトリ内のコードは、標準ライブラリとインストールされているすべてのパッケージを含め、デフォルトで無視されます。

于 2009-05-12T23:10:06.953 に答える
2

私はこれを行います:

nosetests --with-coverage --cover-package=foo,bar tests/*

私はこの解決策を他の提案よりも好みます。シンプルですが、どのパッケージをカバーしたいかを明確に示しています。ナディアの答えはもっと冗長なタイピングを含みます、スチュアートの答えはsedを使用し、それでもを呼び出すことによってパッケージを作成しますtouch __init__.py、そして 私にとってはうまくいき--cover-package=.ません。

于 2013-04-19T09:54:24.143 に答える
2

setup.cfgを使用してこれを実行しようとすると、次のように機能します。複数のパッケージを指定する方法を理解するのに苦労しました。

[nosetests]
with-coverage=1
cover-html=1
cover-package=module1,module2
于 2015-09-03T13:47:08.890 に答える
1
touch __init__.py; nosetests --with-coverage --cover-package=`pwd | sed 's@.*/@@g'`
于 2011-06-08T01:11:45.677 に答える
0

あなたはそのように受け入れられた答えを改善することができます--cover-package=foo,bar

于 2016-06-03T17:46:00.113 に答える