QApplication 实例/qtbot 夹具导致 travis-ci 中止和核心转储

Posted

技术标签:

【中文标题】QApplication 实例/qtbot 夹具导致 travis-ci 中止和核心转储【英文标题】:QApplication instance/qtbot fixture causes travis-ci to abort and core dump 【发布时间】:2019-05-23 19:14:23 【问题描述】:

致力于了解如何对基于 PySide2 的应用程序进行自动化单元测试。但是,每当我尝试在测试中初始化QApplication 实例时,无论是通过PySide2 本身还是通过pytest-qt 的qtbot 夹具,travis-ci 都会中止测试。但是,它可以在本地工作。

我尝试使用来自pytest-qtqtbotqapp 固定装置,尝试不同的travis-ci 发行版,例如xenialtrusty,以及像我一样包括pytest-xvfb 插件看到类似的***问题的答案推荐,但以上任何组合都没有任何效果。

# .travis.yml
language: python
python:
  - "3.6"
cache: pip
dist: xenial
install: pip install -r requirements.txt
# running from top folder level to keep package on the path
script: python -m pytest tests/
# tests/test_central.py
from lysiaa.central import MyWindow

def test_giveBack(qapp):
    window = MyWindow()
    assert window.giveBack(1) == 1
# lysiaa/central.py
class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

    def giveBack(self, param):
        return param

travis-ci 尝试运行它时,它会因核心转储而中止。谁能帮我解决这个问题?

============================= test session starts ==============================
platform linux -- Python 3.6.7, pytest-4.5.0, py-1.8.0, pluggy-0.11.0
PySide2 5.12.3 -- Qt runtime 5.12.3 -- Qt compiled 5.12.3
rootdir: /home/travis/build/robert-clayton/LYSIAA
plugins: xvfb-1.2.0, qt-3.2.2
collected 1 item                                                               
tests/test_central.py /home/travis/.travis/functions: line 104:  4092 Aborted                 (core dumped) python -m pytest tests/
The command "python -m pytest tests/" exited with 134.

【问题讨论】:

【参考方案1】:

我只是在一个类似的项目中发现了这一点。我认为这是相关的: Running pytest-qt on CircleCI

我尝试在 Travis-CI 中将 QT_DEBUG_PLUGINS=1 设置为环境变量,但没有从中获得任何信息。但是,我成功添加了

addons:
  apt:
    packages:
    - x11-utils
    - libxkbcommon-x11-0
services: xvfb
dist: xenial

.travis.yml。请注意,出于某种原因,您必须确保 .travis.yml 中没有 before-install 部分。

这是一个有效的 travis.yml:https://github.com/AFM-analysis/PyJibe/blob/c4406fd712d778e2f644d6d03fce0db5688801bb/.travis.yml

Travis-CI 之前:https://travis-ci.org/AFM-analysis/PyJibe/jobs/564834411

Trivis-CI 之后:https://travis-ci.org/AFM-analysis/PyJibe/jobs/565690825

[编辑:根据 DrIDK 的评论,我添加了 services: xvfbdist: xenial]

【讨论】:

确认这对我遇到的错误很有帮助。谢谢老兄,我几乎放弃了。 服务 xvfb 也是必需的,并且仅适用于 xenial。我也成功地使用上面的代码解决了这个问题,并在我的 travis 文件中添加了 dist:xenial @DrIDK 感谢您指出这一点 --- 我忘记了我还添加了 dist: xenial 到我的 yml 文件中。我将编辑我的原始问题以包含该信息。 这里也一样!一个潜在的讨厌问题的干净和无痛的解决方案......你让我很开心【参考方案2】:

感谢 Paul,我尝试了上述方法,并且必须结合一些解决方案的资源才能使其正常工作。希望这可以帮助其他人!

我在 travis ci 上使用 Python 3.8,但需要上面提到的更多 xcb 包。

addons:
  apt:
    packages:
    - x11-utils
    - libxkbcommon-x11-0
    - libxcb-randr0-dev
    - libxcb-xtest0-dev
    - libxcb-xinerama0-dev
    - libxcb-shape0-dev
    - libxcb-xkb-dev
    - libxcb-render-util0
    - libxcb-icccm4
    - libxcb-keysyms1
    - libxcb-image0
services: xvfb

使用此配置,pytest 与 pytest-qt 运行良好。我不得不一一经历 QT 的依赖失败,直到它起作用。

【讨论】:

以上是关于QApplication 实例/qtbot 夹具导致 travis-ci 中止和核心转储的主要内容,如果未能解决你的问题,请参考以下文章

使用 qtbot.mouseClick 选择 QListWidgetItem

如何在pytest中将几个参数化的夹具连接成一个新的夹具?

将夹具上传到在 AWS EC2 实例的 docker 容器中运行的 django

多个 QApplication 实例

完全删除 QApplication 实例并在另一个线程中重新创建它

如何使用线程实例化多个 QApplication