为啥在使用 pytest-qt 进行测试时出现致命的 Python 错误?

Posted

技术标签:

【中文标题】为啥在使用 pytest-qt 进行测试时出现致命的 Python 错误?【英文标题】:Why a Fatal Python error when testing using pytest-qt?为什么在使用 pytest-qt 进行测试时出现致命的 Python 错误? 【发布时间】:2020-11-22 21:03:04 【问题描述】:

我使用 pytest-qt 的第一次测试立即失败,出现致命的 Python 错误。我将代码简化为这样(一个永远不会通过但不应该崩溃的测试):

from PyQt5 import QtCore as qtc


class sut(qtc.QObject):
    sig_sig_sputnik = qtc.pyqtSignal()

    def __init__(self):
        super().__init__()

    def listen(self):
        pass


def test_emit(qtbot):
    uut = sut()
    with qtbot.waitSignal(sut.sig_sig_sputnik, raising=True):
        uut.listen()

执行失败:

=== test session starts ====
platform linux -- Python 3.6.9, pytest-5.4.3, py-1.8.1, pluggy-0.13.1
PyQt5 5.10.1 -- Qt runtime 5.12.9 -- Qt compiled 5.9.5
rootdir: [~]/src/npsw/frameworks/rtx, inifile: pytest.ini
plugins: qt-3.3.0, metadata-1.10.0, html-2.1.1, jnj-radish-1.4.0
collected 1 item                                                                                                                                                             

test_min.py Fatal Python error: Aborted

Current thread 0x00007f7c8411c740 (most recent call first):
  File "[~]/.local/lib/python3.6/site-packages/pytestqt/plugin.py", line 57 in qapp
  File "[~]/.local/lib/python3.6/site-packages/_pytest/fixtures.py", line 792 in call_fixture_func
  File "[~]/.local/lib/python3.6/site-packages/_pytest/fixtures.py", line 964 in pytest_fixture_setup
[boilerplate pytest stack from here on down]

请注意,失败发生在 qapp 夹具中,但测试使用的是 qtbot(它使用 qapp 本身)。

我认识到 PyQt5、Qt 运行时和 Qt 编译的版本之间存在不匹配(在输出的第二行中)。我的 18.04 Ubuntu 系统将 Qt5.9 作为系统范围的 Qt(来自标准仿生 PPA),但开发组使用的是 5.12。 5.12 运行时安装到特定位置,对于本次运行,LD_LIBRARY_PATH 指向该位置。如果我不使用此设置,在 pytest 甚至开始运行之前会出现不同的错误:

INTERNALERROR> ImportError: /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5: symbol _ZNK15QDateTimeParser5parseER7QStringRiRK9QDateTimeb version Qt_5_PRIVATE_API not defined in file libQt5Core.so.5 with link time reference

【问题讨论】:

类似于***.com/questions/61636476/…,但在不同的位置崩溃,我在这里提供了一个最小测试用例。 【参考方案1】:

不出所料,将 Qt5.12 库简单地复制到文件夹中存在配置问题。我能够制定如下解决方法:

sudo mkdir /usr/bin/platforms
sudo ln -s /our/local/libqxcb.so /usr/bin/platforms/libqxcb.so

这足以让我在没有崩溃的情况下运行我的测试。

正如 pytest-qt 网站的 Florian 建议我的那样,这个 Python:

from PyQt5.QtWidgets import QApplication
app = QApplication([])

也失败了,但没有太多信息。然后我得到了提示

export QT_DEBUG_PLUGINS=1

额外的诊断信息将我指向那个 platforms 文件夹。

【讨论】:

以上是关于为啥在使用 pytest-qt 进行测试时出现致命的 Python 错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Visual Studio 中编译 C++ 项目时出现致命错误“LNK1104:无法打开文件 'cryptlib.lib'?

在 raspbian 上编译 pybind11 测试用例时出现致命错误

使用 QT 运行 pytest 时出现致命的 Python 错误

为啥在运行玩笑测试时出现“未定义:x:y:属性”缺失错误?

在视图控制器之间进行 segue 时出现致命错误

为啥在尝试对整个 Spring Batch Job 进行单元测试时出现此错误?没有可用的“org.springframework.batch.core.Job”类型的合格bean