gpt4 book ai didi

unit-testing - 使用 pygobject3 和 pytest 测试 GUI 应用程序

转载 作者:行者123 更新时间:2023-12-04 16:45:29 31 4
gpt4 key购买 nike

我有一项任务是为 devassistant 编写一些单元测试(帮助程序可以帮助您设置开发环境)。它是用 Python 编写的,并提供了用 pygobject3 实现的图形用户界面。已经有单元测试,使用 pytest。
我写了一些基本的测试,它们的工作方式是这样的:

  • 创建主窗口(就像应用程序由人正常执行一样)但不要调用 Gtk.main() - 这样主窗口就不会显示
  • 模拟与 gui 的交互(单击按钮、取消/修补复选框等)或直接调用它们的回调
  • 检查事情是否如预期(调用断言)

  • 实际问题是,当 gui 测试通过并且在 gui 测试之后还有更多测试时,在进行以下测试时,会出现一个空窗口(只有一个标题)并且 pytest 卡住(空窗口没有反应并且不能关闭),所以我必须杀死它。如果我将 gui 测试“移动”到最后一个位置,它们会正常工作。

    重现步骤:
  • 克隆我的存储库 https://github.com/jkoncick/devassistant - 添加测试的实际提交是 https://github.com/jkoncick/devassistant/commit/e4296fcf7e1393a1140f3205304e54b9e8c62375
  • (安装所有必需的 python 包 - 它们在需求文件中)
  • 将 test_gui.py 文件移动到父目录 - 这样 gui 测试不会最后执行,但在它们之后有一些测试
  • 在 devassistant/gui/main_window.py 中用“self.main_win.hide()”删除第 81 行
  • 使用“./setup.py test”运行测试
  • 在进行 gui 测试(他们应该通过)之后,会出现一个空窗口并且 pytest 卡住。如果不删除“self.main_win.hide()”行,窗口将不会显示,但 pytest 仍然会卡住

  • 我真的很无奈。将 gui 测试移至最后一项工作,但它是一种解决方法,我不能假设它可以在任何地方使用。我无法“关闭”或“破坏”主窗口,以免它出现并破坏测试。
    我尝试了这些,但都没有奏效:
    app.main_win.destroy()
    app.main_win.emit('delete-event', None)
    Gtk.main_quit()

    你知道如何解决这个问题吗?

    最佳答案

    嗯,我终于解决了这个问题。这在 Gtk 中实际上不是问题。我认为这是由 Gtk_main() 未正确退出或 main_window 未正确销毁并卡在等待事件(如上一个答案中所述)引起的,但这不是实际问题,现在它可以工作了。

    问题出在 run_window.py > RunLoggingHandler > emit() > Gdk.threads_enter() <- 这里卡住了。
    logger.py 中的 'logger' 变量是全局的,当一个 RunLoggingHandler 被添加到其中时(run_window.py 中的“logger.addHandler(self.tlh)”),它保留在这里,并且当在以下测试中调用 emit() 时,它卡在这里。通过在测试后清除记录器处理程序来修复它:
    from devassistant.logger import loggerdef teardown_method(self, method):
    logger.handlers = []

    关于unit-testing - 使用 pygobject3 和 pytest 测试 GUI 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22715241/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com