Python 使用试用版在ResizebleDispatchQueue中测试失败的作业

Python 使用试用版在ResizebleDispatchQueue中测试失败的作业,python,twisted,Python,Twisted,Am在使用txrdq的项目中,Am测试(使用试用版)对于排队作业可能失败的情况,每当遇到错误时,试用版会将测试用例标记为失败 errback是一种正常行为,因为排队作业可能无法启动,如何使用试用版测试此案例而不失败 下面是测试用例的一个示例: from twisted.trial.unittest import TestCase from txrdq.rdq import ResizableDispatchQueue from twisted.python.failure import Fail

Am在使用txrdq的项目中,Am测试(使用试用版)对于排队作业可能失败的情况,每当遇到错误时,试用版会将测试用例标记为失败

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)

似乎正在记录异常,因为错误处理程序只是引发异常。我不确定txrdq中的错误处理代码是什么样子的,所以这只是一个猜测,但我认为根据您的观察,这是一个非常好的猜测

任何记录异常的单元测试都会失败,除非测试在记录异常后清除该异常。使用
TestCase.flushLoggedErrors(exceptionType)
处理此问题:

def test_txrdq(self):
    self.queue.put("Some argument", 1)
    self.assertEqual(1, len(self.flushLoggedErrors(SomeException)))
还请注意,您永远不应该执行
失败(“字符串”)
。这类似于
提升“字符串”
。在Python中,字符串异常早就被弃用了。始终使用异常实例构造一个
故障

class JobError(Exception):
    pass

def aFailingJob(self, a):
    return Failure(JobError("This is a failure"))
这使得
JobError
成为传递给
flushLoggedErrors
的异常类型

确保您了解队列处理是同步的还是异步的。如果是同步的,您的测试(添加了
FlushLoggeDerror
调用)就可以了。如果是异步的,则在测试方法返回时,错误处理程序可能尚未运行。在这种情况下,您将不会测试任何有用的东西,并且错误可能会在刷新它们的调用之后被记录(使刷新无效)


最后,如果您没有为txrdq编写单元测试,那么您可能不想编写这样的测试。您可能可以使用代码对txrdq进行单元测试,而不使用实际的txrdq。一个普通的队列对象(或者另一个更专门的测试对象)可以让您更精确地定位应用程序中的单元,从而使您的测试更快、更可靠、更易于调试。

很抱歉,您仍然有问题。我不知道这里发生了什么,但我已经玩了一个多小时试图

方法返回一个延迟的队列。您可以将errback附加到它以执行@exarkun所描述的刷新,然后从测试中返回延迟。我希望这能解决问题(已经阅读了@exarkun的回复,并从@idnar in#twisted收到了评论)。但这没用

下面是IRC最近的一段对话,提到我认为可能发生的事情:

就我所见,txRDQ做的事情是正确的。作业失败,并且queue.put返回的延迟时间错误

如果在运行测试后查看_trial_temp/test.log,您会看到什么?我在延迟中看到一个错误,上面写着
未处理的错误
,该错误是作业失败。所以在我看来,这个错误可能在txRDQ的某个地方。有一个延迟的失败,它将失败传递给任何需要它的人,但也返回失败-导致审判投诉。但我不知道那在哪里。出于好奇,我在Deferred类的init中添加了一个打印项,以查看在测试运行期间发生了多少延迟。答案是:12

很抱歉没有更好的消息。如果您想继续,请查看txRDQ代码产生的每个延迟。其中一个失败时是否返回错误?我看不出来,我在所有地方都放了打印声明,以检查事情是否正确。我想我一定错过了什么

谢谢,也谢谢@exarkun。

这个问题现在(终于!)由L.Daniel Burr解决了。PyPI上有一个txRDQ的新版本(0.2.14)

顺便说一下,在测试中,您应该从txrdq.job import job添加
,然后执行以下操作:

d = self.queue.put("Some argument", 1)
return self.assertFailure(d, Job)
试用将确保
d
作业
实例一起失败。
txrdq/test/test_rdq.py
的底部有两个新的测试说明了这种断言


很抱歉,这个问题给您带来了如此多的麻烦-这完全是我的错。

嗨,Jean Peal,通过返回一个失败(JobError(“这是一个失败”))然后返回self.assertEqual(1,len(self.FlushLoggeDerror(JobError)),在测试用例中,我仍然得到相同的错误,并且断言失败,因为FlushLoggeDerror调用返回了0,这可能是一种异步行为,我可以在错误发生之前清除错误,因此我向put方法添加了一个errback,如下所示:self.queue.put(…,1).adderback(self.err)和在err()中我清除错误,现在我可以看到错误发生在调用errback之前,但我仍然得到相同的行为,并且清除调用仍然返回0