cgl*_*cet 9 pytest python-asyncio curio python-trio pytest-asyncio
我想使用 asyncio (/curio/trio) 和 pytest 同时运行多个测试,但我找不到任何相关信息。我需要自己安排吗?如果我这样做,有没有办法有一个很好的输出来分离(子)测试用例?
这是我正在尝试的一个小玩具示例:
import pytest
import time
import asyncio
pytestmark = pytest.mark.asyncio
expected_duration = 1
accepted_error = 0.1
async def test_sleep():
start = time.time()
time.sleep(expected_duration)
duration = time.time() - start
assert abs(duration-expected_duration) < accepted_error
async def test_async_sleep():
start = time.time()
await asyncio.sleep(expected_duration)
duration = time.time() - start
assert abs(duration-expected_duration) < accepted_error
Run Code Online (Sandbox Code Playgroud)
不幸的是,pytest内部的工作方式,你不能真正相同的呼叫下运行在同一时间多个测试trio.run/ asyncio.run/ curio.run。(这在某些方面也很好 - 它可以防止状态在测试之间泄漏,并且至少使用 trio 可以让您为不同的测试配置不同的 trio,例如设置一个测试使用自动跳转时钟而另一个测试不使用。)
绝对最简单的选择是使用 pytest-xdist 在单独的线程中运行测试。你仍然可以在每个测试内部使用异步——所有这些异步库都支持在不同线程中运行不同的循环。
如果您确实需要使用异步并发,那么我认为您必须编写一个 pytest 测试函数,然后在该函数中执行您自己的调度和并发。如果您这样做,那么从 pytest 的角度来看,只有一个测试,因此获得良好的每个测试输出并不容易。我想您可以尝试使用pytest-subtests吗?
现在有https://github.com/willemt/pytest-asyncio-cooperative。
\n\n今天2020-03-25,限制非常严重\xe2\x80\x94,你必须确保你的测试不共享anything(好吧,从技术上讲,不共享可变状态)并且你不能使用mock.patch(从技术上讲,不共享)模拟其他测试可能使用的任何内容)。
您可以关注https://github.com/pytest-dev/pytest-asyncio/issues/69上的讨论,我认为这很难,但可以想出一种标记每个固定装置以允许或禁止并发使用的方法,并安排测试以保留这些限制。
\n| 归档时间: |
|
| 查看次数: |
1408 次 |
| 最近记录: |