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

标签 python testing gtk glib pygobject

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

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

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

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

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

最佳答案

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

关于python - 有没有办法对用 Python 编写的 Gtk/GLib 代码进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10976431/

相关文章:

javascript - Angular JS + Jasmine 测试 Controller

javascript - QUnit 测试在 Travis CI 上失败(在带有 grunt.js 的 phantomjs 上运行)

gtk - 如何让 GtkTextView 看起来像 GtkEntry?

c++ - 使用 MSYS2 安装后如何运行 Glade 和 Devhelp

python - 从包的 __init__.py 中屏蔽 python 子模块

testing - 我们可以为 Web 应用程序创建数据库检查点吗?(测试)

javascript - 如何为 jsonschema 生成时间字符串

image - GTK改变窗口背景图像

python - 获取参数名称

python - Keras 批量训练回调串联