Есть ли способ модульного тестирования кода Gtk/GLib, написанного на Python?

Я нахожусь в процессе написания приложения с графическим интерфейсом малого/среднего размера с PyGObject (новые привязки на основе самоанализа для Gtk). Я начал с разумного набора тестов, основанного на носе, который смог протестировать большинство функций моего приложения, просто импортировав модули и вызвав различные функции и проверив результаты.

Тем не менее, недавно я начал пользоваться некоторыми функциями Gtk, такими как GLib.timeout_add_seconds, который представляет собой довольно простой механизм обратного вызова, который просто вызывает указанный обратный вызов после истечения таймера. Проблема, с которой я, естественно, сталкиваюсь сейчас, заключается в том, что мой код кажетсяработающим, когда я использую приложение, но набор тестов плохо инкапсулирован, поэтому, когда один тест проверяет, что он начинается с чистого состояния, он обнаруживает, что это состояние был истоптан обратным вызовом, который был зарегистрирован другим тестом.В частности, тест успешно проверяет, что файлы не загружены, затем загружает некоторые файлы, затем проверяет, что файлы не были изменены с момента загрузки, и тест завершается неудачно!

Мне потребовалось некоторое время, чтобы понять, что происходит, но, по сути, один тест изменяет некоторые файлы (что запускает таймер), затем закрывает их без сохранения, затем другой тест снова открывает неизмененные файлы и обнаруживает, что они изменен, потому что обратный вызов изменил файлы после того, как таймер истек.

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

Я боюсь, что мне, возможно, придется прибегнуть к запуску приложения как подпроцесса, возиться с ним, затем завершать подпроцесс и перезапускать его, когда мне нужно гарантировать свежее состояние. Существуют ли какие-либо тестовые фреймворки, которые упростили бы это, особенно для кода pygobject?

6
задан robru 11 June 2012 в 08:08
поделиться