Я в процессе написания приложения с графическим интерфейсом малого/среднего размера с PyGObject (новые привязки на основе интроспекции для Gtk). Я начал с разумного набора тестов на основе nose
, который смог проверить большинство функций моего приложения, просто импортировав модули и вызвав различные функции и проверив результаты.Есть ли способ модульного тестирования кода Gtk/GLib, написанного на Python?
Однако в последнее время я начал использовать некоторые функции Gtk, такие как GLib.timeout_add_seconds
, который является довольно простым механизмом обратного вызова, который просто вызывает указанный обратный вызов после истечения таймера. Проблема, с которой я, естественно, сталкиваюсь сейчас, заключается в том, что мой код кажется для работы, когда я использую приложение, но testuite плохо инкапсулирован, поэтому, когда один тест проверяет, что он начинается с чистого состояния, он обнаруживает, что его состояние полностью растоптано через обратный вызов, который был зарегистрирован другим тестом. В частности, тест успешно проверяет, что файлы не загружены, затем он загружает некоторые файлы, а затем проверяет, что файлы не были изменены с момента загрузки, и тест не удался!
Мне потребовалось некоторое время, чтобы выяснить, что происходит, но по существу один тест изменит некоторые файлы (которые инициируют таймер), а затем закроет их без сохранения, затем другой тест откроет неизмененные файлы и обнаружит, изменено, потому что обратный вызов изменил файлы после того, как таймер поднялся.
Я читал о встроенном Python reload()
для перезагрузки модулей в надежде, что я смогу его выгрузить и перезагрузить приложение, чтобы начать новый, но он просто не работает.
Я боюсь, что мне придётся прибегнуть к запуску приложения в качестве подпроцесса, поработать с ним, а затем завершить подпроцесс и перезапустить его, когда мне нужно гарантировать новое состояние. Есть ли там какие-либо тестовые рамки, которые упростили бы это, особенно для кода pygobject?
Я не думаю, что насмехаться - это то, что я ищу. У меня есть небольшой набор данных, который я использую для тестирования и замены его с помощью mocks, на самом деле не исправил бы проблему, с которой я столкнулся, а это то, что фактический код программы использует обратные вызовы с временной задержкой, которые плохо ведут себя в быстродействующей тестовой среде , Я * am *, используя функции setup/teardown funks, но я не смог написать успешный отрыв, который может фактически выгрузить программу из памяти, а затем перезагрузить ее в новом состоянии. Всегда есть затяжные обратные вызовы, которые мешают от одного теста к другому. – robru
Я думал насмехаться над обратными вызовами, но это может быть или не быть подходящим для ваших нужд. – Sardathrion
То, что я сейчас делаю, это просто ручное вызов обратного вызова из теста, а затем немного более агрессивным в том, чтобы очищать обратные вызовы с помощью «GLib.source_remove» и, похоже, работает. Спасибо хоть. – robru