Pourquoi une erreur fatale Python lors du test avec pytest-qt?

Nov 22 2020

Mon premier test utilisant pytest-qt a échoué immédiatement avec une erreur fatale de Python. J'ai réduit le code à ceci (un test qui ne passerait jamais, mais ne devrait pas planter):

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

L'exécution de ceci échoue avec:

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

Notez que l'échec se produit dans l' qappappareil, mais le test utilise qtbot(qui utilise qapplui-même).

Je reconnais qu'il existe une incompatibilité entre les versions affichées pour PyQt5, Qt runtime et Qt compilé (dans la deuxième ligne de la sortie). Mon système Ubuntu 18.04 a Qt5.9 comme Qt à l'échelle du système (à partir du PPA bionique standard), mais le groupe de développement utilise 5.12. Les runtimes 5.12 sont installés à un emplacement particulier et, pour cette exécution, LD_LIBRARY_PATHpointe vers cet emplacement. Si je n'utilise pas ce paramètre, une erreur différente se produit avant même que pytest ne commence à fonctionner:

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

Réponses

MikeC Nov 24 2020 at 22:33

Sans surprise, il y a un problème de configuration avec les bibliothèques Qt5.12 simplement copiées dans un dossier. J'ai pu créer une solution de contournement comme suit:

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

Cela me suffisait pour exécuter mes tests sans ce crash.

Comme Florian du site pytest-qt me l'a conseillé, ce Python:

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

échoue également, mais sans beaucoup d'informations. Ensuite, j'ai un conseil pour

export QT_DEBUG_PLUGINS=1

et les informations de diagnostic supplémentaires m'ont dirigé vers ce platformsdossier.