在使用txrdq的项目中,正在测试(使用试用版)排队作业可能失败的情况,试验将测试用例标记为在错误发生故障时失败。
errback是一种正常行为,因为排队的作业可能无法启动,如何使用试验测试此案例而不会使测试失败?
这是测试用例的一个例子:
from twisted.trial.unittest import TestCase
from txrdq.rdq import ResizableDispatchQueue
from twisted.python.failure import Failure
class myTestCase(TestCase):
def aFailingJob(self, a):
return Failure("This is a failure")
def setUp(self):
self.queue = ResizableDispatchQueue(self.aFailingJob, 1)
def tearDown(self):
pass
def test_txrdq(self):
self.queue.put("Some argument", 1)
答案 0 :(得分:1)
似乎可能会记录异常,因为错误处理程序只会引发异常。我不完全确定txrdq中的错误处理代码是什么样的,所以这只是一个猜测,但我认为这是一个非常好的基于你的观察。
试验无法记录异常的任何单元测试,除非测试在记录之后清除该异常。使用TestCase.flushLoggedErrors(exceptionType)
来解决此问题:
def test_txrdq(self):
self.queue.put("Some argument", 1)
self.assertEqual(1, len(self.flushLoggedErrors(SomeException)))
另请注意,您永远不应该Failure("string")
。这类似于raise "string"
。从很久以前开始,Python中不推荐使用字符串异常。始终使用异常实例构建Failure
:
class JobError(Exception):
pass
def aFailingJob(self, a):
return Failure(JobError("This is a failure"))
这会使JobError
成为您传递给flushLoggedErrors
的例外类型。
确保您了解队列处理是同步还是异步。如果它是同步的,那么您的测试(添加了flushLoggedErrors
调用)就可以了。如果它是异步的,则在测试方法返回时,您的错误处理程序可能没有运行。在这种情况下,你不会测试任何有用的东西,并且在调用它们之后可能会记录错误(使得flush无用)。
最后,如果您没有为'''txrdq编写单元测试''',那么您可能不想编写这样的测试。您可以在不使用实际txrdq的情况下对txrdq使用代码进行单元测试。一个普通的Queue对象(或者可能是另一个更专业的测试对象)可以让你更精确地定位应用程序中的单元,使你的测试更快,更可靠,更容易调试。
答案 1 :(得分:1)
这个问题现在(终于!)由L. Daniel Burr解决了。在PyPI上有一个新版本(0.2.14)的txRDQ。
顺便说一句,在测试中你应该添加from txrdq.job import Job
,然后执行以下操作:
d = self.queue.put("Some argument", 1)
return self.assertFailure(d, Job)
试用将确保d
失败并显示Job
个实例。 txrdq/test/test_rdq.py
底部有几个新的测试说明了这种断言。
对不起,这个问题给你带来了太大的麻烦 - 这完全是我的错。
答案 2 :(得分:0)
很抱歉看到你还有问题。我不知道这里发生了什么,但我一直在玩它超过一个小时试图......
queue.put方法返回Deferred。你可以附加一个errback来执行刷新,如@exarkun所描述的那样,然后从测试中返回Deferred。我希望能解决问题(阅读@ exarkun的回复,并在#twisted中收到@idnar的评论)。但它没有帮助。
以下是最近的IRC对话,提到我认为可以发生的事情:https://gist.github.com/2177560
据我所知,txRDQ正在做正确的事情。作业失败,queue.put返回的延迟是错误的。
如果你在运行测试后查看_trial_temp / test.log,你看到了什么?我看到一个错误,显示Unhandled error in Deferred
,错误是其中包含作业失败。所以我觉得这个错误在txRDQ的某个地方。有一个延迟失败了,它将失败传递给任何需要它的人,但也返回失败 - 导致审判抱怨。但我不知道那是哪里。我只是出于好奇而在Deferred类的 init 中打印了一个打印件,看看在运行测试期间有多少延迟。答案:12!
抱歉没有更好的消息。如果你想按下,请查看txRDQ代码所做的每个延迟。其中一个失败的是错误返回失败吗?我没有看到它,并且我已经在所有地方放置了打印声明以检查事情是否正确。我想我一定错过了什么。
谢谢,也谢谢@exarkun。