Dlaczego podczas testowania przy użyciu pytest-qt występuje błąd krytyczny w Pythonie?

Nov 22 2020

Mój pierwszy test z użyciem pytest-qt zakończył się niepowodzeniem i wystąpił błąd krytyczny w języku Python. Zredukowałem kod do tego (test, który nigdy nie przejdzie, ale nie powinien się zawiesić):

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()

Wykonanie tego kończy się niepowodzeniem z:

=== 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]

Zauważ, że awaria występuje w qappurządzeniu, ale test używa qtbot(który używa qappsiebie).

Rozumiem, że istnieje niezgodność między wersjami wyświetlanymi dla PyQt5, środowiska wykonawczego Qt i skompilowanych Qt (w drugim wierszu danych wyjściowych). Mój system Ubuntu 18.04 ma Qt5.9 jako systemowy Qt (ze standardowego bionicznego PPA), ale grupa programistów używa 5.12. Środowiska wykonawcze 5.12 są instalowane w określonej lokalizacji i dla tego uruchomienia LD_LIBRARY_PATHwskazują na tę lokalizację. Jeśli nie używam tego ustawienia, pojawia się inny błąd, zanim jeszcze pytest zacznie działać:

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

Odpowiedzi

MikeC Nov 24 2020 at 22:33

Nic dziwnego, że występuje problem z konfiguracją, ponieważ biblioteki Qt5.12 są po prostu kopiowane do folderu. Udało mi się znaleźć rozwiązanie w następujący sposób:

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

To wystarczyło, żebym przeprowadził testy bez tej awarii.

Jak poradził mi Florian na stronie pytest-qt, ten Python:

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

również zawodzi, ale bez wielu informacji. Wtedy dostałem wskazówkę

export QT_DEBUG_PLUGINS=1

a dodatkowe informacje diagnostyczne wskazały mi ten platformsfolder.