单元测试Python Gui应用程序的推荐方法是什么?

2024-04-26 17:33:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前愚蠢到试图为Python桌面应用程序维护两个并行代码基,一个使用PyGObject introspection for GTK 3,另一个使用PyGTK for GTK 2。我主要在PyGObject分支上工作,然后将变更移植到PyGTK分支上。由于这些实现之间的所有细微差异,我经常忽略一些东西,并导致我错过并意外发布的破坏,结果被用户发现。在

我正试图找到一种好的方法来设计一些单元测试,这些单元测试最好能在两个代码基上运行。想象一下,它本质上不是一个复杂的程序库:

- 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继承的其他类耦合在一起。库本身由另一个类处理。尽管如此,小部件之间仍然存在需要测试的交互。例如,如果用户在filter视图中选择了一个特定的项目,过滤了库,然后从过滤的结果中选择了一个项目,那么文本视图必须显示正确的库条目的信息,由于在TreeModelFilter和原始ListStore之间转换iter等,这是半复杂的

所以,我问,为这样一个GUI应用程序编写健壮的单元测试的推荐方法是什么?我已经看到有一些库用于这一点,但是pygtk的主要库已经多年没有更新了,因此它们几乎肯定会在PyGObject自省中失败。也许我没有足够的创造力来想出一个使用Python的unittest模块的好方法,所以我愿意接受建议。在


Tags: the项目方法代码用户视图应用程序gtk
3条回答

您确定要单元测试GUI吗?您的复杂性示例涉及多个单元,因此是一个集成测试。在

如果你真的想进行单元测试,你应该能够实例化一个类,为它的依赖项提供模拟或存根,然后像GUI框架那样调用它的方法,比如用户点击。这可能很乏味,您必须确切地知道GUI框架是如何将用户输入分派到类中的。在

我的建议是在模型中加入更多的东西。对于给定的示例,您可以创建一个FilterManager,它在一个方法后面抽象所有的filter/select/display内容。然后进行单元测试。在

有一种很好的方法可以直接测试PyGTK函数和小部件,而不必经过验收/功能/集成测试框架,这些框架会将它们的方式拖到遗忘中。我是在this post中了解到这一点的,这是不言自明的。但基本思想是将小部件视为函数/类,可以直接测试它们。如果您需要处理回调等,我将在这里重现一个简单的技巧:

import time
import gtk

# Stolen from Kiwi
def refresh_gui(delay=0):
  while gtk.events_pending():
      gtk.main_iteration_do(block=False)
  time.sleep(delay)

正如博客中提到的,这段代码是LGPL。否则,当你想一想,只要你没有show()窗口或窗口小部件,你可以测试它们所有你想要的,它们的行为应该像它们是真实的一样,因为在某种程度上,它们是真实的。它们只是没有显示出来。在

当然,您需要自己通过调用按钮上的clicked()来模拟按钮和交互式小部件上的交互。再看一次Ali Afshar's excellent post about unit testing in PyGTK。在

我对这个主题不感兴趣,但实际上我对这个框架不感兴趣免费桌面.org: http://ldtp.freedesktop.org/wiki/

它允许自动化支持辅助功能的GUI应用程序(包括GTK、Qt、Swing等)的各种测试。在

相关问题 更多 >