【发布时间】:2011-11-04 15:05:24
【问题描述】:
我目前愚蠢到试图为 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 等之间的迭代。
那么,我问,为这样的 GUI 应用程序编写健壮的单元测试的推荐方法是什么?我已经看到有一些用于此的库,但 pygtk 的主要库多年来没有更新,因此它们几乎肯定会因 PyGObject 内省而失败。也许我没有足够的创造力来找出使用 Python 的 unittest 模块的好方法,所以我愿意接受建议。
【问题讨论】:
-
在有人问之前:pygtk 不支持 GTK 3,但我发现对 GTK 2 的 pygobject 自省的支持太不完整,无法依赖。
-
对我来说,在使用 GUI 时避免回归的最佳方法是进行手动测试。 Unittest 非常适合测试工作功能(以 MVC 为例),但我不知道如何处理 gui...
-
这是我一直在做的,但我显然不是很擅长,因为每次发布我都会错过一些东西。
-
你应该把它作为答案。我没遇到过这种方法。我想我可以使用这种方法拼凑一些复杂的测试脚本。
标签: python unit-testing user-interface pygtk pygobject