2012-06-11 77 views
6

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

但是,最近我已经开始利用一些Gtk功能,如GLib.timeout_add_seconds这是一个相当简单的回调机制,只需在计时器到期后调用指定的回调机制。我现在自然面临的问题是,我的代码似乎在我使用该应用程序时工作,但测试套件封装不好,因此当一个测试检查它以干净状态开始时,它发现它的状态已被全部践踏通过由不同测试注册的回调结束。特别是,测试成功检查没有文件被加载,然后它加载一些文件,然后检查文件自加载以来没有被修改,并且测试失败!

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

我读过关于Python的reload()内置的重新加载模块,希望我可以卸载并重新加载我的应用程序以获得新的开始,但它似乎并没有工作。

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

回答

2

请问mocking framework可以帮助您隔离回调吗?这样,你应该能够回到与你开始时相同的状态。请注意,SetUp()和tearDown()模式也可以帮助你 - 但我认为你已经在使用它了。

+0

我不认为嘲笑是相当我正在寻找。我有一个用于测试的小数据集,并用mock替换它并不能真正解决我遇到的问题,也就是说,实际的程序逻辑代码使用时间延迟回调,在快速执行的测试环境中表现不佳。我*使用setup/teardown funcs,但是我还没有能够写出一个成功的拆卸,实际上可以从内存中卸载程序,然后以新的状态重新加载。从一个测试到下一个测试总会有干扰回调。 – robru

+0

我正在考虑嘲笑回调,但这可能会或可能不适合您的需求。 – Sardathrion

+0

我现在所做的似乎正在工作的是仅仅手动调用测试中的回调函数,然后用'GLib.source_remove'清理回调函数,并且它看起来有效。不过谢谢。 – robru

相关问题