Travis CI を使用した継続的インテグレーションでNed Batchelder のカバレッジモジュールを実行していますが、統合テストのみを実行し、機能的なテストはスキップしたいと考えています。
このための特別な構成を作成しましたが、コードがカバレッジによって実行されているかどうかを Python スクリプト内で知る別の方法があるかどうかを知りたいです。
Travis CI を使用した継続的インテグレーションでNed Batchelder のカバレッジモジュールを実行していますが、統合テストのみを実行し、機能的なテストはスキップしたいと考えています。
このための特別な構成を作成しましたが、コードがカバレッジによって実行されているかどうかを Python スクリプト内で知る別の方法があるかどうかを知りたいです。
鼻は間違いなくそれを助けることができます:
@attr("no-coverage")
でカバレッジ テストを実行できます-a '!no-coverage'
--exclude-dir
オプションと--exclude-dir-file
オプションを使用して、特定のテストディレクトリとテストファイルを実行から除外できますそれが役立つことを願っています。
あなたの質問の言い回しに基づいて、カバレッジで実行しているテストを制限しておらず、機能テストがカバレッジで実行されていることに気づき、何もしないことを望んでいると思います。ハックな方法は、機能テストで sys.argv を見て、カバレッジの使用を検出した場合に別のことを行うことです。しかし、より良いアプローチは、機能テストと単体テストを別々の兄弟ディレクトリに配置し、単体テスト ディレクトリ内のテストのみを実行するようカバレッジに指示することだと思います。--omit オプションを使用して、実行するテストを制限することもできます。
Travis CI は、これに使用できるいくつかの環境変数を提供します。私の場合、これはどれも役立ちます:
CI=true
TRAVIS=true
以前に提供された両方の回答が本当に役に立ちましたが、このソリューションは必要なものに対して実装しやすいと思います。
テストがプレーン デバッグ モードで実行されているか、カバレッジ付きで実行されているか、または通常どおり実行されているかを判断する必要がありました。かなりの実験の後、私はこれを思いつきました:
import sys
# Detect PyCharm debugging mode
get_trace = getattr(sys, 'gettrace', lambda: None)
if get_trace() is None:
debug = False
print('runnin normsies')
else:
debug = True
print('debuggin')
if 'coverage' in sys.modules.keys():
print('covered')
それがどれほど堅牢かはわかりませんが、私にとってはうまくいきます。
テストがカバレッジ モードで実行されているかどうかのチェックの実装を次に示します。gettrace_result
これの良いところは、たとえば、テストがカバレッジではなくデバッガーによって実行されているかどうかなど、他の条件をチェックするために使用できることです。
import sys
def is_run_with_coverage():
"""Check whether test is run with coverage."""
gettrace = getattr(sys, "gettrace", None)
if gettrace is None:
return False
else:
gettrace_result = gettrace()
try:
from coverage.pytracer import PyTracer
from coverage.tracer import CTracer
if isinstance(gettrace_result, (CTracer, PyTracer)):
return True
except ImportError:
pass
return False
pytest.mark.skipifを使用して、カバレッジ モードで実行してはならないテストをスキップできます。
@pytest.mark.skipif(is_run_with_coverage())
def test_to_skip_in_coverage_mode():
...