为什么在使用 pytest-qt 进行测试时出现致命 Python 错误?
Why a Fatal Python error when testing using pytest-qt?
我使用 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 运行time 和 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
不出所料,简单地将 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 错误。我将代码缩减为(一个永远不会通过但不应该崩溃的测试):
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 运行time 和 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
不出所料,简单地将 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
文件夹。