¿Por qué un error fatal de Python al probar usando pytest-qt?

Nov 22 2020

Mi primera prueba con pytest-qt falló inmediatamente con un error fatal de Python. Reduje el código a esto (una prueba que nunca pasaría, pero que no debería fallar):

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

La ejecución de esto falla con:

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

Tenga en cuenta que la falla ocurre en el qappdispositivo, pero la prueba está usando qtbot(que se usa a qappsí misma).

Reconozco que hay una falta de coincidencia entre las versiones mostradas para PyQt5, Qt runtime y Qt compilado (en la segunda línea de la salida). Mi sistema Ubuntu 18.04 tiene Qt5.9 como Qt en todo el sistema (del PPA biónico estándar), pero el grupo de desarrollo está usando 5.12. Los tiempos de ejecución 5.12 se instalan en una ubicación particular y, para esta ejecución, LD_LIBRARY_PATHapunta a esa ubicación. Si no utilizo esta configuración, se produce un error diferente antes de que pytest comience a ejecutarse:

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

Respuestas

MikeC Nov 24 2020 at 22:33

Como era de esperar, hay un problema de configuración con las bibliotecas Qt5.12 que simplemente se copian en una carpeta. Pude crear una solución alternativa de la siguiente manera:

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

Esto fue suficiente para ejecutar mis pruebas sin este bloqueo.

Como me aconsejó Florian en el sitio de pytest-qt, este Python:

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

También falla, pero sin mucha información. Entonces recibí un consejo para

export QT_DEBUG_PLUGINS=1

y la información de diagnóstico adicional me indicó esa platformscarpeta.