在常规单元测试中运行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_setup 和 twisted_teardown)在超时时间内没有完成,测试将失败。超时默认为两分钟。超时时间为零将禁用超时。
要指定不同的超时时间,将其(以秒为单位)传递给装饰器
@with_reactor(timeout=10)
def test_quick():
...
它是如何工作的
我不详细介绍细节,但 utwist 在第一个测试启动时在单独的线程中启动反应器,并让它一直运行到结束(反应器不能重新启动)。它使用 blockingCallFromThread() 在反应器内部运行测试方法。除此之外,还有一些技巧来检查反应器是否干净,如果不干净,则清理它。还有一个非常不干净的黑客技巧,即使反应器不在主线程中运行,也能使信号工作。
错误报告和其他贡献
此项目托管于此 utwist GitHub 页面。
替代方案
如果您不介意为测试使用 unittest 的简略版本,也不介意使用特殊运行程序运行测试,那么我强烈推荐 trial。它是 twisted 提供的官方单元测试工具。
项目详情
utwist-0.1.3.zip 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | b9d0aaca46f586421cf2fc1f924bd6d82a7607be6df3f0facdd4c67da6e784f5 |
|
MD5 | 5051040a48b47db3af1d91142ca00cda |
|
BLAKE2b-256 | 89795659163b2fd87cd28bde599bdf508792718017e29df9b77b76cda185afa3 |