有一个不稳定的测试,我们不知道根本原因可能是什么。
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)
覆盖率报告;
标有 >>>>>> 的行未执行,即未跟踪,带冒号的数字是执行计数。
>>>>>> 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/