4

我正在使用 Travis CI 在持续集成上运行 Ned Batchelder 的覆盖率模块,但我只想运行集成测试并跳过功能性测试,因为它们花费的时间太长并且覆盖率测量不受它们的影响。

我为此创建了一个特殊的配置,但我想知道在 Python 脚本中是否有另一种方法可以知道代码是否由覆盖运行。

4

6 回答 6

2

鼻子绝对可以帮助它:

  • Cover:代码覆盖插件
  • 属性选择器插件
    • 您可以使用装饰器标记测试并使用选项@attr("no-coverage")运行覆盖测试-a '!no-coverage'
  • 鼻子排除插件
    • --exclude-dir您可以使用和--exclude-dir-file选项从运行中排除特定的测试目录和测试文件

希望有帮助。

于 2013-09-09T22:24:06.610 回答
1

根据您问题的措辞,我假设您没有限制您正在运行的覆盖范围内的测试,并且希望功能测试注意到它们正在覆盖范围内运行,并且什么也不做。一个 hacky 方法可能是在功能测试中查看 sys.argv,如果您检测到覆盖使用情况,则以不同的方式做事。但我认为更好的方法是在单独的同级目录中进行功能测试和单元测试,并告诉覆盖只运行单元测试目录中的测试。您可能还可以使用 --omit 选项来限制正在运行的测试。

于 2013-09-09T22:34:19.240 回答
1

Travis CI 提供了几个可用于此的环境变量;就我而言,其中任何一项都可以:

CI=true
TRAVIS=true

即使之前提供的两个答案都非常有用,我认为这个解决方案更容易满足我的需要。

于 2013-10-29T12:56:42.817 回答
0

我需要确定我的测试是在普通调试模式下运行、覆盖还是正常运行。经过大量的实验,我想出了这个:

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')

不确定它有多强大,但它对我有用。

于 2021-10-11T19:07:00.120 回答
0

这是检查测试是否在覆盖模式下运行的实现。这样做的好处是您可以使用它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():
    ...
于 2021-11-02T15:22:22.130 回答
0

coverage.py 文档

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
于 2021-11-16T19:08:39.790 回答