Testing QApplication
If your tests need access to a full QApplication instance to e.g. test exit
behavior or custom application classes, you can use the techniques described below:
Testing QApplication.exit()
Some pytest-qt features, most notably waitSignal and waitSignals,
depend on the Qt event loop being active. Calling QApplication.exit()
from a test will cause the main event loop and auxiliary event loops to
exit and all subsequent event loops to fail to start. This is a problem if some
of your tests call an application functionality that calls
QApplication.exit().
One solution is to monkeypatch QApplication.exit() in such tests to ensure
it was called by the application code but without effectively calling it.
For example:
def test_exit_button(qtbot, monkeypatch):
exit_calls = []
monkeypatch.setattr(QApplication, "exit", lambda: exit_calls.append(1))
button = get_app_exit_button()
button.click()
assert exit_calls == [1]
Or using the mock package:
def test_exit_button(qtbot):
with mock.patch.object(QApplication, "exit"):
button = get_app_exit_button()
button.click()
assert QApplication.exit.call_count == 1
Testing Custom QApplications
It’s possible to test custom QApplication classes, but you need to be
careful to avoid multiple app instances in the same test. Assuming one defines a
custom application like below:
from pytestqt.qt_compat import qt_api
class CustomQApplication(qt_api.QtWidgets.QApplication):
def __init__(self, *argv):
super().__init__(*argv)
self.custom_attr = "xxx"
def custom_function(self):
pass
If your tests require access to app-level functions, like
CustomQApplication.custom_function(), you can override the built-in
qapp_cls fixture in your conftest.py to return your custom class:
@pytest.fixture(scope="session")
def qapp_cls():
return CustomQApplication
The qapp fixture will then use the returned class instead of the default
QApplication from QtWidgets.
Setting a QApplication name
By default, pytest-qt sets the QApplication.applicationName() to
pytest-qt-qapp. To use a custom name, you can set the qt_qapp_name
option in pytest.ini:
[pytest]
qt_qapp_name = frobnicate-tests