相关疑难解决方法(0)

如何在Python中限制函数调用的执行时间

在我的代码中有一个与套接字相关的函数调用,该函数来自另一个模块,因此无法控制,问题是它偶尔会阻塞几个小时,这是完全不可接受的,我如何限制代码中的函数执行时间?我想解决方案必须使用另一个线程.

python multithreading

64
推荐指数
8
解决办法
6万
查看次数

如何在 pytest 中设置每个测试超时的默认值?

我想强制执行在 pytest 中没有测试需要超过 3 秒。

pytest-timeout ( https://pypi.python.org/pypi/pytest-timeout ) 几乎可以做我想要的......但它似乎允许我设置全局超时(即确保测试套件少于10 分钟)或者,能够在每个测试中手动设置装饰器。

期望的行为: 使用单个设置配置 pytest 以使任何超过 3 秒的单个测试失败。

python pytest

8
推荐指数
2
解决办法
7407
查看次数

如何将测试标记为“长”并跳过它们?

tox我通常使用which 调用来运行测试pytest。这种设置在许多项目中都运行良好。然而,在某些项目中,我有一些需要很长时间(几分钟)的测试。我不想每次都运行它们。我想装饰测试一样长。

像这样的东西:

$ tox --skip-long
Run Code Online (Sandbox Code Playgroud)

和

$ tox --skip-long
Run Code Online (Sandbox Code Playgroud)

python pytest tox python-decorators

7
推荐指数
1
解决办法
2288
查看次数

是否可以使用 pytest 测试 while True 循环(我尝试超时)?

我有一个里面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)

更多信息

  1. 我考虑添加一个装饰器,例如@pytest.mark.timeout(5),但这不起作用并且它停止了整个功能,所以我永远不会到达asserts. (如建议here)。
  2. 如果我找不到方法,我只会测试零件,但理想情况下,我想找到一种通过打破循环来进行测试的方法。
  3. 我知道我可以重写我的代码以使其具有超时,但这意味着更改代码以使其可测试,我认为这不是一个好的设计。
    1. 模拟我没有尝试过(如这里建议的那样),因为我不相信我可以模拟我所做的,因为它从网络上写入信息。我需要真正看到“原始”工作。

python unit-testing infinite-loop pytest

5
推荐指数
1
解决办法
1731
查看次数

如何让 pytest 在测试中设置内存限制?

我正在使用 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)

这不会捕获函数中的内存分配。

memory pytest

4
推荐指数
1
解决办法
1051
查看次数