python - 在 Python 中寻找片状测试的根本原因

标签 python unit-testing pytest trace

有一个不稳定的测试,我们不知道根本原因可能是什么。

with pytest.raises(foo.geocoder.GeocodingFailed):
    foo.geocoder.geocode('not a valid place')
有时异常不会发生。
我查看了文档 how to handle failures ,但这没有帮助。
如何追踪 geocode()这样如果异常没有发生,我就会看到痕迹?
我看了trace标准库模块。但是似乎没有简单的方法可以将跟踪作为字符串获取。
“跟踪”的意思是:跟踪在 gecode() 期间执行的所有行.我想查看带有缩进的方法调用和返回语句。我想忽略 Python 标准库中的行。
AFAIK 像 pdb 这样的调试器在这里没有帮助,因为测试仅在 CI 中运行时才会失败,并且每个月只有一次或两次。

最佳答案

trace模块通过 trace.Trace 提供编程访问类(class)。
在测试失败时 Trace类的控制台输出是可见的。
并且它有覆盖报告可以写在选定的路径上。
我排除sys.base_exec_prefix , sys.base_prefix不跟踪 Python 库模块。

import pytest


def f(x):
    import random

    choice = random.choice((True, False))

    if choice:
        raise ValueError
    else:
        return x * 2


def trace(f, *args, **kwargs):
    import trace
    import sys

    tracer = trace.Trace(
        ignoredirs=(sys.base_exec_prefix, sys.base_prefix), timing=True,
    )
    ret = tracer.runfunc(f, *args, **kwargs)
    r = tracer.results()
    r.write_results(coverdir="/tmp/xx-trace")
    return ret


def test_f():
    with pytest.raises(ValueError):
        trace(f, 3)
pytest run
覆盖率报告;
标有 >>>>>> 的行未执行,即未跟踪,带冒号的数字是执行计数。
>>>>>> import pytest
       
       
>>>>>> def f(x):
    1:     import random
       
    1:     choice = random.choice((True, False))
       
    1:     if choice:
>>>>>>         raise ValueError
           else:
    1:         return x * 2
       
       
>>>>>> def trace(f, *args, **kwargs):
>>>>>>     import trace
>>>>>>     import sys
       
>>>>>>     tracer = trace.Trace(
>>>>>>         ignoredirs=(sys.base_exec_prefix, sys.base_prefix), timing=True,
           )
>>>>>>     tracer.runfunc(f, *args, **kwargs)
>>>>>>     r = tracer.results()
>>>>>>     r.write_results(coverdir="/tmp/xx-trace")
       
       
>>>>>> def test_f():
>>>>>>     with pytest.raises(ValueError):
>>>>>>         trace(f, 3)

关于python - 在 Python 中寻找片状测试的根本原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68297617/

相关文章:

python - Pandas/Python - 按同一时间段对数据进行分组

python - 允许 help() 在部分函数对象上工作

python - 如何正确使用 cv2.DrawMarker 函数?

C# 单元测试 NSubstitute 无法在 ObjectCache 中设置值

python - 如何在测试 FastAPI 应用程序时触发生命周期启动和关闭?

python - 我可以拥有一个通用 fixture 并在测试中调用不同的值吗?

python - 在 pytest 装置中导入应用程序时出错

python - 如果满足条件,则更改值,数据框

遗留环境中的 PHPUnit

unit-testing - 您需要从测试工具中获得什么?