我目前很愚蠢地尝试维护一个Python桌面应用程序的两个平行代码库,一个使用PyGObject introspection来支持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类)。ListView与其他继承自ListStore的类耦合。库本身由不同的类处理。然而,这些小部件之间存在需要测试的交互作用。例如,如果用户在过滤视图中选择特定项来过滤库,然后从过滤结果中选择一个项目,则文本视图必须显示正确库条目的信息,这有点复杂,因为需要在TreeModelFilter和原始ListStore之间进行迭代器转换等等。
因此,我想问一下,编写此类GUI应用程序的健壮单元测试的推荐方法是什么?我看到有一些库可以做到这一点,但主要针对pygtk的库已经多年没有更新了,所以它们几乎肯定会在PyGObject introspection中失败。也许我不够有创意,无法使用Python的unittest模块找到好的方法,因此我愿意听取建议。