跳转到主要内容

在常规单元测试中运行twisted的reactor,无需trial

项目描述

如果测试需要reactor运行,使用twisted进行单元测试有些困难。官方方法是使用twisted自己的单元测试框架,称为trial。它与unittest模块非常相似。如果您想使用另一个框架,或者喜欢好的IDE集成,那么utwist可能是正确的选择。

请注意,编写不执行I/O的单元测试被认为是良好的实践。但对于集成测试以及可能的一些单元测试,您将需要运行reactor。

免责声明: utwist相当是一个黑客手段。它有效,我定期在Linux,OSX和Windows上测试它,但twisted的将来版本可能会破坏它。您已经被警告了。希望twisted最终会提供一个更好的测试解决方案。

这个库是开源的,并在MIT许可证下发布。

您可以使用pip install utwist安装它。它不需要编译任何东西,所以不应该有任何惊喜。即使在Windows上也是如此。

让我们开始吧!

from utwist import with_reactor

@with_reactor
def test_connect_with_tcp():
  point = TCP4ClientEndpoint(reactor, "google.com", 80)
  d = point.connect(MyFactory())
  return d

如果使用nose运行,它将正好做您期望的事情。它打开网络连接。测试将失败,因为连接没有关闭。utwist会在测试结束时检查reactor是否干净。

当然,您不必使用nose。它与unittest以及可能的大多数其他框架一样有效。

延迟返回值

如果测试函数返回一个延迟,则测试将在延迟解决为值时成功,在延迟错误回退时失败。

设置和拆卸

如果在定义测试函数的同一类中有一个名为twisted_setup()的函数,则此函数将在测试之前被调用,但已经在reactor的上下文中。请注意,测试框架提供的常规设置函数也将被执行,但不在reactor上下文中。

因此,如果存在一个在测试函数之后执行的 twisted_teardown(),即使测试失败也会执行。

设置超时

如果测试(包括 twisted_setuptwisted_teardown)在超时时间内没有完成,测试将失败。超时默认为两分钟。超时时间为零将禁用超时。

要指定不同的超时时间,将其(以秒为单位)传递给装饰器

@with_reactor(timeout=10)
def test_quick():
  ...

它是如何工作的

我不详细介绍细节,但 utwist 在第一个测试启动时在单独的线程中启动反应器,并让它一直运行到结束(反应器不能重新启动)。它使用 blockingCallFromThread() 在反应器内部运行测试方法。除此之外,还有一些技巧来检查反应器是否干净,如果不干净,则清理它。还有一个非常不干净的黑客技巧,即使反应器不在主线程中运行,也能使信号工作。

错误报告和其他贡献

此项目托管于此 utwist GitHub 页面

替代方案

如果您不介意为测试使用 unittest 的简略版本,也不介意使用特殊运行程序运行测试,那么我强烈推荐 trial。它是 twisted 提供的官方单元测试工具。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解更多关于 安装软件包 的信息。

源分布

utwist-0.1.3.zip (15.8 kB 查看散列值)

上传时间

支持者