Тестирование сбойной работы в ResizableDispatchQueue с пробной версией - PullRequest
0 голосов
/ 16 марта 2012

Я в проекте, использующем txrdq, я тестирую (использую пробную версию) случай, когда задание в очереди может потерпеть неудачу, пробная версия помечает тестовый случай как неудачный всякий раз, когда он сталкивается с ошибкой в ​​ошибке.

Ошибка - нормальное поведение, так как задание в очереди может не запуститься, как проверить этот случай, используя пробную версию, не провалив тест?

вот пример теста:

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 ]

1 голос
/ 26 января 2014

Эта проблема теперь (наконец-то!) Решена Л. Даниэлем Берром. В PyPI появилась новая версия (0.2.14) txRDQ.

Кстати, в своем тесте вы должны добавить from txrdq.job import Job, а затем сделать что-то вроде этого:

d = self.queue.put("Some argument", 1)
return self.assertFailure(d, Job)

Trial обеспечит сбой d с экземпляром Job. В нижней части txrdq/test/test_rdq.py есть пара новых тестов, иллюстрирующих такое утверждение.

Извините, эта проблема вызвала у вас столько царапин на голове - это была моя вина.

1 голос
/ 16 марта 2012

Кажется вероятным, что исключение регистрируется, так как обработчик ошибок просто вызывает его.Я не совсем уверен, как выглядит код обработки ошибок в 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) в порядке.Если он асинхронный, ваш обработчик ошибок может не запуститься к тому времени, когда ваш метод теста вернется.В этом случае вы не собираетесь тестировать что-либо полезное, и ошибки могут регистрироваться после вызова, чтобы сбросить их (делая сброс бесполезным).

Наконец, если вы не пишете модульные тесты'' 'для' '' txrdq, тогда вы можете не захотеть писать такие тесты.Вы можете, вероятно, выполнить модульное тестирование кода, использующего txrdq, без использования фактического txrdq.Обычный объект Queue (или, возможно, другой более специализированный двойной тест) позволит вам более точно нацеливать блоки в вашем приложении, делая ваши тесты быстрее, надежнее и проще для отладки.

0 голосов
/ 24 марта 2012

Извините, что у вас все еще проблема.Я не знаю, что здесь происходит, но я играл с ним более часа, пытаясь ...

Метод queue.put возвращает значение Deferred.Вы можете прикрепить к нему ошибку, чтобы выполнить сброс, как описывает @exarkun, и затем вернуть Deferred из теста.Я ожидал, что это все исправит (прочитав ответ @ exarkun и получив комментарий от @idnar в #twisted).Но это не помогает.

Вот небольшая часть недавнего разговора с IRC, где упоминается, что, я думаю, могло бы происходить: https://gist.github.com/2177560

Насколько я могувидите, txRDQ делает правильные вещи.Задание не выполняется, и отложенный результат, возвращаемый queue.put, возвращается с ошибкой.

Если после запуска теста вы загляните в _trial_temp / test.log, что вы увидите?Я вижу ошибку, которая говорит Unhandled error in Deferred, и это ошибка с заданием.Так что мне кажется вероятным, что ошибка где-то в txRDQ.То, что есть отсрочка, которая терпит неудачу, и она передает отказ просто прекрасно тому, кто нуждается в этом, но также возвращает отказ - заставляя суд жаловаться.Но я не знаю, где это.Я положил отпечаток в init класса Deferred просто из любопытства, чтобы посмотреть, сколько отсрочек было сделано во время выполнения теста.Ответ: 12!

Извините, что нет хороших новостей.Если вы хотите нажать на, посмотрите на все отсрочки, сделанные кодом txRDQ.Один из них терпит неудачу с ошибкой, которая возвращает ошибку?Я не вижу этого, и я поместил печатные заявления повсюду, чтобы проверить, что все правильно.Наверное, я что-то упускаю.

Спасибо, и спасибо тоже @ exarkun.

...