在 CircleCI 上运行 pytest-qt

Posted

技术标签:

【中文标题】在 CircleCI 上运行 pytest-qt【英文标题】:Running pytest-qt on CircleCI 【发布时间】:2019-06-30 11:07:33 【问题描述】:

我正在尝试在 CircleCI 上运行需要 pytest-qt(用于测试 PySide2 对话框)的测试。我收到以下错误:

xdpyinfo was not found, X start can not be checked! Please install xdpyinfo!
============================= test session starts ==============================
platform linux -- Python 3.6.8, pytest-5.0.0, py-1.8.0, pluggy-0.12.0 -- /home/circleci/project-caveman/venv/bin/python3
cachedir: .pytest_cache
PySide2 5.13.0 -- Qt runtime 5.13.0 -- Qt compiled 5.13.0
rootdir: /home/circleci/project-caveman
plugins: cov-2.7.1, xvfb-1.2.0, qt-3.2.2
collected 1 item                                                               

tests/test_main.py::test_label_change_on_button_press Fatal Python error: Aborted

Aborted (core dumped)
Exited with code 134

我正在使用这个配置文件:

version: 2
jobs:
  build:
    working_directory: ~/project-caveman
    docker:
      - image: circleci/python:3.6.8-stretch
    steps:
      - checkout

      # Dependencies
      - restore_cache:
          keys:
            - venv- .Branch - checksum "setup.py" 
            - venv- .Branch -
            - venv-
      - run:
          name: Install dependencies
          command: |
            python3 -m venv venv
            . venv/bin/activate
            pip install -e .[test] --progress-bar off
      - save_cache:
          key: venv- .Branch - checksum "setup.py" 
          paths:
            - "venv"

      # Tests
      - run:
          name: Pytest
          command: |
            mkdir test-reports
            . venv/bin/activate
            xvfb-run -a pytest -s -v --doctest-modules --junitxml test-reports/junit.xml --cov=coveralls --cov-report term-missing
      - store_test_results:
          path: test-reports
      - run:
          name: Coveralls
          command: coveralls

非常感谢任何帮助,在此先感谢。

【问题讨论】:

您可以尝试在错误时读取转储的回溯吗?在test_label_change_on_button_press 函数中,添加行import faulthandlerfaulthandler.enable(),也许它会对错误有所了解。可能xfvb-run没有找到显示,但是没有错误信息很难说。 @hoefling 看看circleci.com/gh/redduntur/project-caveman/46。 【参考方案1】:

我已将容器 circleci/python:3.6.8-stretch 拉到本地,克隆了您的存储库并尝试执行测试,但我可以重现错误。

首先要做的是为 Qt 运行时启用调试模式,以便打印一些有关错误的信息。这可以通过设置环境变量QT_DEBUG_PLUGINS来完成:

$ QT_DEBUG_PLUGINS=1 pytest -sv

现在可以立即清楚运行测试的容器中缺少什么。来自上述命令输出的 sn-p:

Got keys from plugin meta data ("xcb")
QFactoryLoader::QFactoryLoader() checking directory path "/usr/local/bin/platforms" ...
Cannot load library /home/circleci/.local/lib/python3.6/site-packages/PySide2/Qt/plugins/platforms/libqxcb.so: (libxkbcommon-x11.so.0: cannot open shared object file: No such file or directory)
QLibraryPrivate::loadPlugin failed on "/home/circleci/.local/lib/python3.6/site-packages/PySide2/Qt/plugins/platforms/libqxcb.so" : "Cannot load library /home/circleci/.local/lib/python3.6/site-packages/PySide2/Qt/plugins/platforms/libqxcb.so: (libxkbcommon-x11.so.0: cannot open shared object file: No such file or directory)"
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.

Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.

Aborted (core dumped)

解决这个问题很简单 - 安装 libxkbcommon-x11-0 包:

$ sudo apt update && sudo apt install -y libxkbcommon-x11-0

在 CircleCI 配置中添加这一行(在测试作业之前的某个位置,例如在安装包依赖项的作业中),测试应该可以正常运行。

除此之外,全局设置QT_DEBUG_PLUGINS=1 是有意义的,这样您就可以在将来对最终的 Qt 运行时故障做出反应。

xdpyinfo 没有找到,X start 无法检查!请安装 xdpyinfo!

如果您想摆脱该警告,请安装x11-utils

$ sudo apt install x11-utils

【讨论】:

【参考方案2】:

在Centos6.5只运行:yum install xdpyinfo,成功解决

【讨论】:

以上是关于在 CircleCI 上运行 pytest-qt的主要内容,如果未能解决你的问题,请参考以下文章

CircleCI 没有运行“npm run”命令

如何在CircleCI 2.0上配置顺序工作流?

尝试在 CircleCI 上获取 golang 私有依赖项时的问题

错误无法连接到 CircleCi 中的 Ryuk

将CircleCI更改部署到Heroku

CircleCI android在UnitTest步骤运行失败