В настоящее время я достаточно глуп, чтобы попытаться сохранить две параллельные базы кода для настольного приложения Python, одно с использованием самоанализа PyGObject для GTK 3, а другое с использованием PyGTK для GTK 2. Я работаю в основном в ветке PyGObject и затем переношу изменения к филиалу PyGTK. Из-за всех незначительных различий между этими реализациями я часто пропускаю вещи и вызываю пропадание, которое пропускаю и случайно освобождаю, только чтобы его поймали пользователи.
Я пытаюсь найти хороший способ спроектировать несколько юнит-тестов, которые, предпочтительно, подходят для обеих баз кода. Это не слишком сложная программа (по сути, это инструмент управления библиотекой, представьте, как iTunes):
- Main Window
|- Toolbar with some buttons (add/edit/remove items, configure the program)
|
|- VPaned
|--- Top HPaned
|------ ListView (listing values by which a library of items can be filtered)
|------ ListView (listing the contents of the library
|--- Bottom HPaned
|------ Image (displaying cover art for the currently selected item in the library)
|------ TextView (displaying formatted text describing the currently selected item)
- Edit dialog
- Configuration dialog
- About dialog
Я пытался максимально отделить виды от моделей. Каждый из этих элементов реализован в своем собственном классе (ну, в классах, которые наследуются от перечисленных классов GTK). ListViews связаны с другими классами, которые наследуются от ListStores. Сама библиотека обрабатывается другим классом. Тем не менее, есть взаимодействия между виджетами, которые необходимо протестировать. Например, если пользователь выбирает конкретный элемент в представлении фильтра, фильтрует библиотеку, а затем выбирает элемент из отфильтрованных результатов, в текстовом представлении должна отображаться информация для правильной записи библиотеки, которая является полусложной из-за перевода разрывы между TreeModelFilter и оригинальным ListStore и т. д. и т. д.
Итак, я спрашиваю, каков рекомендуемый способ написания надежных модульных тестов для такого приложения с графическим интерфейсом? Я видел, что для этого есть несколько библиотек, но основные для pygtk не обновлялись годами, поэтому они почти наверняка потерпят неудачу с самоанализом PyGObject. Возможно, я недостаточно изобретателен, чтобы найти хороший способ сделать это с помощью модуля Python unittest
, поэтому я открыт для предложений.