有没有办法对用Python编写的Gtk / GLib代码进行单元测试?

时间:2012-06-11 08:08:54

标签: python testing gtk glib pygobject

我正在使用PyGObject编写一个中小型GUI应用程序(基于Gtk的新的基于内省的绑定)。我从一个基于nose的合理测试套件开始,它能够通过简单地导入模块并调用各种函数并检查结果来测试我的应用程序的大部分功能。

然而,最近我开始利用像GLib.timeout_add_seconds这样的一些Gtk功能,这是一个相当简单的回调机制,只是在计时器到期后调用指定的回调。我现在面临的问题是我的代码似乎在我使用应用程序时工作,但是测试套件的封装很差,所以当一个测试检查它是否从干净开始状态,它发现它的状态已被一个由不同测试注册的回调全部践踏。具体来说,测试成功检查没有加载文件,然后加载一些文件,然后检查文件是否自加载后没有被修改,测试失败!

我花了一段时间来弄清楚发生了什么,但基本上一个测试会修改一些文件(启动计时器)然后关闭它们而不保存,然后另一个测试将重新打开未修改的文件并发现它们&#39 ;重新修改,因为在定时器启动后回调改变了文件。

我已经阅读了Python reload()内置用于重新加载模块的内容,希望我可以将其卸载并重新加载我的应用以获得一个新的开始,但它只是没有?似乎工作。

我担心我可能不得不求助于将应用程序作为子进程启动,修补它,然后结束子进程并在需要保证新状态时重新启动它。是否有任何测试框架可以使这变得容易,特别是对于pygobject代码?

1 个答案:

答案 0 :(得分:2)

mocking framework会帮助您隔离回调吗?这样,您应该能够恢复到开始时的状态。请注意,SetUp()和tearDown()模式也可以帮助你 - 但我有点假设你已经在使用它。