Events 如何对事件循环进行单元测试?

Events 如何对事件循环进行单元测试?,events,http,loops,proxy,tdd,Events,Http,Loops,Proxy,Tdd,我正在用Python编写HTTP代理(用于请求/响应监视的透明代理)。但是作为一个TDD采纳者,我将使用TCP服务器应该捕获的HTTP输入启动该项目。但是,与任何服务器一样,它必须在事件循环中运行,以便能够在特定端口中侦听 由于启动事件循环将使解释器保持在循环中,因此在从单元测试启动服务器之后,我无法返回测试向该服务器发送HTTP请求 你们建议我设计什么,这样我就可以运行服务器并返回单元测试来测试它?使用线程?零超时 谢谢 Diogo单元测试更多的是在功能级别进行测试,集成测试更多的是“端到端”

我正在用Python编写HTTP代理(用于请求/响应监视的透明代理)。但是作为一个TDD采纳者,我将使用TCP服务器应该捕获的HTTP输入启动该项目。但是,与任何服务器一样,它必须在事件循环中运行,以便能够在特定端口中侦听

由于启动事件循环将使解释器保持在循环中,因此在从单元测试启动服务器之后,我无法返回测试向该服务器发送HTTP请求

你们建议我设计什么,这样我就可以运行服务器并返回单元测试来测试它?使用线程?零超时

谢谢


Diogo

单元测试更多的是在功能级别进行测试,集成测试更多的是“端到端”类型的测试。如果您的函数具有无法真正绕过的依赖项,那么现在正是为您的平台找到模拟框架的好时机。

您需要重构您的循环所侦听的任何内容,以便可以用伪或模拟替换它。如果该对象不是从接口派生的,那么您可能必须编写一个包装器对象,以便伪造或模拟


关于循环问题:多线程确实是一个可能的解决方案

最自然的方法:使用与服务器相同的事件处理框架编写测试客户端(与编写任何其他客户端/服务器代码没有区别)

然后,每个单元测试大致如下所示:

  • 注册测试服务器的套接字侦听器
  • 注册测试客户端的套接字连接器
  • 启动事件循环,等待交互完成(或超时)
  • 处理/报告测试结果

  • 在大多数情况下,测试客户机负责确定测试何时完成并向事件循环发出退出信号,但这可能取决于测试。您可能还希望编写标准化的超时处理程序以使测试失败(与阻塞I/O相同)。

    TDD不应涵盖循环本身。您可以测试大部分其他内容,并且,考虑到循环中的代码是正确隔离的,您可以对自己的代码充满信心

    也就是说,如果您的循环简化为

    while keep_serving:
        keep_serving = handle_events(...)
    
    您可以测试handle_事件及其组件,而循环本身很简单


    此外,您还必须测试连接、插座等。我推荐Gustavo Niemeyer的优秀模块。这非常方便(如果一眼就能完全理解的话)。

    谢谢,Matt,但我的实际问题是从单元测试启动服务器的最佳方式是非阻塞事件循环还是多线程。我正在考虑使用多线程,这似乎是最好的解决方案,事实上。。。也许会模仿socket模块,就像你说的,因为它是我想要测试的对象的邻居。谢谢,但是,正如我告诉Matt的,我的问题是关于避免服务器阻塞整个解释器的最佳选择,这样我就可以回到单元测试来测试服务器。服务器不会阻塞解释器,事件循环可以:如果您将测试客户机移动到事件循环中,这就不再是问题了。你可以看看TwistedPython对这类东西广泛应用的测试;我没有想到不启动循环,而是模拟传递给处理程序的请求/响应。这似乎是一个比实际启动服务器并让解释器卡在那里容易得多的解决方案。我也会考虑尝试Mocker,因为我只使用McCito直到现在。谢谢