tearDown не вызывается после истечения времени ожидания в витой пробе?
Я вижу проблему в моем тестовом наборе, когда все работает нормально, пока не истечет время ожидания. Если тест завершается неудачно из-за тайм-аута, функция tearDown никогда не вызывается, оставляя реактор нечистым, что, в свою очередь, приводит к сбою остальных тестов. Я считаю, что tearDown следует вызывать после истечения времени ожидания. Кто-нибудь знает, почему это может произойти?
3 ответа
Это довольно странно, потому что на моей коробке разборка выполняется, даже если происходит тайм-аут. Испытания должны прекратиться, если реактор не находится в чистом состоянии, если вы не используете --unclean-warnings
флаг. Останавливается ли выполнение теста после истечения времени ожидания? Какую версию Python и Twisted вы используете?
В качестве дополнительного примечания: если вам нужно запустить уникальный анализ для конкретной тестовой функции, есть очень удобный addCleanup()
Перезвоните. Это удобно, если вам нужно отменить функции обратного вызова, LoopingCall или callLater, чтобы реактор не находился в грязном состоянии. addCleanup
возвращает Deferred
так что вы можете просто цеплять обратные вызовы, которые выполняют разборку adhoc. Это может быть хорошим вариантом, если у вас не работает разрыв класса.
PS
Я так привык писать "хорошо ведущий себя" код Twisted, я даже не помню, как попасть в нечистое состояние реактора: клянусь, я не хвастаюсь. Не могли бы вы дать мне краткое резюме того, что вы делаете, чтобы я мог проверить это на моем конце?
Вы правы в том, что tearDown()
следует вызывать независимо от того, что происходит в вашем тесте. Из документации для tearDown()
:
Это вызывается, даже если тестовый метод вызвал исключение
Однако здесь есть одна загвоздка. Из той же документации:
Этот метод будет вызываться только в случае успешного выполнения setUp(), независимо от результата метода теста.
Похоже, вы, возможно, запустите реактор в setUp()
и когда он истекает, это мешает вашему tearDown()
от бега - идея в том, что все, что вы пытались "настроить" в setUp()
не был успешно настроен, поэтому вы не хотите пытаться снести его. Тем не менее, было бы трудно с уверенностью диагностировать, если вы не предоставите код вашего setUp
а также tearDown
методы, наряду с кодом любых соответствующих тестов.
Я нашел проблему, я помещу это здесь на случай, если это пригодится кому-то еще в будущем.
Я возвращал отложенный тест, который уже был вызван (как, например, вызывался deferred.callback), но он все еще имел незаконченную цепочку обратных вызовов. Из того, что я вижу в пробном коде здесь https://github.com/twisted/twisted/blob/twisted-16.5.0/src/twisted/trial/_asynctest.py, реактор аварийно завершается, когда это происходит, что объясняет, почему tearDown не вызывается. Решение для меня состояло в том, чтобы вернуть отложенный тест из тестирующих тестов, который не имеет цепочки обратных вызовов, которая живет в течение длительного времени (это обратные вызовы не возвращают сами отложенные вызовы).