【问题标题】:Is there a way to unit test Gtk/GLib code written in Python?有没有办法对用 Python 编写的 Gtk/GLib 代码进行单元测试?
【发布时间】:2012-06-11 08:08:53
【问题描述】:

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

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

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

我已经阅读了 Python 的 reload() 用于重新加载模块的内置函数,希望我可以让它卸载并重新加载我的应用程序以重新开始,但它似乎不起作用。

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

【问题讨论】:

  • 这到底是怎么回事 - 子流程似乎不是最糟糕的方式?

标签: python testing gtk glib pygobject


【解决方案1】:

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

【讨论】:

  • 我不认为嘲笑是我正在寻找的。我有一个用于测试的小数据集,用模拟替换它并不能真正解决我遇到的问题,即实际的程序逻辑代码使用延时回调,在快速执行的测试环境中表现不佳.我 am 使用 setup/teardown 函数,但我无法编写一个成功的拆卸程序,该拆卸程序实际上可以从内存中卸载程序,然后以新状态重新加载它。总是有挥之不去的回调干扰从一个测试到下一个测试。
  • 我正在考虑模拟回调,但这可能适合也可能不适合您的需求。
  • 我现在所做的似乎正在工作的只是手动调用测试中的回调,然后更积极地使用GLib.source_remove 清除回调,看起来工作。不过还是谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-03-23
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多