通过试用在Resizable DispatchQueue中测试失败的作业

时间:2012-03-15 21:55:20

标签: python twisted

在使用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)

3 个答案:

答案 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。