Python работает с glib mainloop в unittest

Я новичок в python и пытаюсь настроить функциональную среду тестирования. Тестовая среда должна принимать сигналы через DBus и оценивать их. Сигнализация DBus использует GLib MainLoop. У меня есть следующий класс, инкапсулирующий цикл:

class SignalLoop(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.__l = gobject.MainLoop()        
    def run(self):
        self.__l.run()
    def quit(self):
        self.__l.quit() 

и в модуле, выполняющем обработку DBus, я попытался:

class __ModuleInitializer:
    def __init__(self):
        print('Module was initialized')
        gobject.threads_init()
        sl = SignalLoop()
        sl.start()

    def __del__(self):
        print('Module was deinitialized')
        sl.quit()

__module_init = __ModuleInitializer()

Я также попробовал следующее:

  • setUp /tearDownModule () не работает для меня - по крайней мере, в Python 2.5.2
  • __ init __ () и __del __ () и помещают все тестовые сценарии в один класс. __Del __ () никогда не вызывается, и это решение не будет масштабироваться с большим количеством тестовых случаев.

Когда я запускаю код, sl.qui () никогда не выполняется, и я не знаю почему. Я должен убить мой основной при запуске из консоли, потому что он никогда не возвращается. Однако это не проблема для тестировщика PyDev.

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

Не могли бы вы мне помочь?

4 голоса | спросил Ivan Kostov 5 WedEurope/Moscow2012-12-05T21:20:21+04:00Europe/Moscow12bEurope/MoscowWed, 05 Dec 2012 21:20:21 +0400 2012, 21:20:21

3 ответа


0

Я бы не стал запускать и останавливать основной цикл во время настройки и удаления. Вместо этого сделайте асинхронный запрос (или любой другой), затем выполняйте итерацию основного цикла за итерацией, пока не получите ваш результат.

Пример:

make_asynchronous_request()
main_context = GLib.MainContext.default()
while main_context.pending():
    main_context.iteration(False)
assert(result_is_ok())
ответил ptomato 6 ThuEurope/Moscow2012-12-06T20:03:05+04:00Europe/Moscow12bEurope/MoscowThu, 06 Dec 2012 20:03:05 +0400 2012, 20:03:05
0

Я использовал ответ ptomato, чтобы создать тот, который работал на меня. Разница, вероятно, связана с какой-то версией Python. В моем случае работающий код:

make_asynchronous_request()
main_context = GLib.MainLoop.get_context()
while main_context.pending():
    main_context.iteration(False)
assert(result_is_ok())
ответил Marga Manterola 19 PMpFri, 19 Apr 2013 17:38:05 +040038Friday 2013, 17:38:05
0

Я думаю, вы должны определить класс SignalLoop как daemon тема. Это позволит программе закрыться, когда это будет сделано, даже если поток сигнальной петли все еще работает. Когда программа закрывается, объект __module_init будет собирать мусор, а его __del__ будет вызвана функция.

Документы на daemon http://docs.python.org/2.6/library/threading.html#threading.Thread.daemon

ответил hannanaha 5 WedEurope/Moscow2012-12-05T23:09:20+04:00Europe/Moscow12bEurope/MoscowWed, 05 Dec 2012 23:09:20 +0400 2012, 23:09:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132