在我的代码中有一个与套接字相关的函数调用,该函数来自另一个模块,因此无法控制,问题是它偶尔会阻塞几个小时,这是完全不可接受的,我如何限制代码中的函数执行时间?我想解决方案必须使用另一个线程.
我想强制执行在 pytest 中没有测试需要超过 3 秒。
pytest-timeout ( https://pypi.python.org/pypi/pytest-timeout ) 几乎可以做我想要的......但它似乎允许我设置全局超时(即确保测试套件少于10 分钟)或者,能够在每个测试中手动设置装饰器。
期望的行为: 使用单个设置配置 pytest 以使任何超过 3 秒的单个测试失败。
tox我通常使用which 调用来运行测试pytest。这种设置在许多项目中都运行良好。然而,在某些项目中,我有一些需要很长时间(几分钟)的测试。我不想每次都运行它们。我想装饰测试一样长。
像这样的东西:
$ tox --skip-long
Run Code Online (Sandbox Code Playgroud)
和
$ tox --skip-long
Run Code Online (Sandbox Code Playgroud) 我有一个里面foo有while True循环的 python 函数。
对于背景:预计会从网络上传输信息,进行一些写作并无限期地运行。断言测试写入是否正确完成。
显然我需要它在某个时候停止,以便进行测试。
我所做的是通过运行multirpocessing并在那里引入超时,但是当我看到测试覆盖率时,通过多处理运行的函数没有被标记为覆盖。
问题 1:为什么 pytest 现在以这种方式工作?
问题 2:我怎样才能做到这一点?
我在想这可能是因为我在技术上退出了循环,所以也许 pytest 没有将其标记为已测试....
import time
import multiprocessing
def test_a_while_loop():
# Start through multiprocessing in order to have a timeout.
p = multiprocessing.Process(
target=foo
name="Foo",
)
try:
p.start()
# my timeout
time.sleep(10)
p.terminate()
finally:
# Cleanup.
p.join()
# Asserts below
...
Run Code Online (Sandbox Code Playgroud)
更多信息
我正在使用 pytest,但我想要一个装饰器,可以设置每次测试的最大内存使用量。与回答的这个问题类似,
@pytest.mark.timeout(300)
def test_foo():
pass
Run Code Online (Sandbox Code Playgroud)
我想要,
@pytest.mark.maxmem(300)
def test_foo():
pass
Run Code Online (Sandbox Code Playgroud)
编辑:
我试过,
>>> import os, psutil
>>> import numpy as np
>>> process = psutil.Process(os.getpid())
>>> process.memory_info().rss/1e9
0.01978368
>>> def f():
... x = np.arange(int(1e9))
...
>>> process.memory_info().rss/1e9
0.01982464
>>> f()
>>> process.memory_info().rss/1e9
0.019832832
Run Code Online (Sandbox Code Playgroud)
这不会捕获函数中的内存分配。