不经试验在常规机组试验中运行twisted反应堆
utwist的Python项目详细描述
如果测试需要反应堆,用twisted进行单元测试有点困难 去跑步。官方的方法是使用twisted自己的单元测试框架 试用版。它与unittest模块非常相似。如果你愿意 要使用另一个框架,或者如果您喜欢很好的ide集成,那么utwist 也许对你来说是对的。
注意,编写单元测试 不要执行IO。但是对于集成测试,可能还有一些单元测试, 你需要一个反应堆。
免责声明:utwist是一个相当棘手的问题。它可以工作,我定期在Linux上测试它, OSX和Windows,但未来的Twisted版本可能会破坏它。你已经 警告。希望twisted最终能提供更好的测试解决方案。
这个库是开源的,在mit许可下发布。
您可以使用pip install utwist安装它。它不需要 编译任何东西,所以不应该有任何意外。即使是在窗户上。
我们走吧!
fromutwistimportwith_reactor@with_reactordeftest_connect_with_tcp():point=TCP4ClientEndpoint(reactor,"google.com",80)d=point.connect(MyFactory())returnd
如果你用鼻子跑步,这完全符合你的期望。 它打开网络连接。测试将失败,因为 连接没有关闭。utwist检查反应堆 在测试结束时是干净的。
当然你不必用鼻子。它也同样有效 使用unittest,也可能使用大多数其他框架。
延迟返回值
如果测试函数返回延迟,则测试将 如果延迟解析为值或不成功,则成功 如果延迟的错误。
设置和拆卸
如果在同一个类中有一个名为twisted_setup()的函数 定义测试函数时,将调用此函数 在测试之前,但已经在反应堆的上下文中。注意 测试框架提供的常规设置功能将 也要执行,但不能在reactor上下文中执行。
因此,如果存在twisted\u teardown()则在 测试功能,即使测试失败。
设置超时
如果测试,包括Twisted设置和Twisted拆卸 超时内未完成,测试失败。超时默认值 到两分钟。超时持续时间为零将禁用超时。
要指定不同的超时,请将其(以秒为单位)传递给装饰器:
@with_reactor(timeout=10)deftest_quick():...
它是如何工作的
我不告诉你细节,但是当 第一个测试开始,并让它运行到结束(反应堆不能重新启动)。 它使用blockingCallFromThread()在反应堆内部运行测试方法。 除此之外,还有一些技巧可以检查反应堆是否干净,以及 如果不是的话。也有一个非常肮脏的黑客让信号工作,即使 反应器不在主线程中运行。
错误报告和其他贡献
此项目位于此处utwist github page。
备选方案
如果您不介意在测试中使用精简版的unittest,也不介意运行 然后我强烈推荐使用特殊跑步器进行测试。它是 twisted提供的官方单元测试工具。