We are sucessfully using pytest (Python 3) to run a test suite testing some hardware devices (electronics). For a subset of these tests, we need the tester to change the hardware arrangement, and afterwards change it back. My approach was to use a module-level fixture attached to the tests in question (which are all in a separate module), with two input
calls:
@pytest.fixture(scope="module") def disconnect_component(): input('Disconnect component, then press enter') yield # At this point all the tests with this fixture are run input('Connect component again, then press enter')
When running this, I get OSError: reading from stdin while output is captured
. I can avoid this by calling pytest with --capture=no
, and have confirmed that my approach works, meaning I get the first query before the test subset in question, and the second one after they have run.
The big drawback is that this deactivates capturing stdin/stderr for the whole test suite, which some of the other test rely on.
I also tried to use capsys.disabled
(docs) like this
@pytest.fixture(scope="module") def disconnect_component(capsys): with capsys.disabled(): input('Disconnect component, then press enter') yield # At this point all the tests with this fixture are run input('Connect component again, then press enter')
but when running this I get ScopeMismatch: You tried to access the 'function' scoped fixture 'capsys' with a 'module' scoped request object, involved factories
.
Can I make pytest wait for user action in some other way than input
? If not, can I disable capturing just for the tests using above fixture?