首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在pytest中为异步代码编写补丁

如何在pytest中为异步代码编写补丁
EN

Stack Overflow用户
提问于 2018-01-16 17:32:41
回答 1查看 458关注 0票数 3

我想把异步和pytest结合起来。

以下是我想做的事:

  • 在测试运行时运行服务器--在服务器完成时停止运行。
  • 在一个完美的世界中,我将服务器实现为一个固定的(使用产量)

我喜欢这样编写测试代码:

代码语言:javascript
复制
def test_add(svr_fixture):
    await asyncio.sleep(100)
    assert m.add(1, 2) == 3   # I like the readability of this and want to restore it

我试图用pytest-asyncio (https://pypi.python.org/pypi/pytest-asyncio)编写这个夹具,但是我想不出如何做到这一点。

我想出的这个测试(虽然有效,但看起来很笨拙,掩盖了测试的意图):

代码语言:javascript
复制
def test_add():
    async def do_it():
        await asyncio.sleep(100)
        return m.add(1, 2)

    loop = asyncio.get_event_loop()
    coro = loop.create_server(server.ServerProtocol, '127.0.0.1', 8023)
    asyncio.async(coro)
    res = loop.run_until_complete(do_it())
    assert res == 3

任何关于如何将服务器代码解压缩到固定设备中的帮助,如指向文档或示例的链接,都将不胜感激。

我不认为完整的服务器代码是必要的(但它在这里:https://stackoverflow.com/a/48277838/570293)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-22 09:09:41

正如我在我的问题中指出的,我不希望异步的东西膨胀我的测试案例。到目前为止,我能找到的唯一简单的工作解决方案是使用多处理。我知道process.terminate()不是结束异步循环的“最佳方式”,但至少它是可靠的。

代码语言:javascript
复制
# -*- coding: utf-8 -*-
import time
from multiprocessing import Process

import pytest
from my_server import server


@pytest.fixture
def fake_server():
    p = Process(target=server.run, args=())
    p.start()

    yield
    p.terminate()


def test_add2(fake_server):
    time.sleep(30)
    assert m.add(1, 2) == 3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48286838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档