pytest-qt를 사용하여 테스트 할 때 왜 치명적인 Python 오류가 발생합니까?

Nov 22 2020

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 시스템에는 시스템 전체 Qt (표준 바이오닉 PPA)로 Qt5.9가 있지만 개발 그룹은 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

답변

MikeC Nov 24 2020 at 22:33

당연히 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폴더 를 가리 켰습니다 .