Por que um erro fatal do Python ao testar usando pytest-qt?
Meu primeiro teste usando pytest-qt falhou imediatamente com um erro Fatal Python. Reduzi o código a isto (um teste que nunca passaria, mas não deveria travar):
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()
Executar isso falha com:
=== 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]
Observe que a falha ocorre no qappaparelho, mas o teste está usando qtbot(que usa a qappsi mesmo).
Eu reconheço que há uma incompatibilidade entre as versões mostradas para PyQt5, Qt runtime e Qt compilado (na segunda linha da saída). Meu sistema Ubuntu 18.04 tem Qt5.9 como Qt em todo o sistema (do PPA biônico padrão), mas o grupo de desenvolvimento está usando 5.12. Os tempos de execução do 5.12 são instalados em um local específico e, para essa execução, LD_LIBRARY_PATHaponta para esse local. Se eu não usar essa configuração, um erro diferente ocorrerá antes mesmo de o pytest começar a ser executado:
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
Respostas
Sem surpresa, há um problema de configuração com as bibliotecas Qt5.12 simplesmente sendo copiadas para uma pasta. Consegui criar uma solução alternativa da seguinte maneira:
sudo mkdir /usr/bin/platforms
sudo ln -s /our/local/libqxcb.so /usr/bin/platforms/libqxcb.so
Isso foi suficiente para eu executar meus testes sem esse travamento.
Como Florian do site pytest-qt me aconselhou, este Python:
from PyQt5.QtWidgets import QApplication
app = QApplication([])
também falha, mas sem muita informação. Então eu recebi uma dica para
export QT_DEBUG_PLUGINS=1
e a informação extra de diagnóstico me apontou para essa platformspasta.