我正在使用 Travis CI 在持续集成上运行 Ned Batchelder 的覆盖率模块,但我只想运行集成测试并跳过功能性测试,因为它们花费的时间太长并且覆盖率测量不受它们的影响。
我为此创建了一个特殊的配置,但我想知道在 Python 脚本中是否有另一种方法可以知道代码是否由覆盖运行。
我正在使用 Travis CI 在持续集成上运行 Ned Batchelder 的覆盖率模块,但我只想运行集成测试并跳过功能性测试,因为它们花费的时间太长并且覆盖率测量不受它们的影响。
我为此创建了一个特殊的配置,但我想知道在 Python 脚本中是否有另一种方法可以知道代码是否由覆盖运行。
鼻子绝对可以帮助它:
@attr("no-coverage")
运行覆盖测试-a '!no-coverage'
--exclude-dir
您可以使用和--exclude-dir-file
选项从运行中排除特定的测试目录和测试文件希望有帮助。
根据您问题的措辞,我假设您没有限制您正在运行的覆盖范围内的测试,并且希望功能测试注意到它们正在覆盖范围内运行,并且什么也不做。一个 hacky 方法可能是在功能测试中查看 sys.argv,如果您检测到覆盖使用情况,则以不同的方式做事。但我认为更好的方法是在单独的同级目录中进行功能测试和单元测试,并告诉覆盖只运行单元测试目录中的测试。您可能还可以使用 --omit 选项来限制正在运行的测试。
我需要确定我的测试是在普通调试模式下运行、覆盖还是正常运行。经过大量的实验,我想出了这个:
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():
...
Coverage.py 设置一个环境变量,
COVERAGE_RUN
以指示您的代码在覆盖率测量下运行。
重要提示:此选项仅在覆盖模块的 6.1 及更高版本中可用。
如果detectcoverage.py
包含:
import os
def detect_coverage():
return os.environ.get('COVERAGE_RUN', None) is not None
if detect_coverage():
print("running in coverage mode")
else:
print("not running in coverage mode")
然后运行看起来像:
$ coverage run detectcoverage.py
running in coverage mode
$ python detectcoverage.py
not running in coverage mode