Comments (5)
Hmm, the problem is not the hookwrapper per-se, I think the problem is that currently processEvents()
is being called after all fixtures are torn down (after the yield
statement):
@pytest.mark.hookwrapper
def pytest_runtest_teardown(item):
"""
Hook called after each test tear down, to process any pending events and
avoiding leaking events to the next test.
"""
yield
app = QApplication.instance()
if app is not None:
if _exception_capture_disabled(item):
app.processEvents()
else:
with capture_exceptions() as exceptions:
app.processEvents()
if exceptions:
pytest.fail('TEARDOWN ERROR: ' + format_captured_exceptions(exceptions))
Just moving the yield
statement would make the code run before all other fixture are tear down, which I think makes sense:
@pytest.mark.hookwrapper
def pytest_runtest_teardown(item):
"""
Hook called after each test tear down, to process any pending events and
avoiding leaking events to the next test.
"""
app = QApplication.instance()
if app is not None:
if _exception_capture_disabled(item):
app.processEvents()
else:
with capture_exceptions() as exceptions:
app.processEvents()
if exceptions:
pytest.fail('TEARDOWN ERROR: ' + format_captured_exceptions(exceptions))
yield
I will think about this a little more, but meanwhile feel free to add any comments or insights! 😄
from pytest-qt.
That seems to solve my issue, and all other tests still run fine for me.
I don't know what other implication that change would have, but I agree it sounds like it makes sense.
from pytest-qt.
I think actually we should process events both before and after the other tear down hooks, actually. Something like:
def _process_events(item):
app = QApplication.instance()
if app is not None:
if _exception_capture_disabled(item):
app.processEvents()
else:
with capture_exceptions() as exceptions:
app.processEvents()
if exceptions:
pytest.fail('TEARDOWN ERROR: ' + format_captured_exceptions(exceptions))
@pytest.mark.hookwrapper
def pytest_runtest_teardown(item):
"""
Hook called after each test tear down, to process any pending events and
avoiding leaking events to the next test.
"""
_process_events(item)
yield
_process_events(item)
This will allow queued events to be processed in a more predicable manner. What do you think?
from pytest-qt.
Could any new events even arrive during the teardown? But yeah - why not!
from pytest-qt.
Actually any call to app.processEvents()
may trigger any arbitrary code, which in turn might post other events, and so on... this is specially problematic in X-Window because the events are asynchronous, so a processEvents()
may end up not processing any events at all. 😟
Calling processEvents()
before and after other fixtures is only a best-effort to getting all events processed.
from pytest-qt.
Related Issues (20)
- How to use qapp_args() ? HOT 2
- How to reset qapp_args for each test class? HOT 6
- macos 14.0 (sonoma) doesn't pass control to qt HOT 16
- Tests using qtbot hang indefinitely on Mac OS Sonoma HOT 1
- How to test the following code...? HOT 1
- pytest-qt fails when snake_case feature is used in a test HOT 1
- How to use QAbstractItemModelTester? HOT 8
- test_exceptions_dont_leak fails with Python 3.12 HOT 7
- Intermittently missing property of object under test HOT 3
- More verbose tracebacks on exceptions in event loop HOT 1
- QDBusConnection.systemBus() leaks thread after qapp teardown HOT 3
- Clarification about methods like keyEvent, etc.? HOT 1
- Segfault on Linux with PyQt6 HOT 2
- "RuntimeError: Failed to disconnect" with `PySide6==6.7.0` HOT 19
- Crash on macOs Sonoma HOT 3
- SystemError on disconnect with pyside 6.7.1 HOT 7
- Clarify documentation around qtbot.waitSignals HOT 1
- _QtApi object has no attribute QtTest HOT 1
- qtbot.screenshot() changes test behavior HOT 4
- waitUntil page should link to waitUntil API doc and/or demonstrate use of the timeout param
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from pytest-qt.