The PyTest documentation states that stdin is redirected to null as no-one will want to do interactive testing in a batch test context. This is true, but interactive is not the only use of stdin. I want to test code that uses stdin just as it would use any other file. I am happy with stdout and sterr being captured but how to actually have stdin connected to an io.StringIO object say in a PyTest conformant way?
Running pytest We can run a specific test file by giving its name as an argument. A specific function can be run by providing its name after the :: characters. Markers can be used to group tests. A marked grouped of tests is then run with pytest -m .
Skipping a test The simplest way to skip a test is to mark it with the skip decorator which may be passed an optional reason . It is also possible to skip imperatively during test execution or setup by calling the pytest. skip(reason) function.
pytest supports running Python unittest -based tests out of the box. It's meant for leveraging existing unittest -based test suites to use pytest as a test runner and also allow to incrementally adapt the test suite to take full advantage of pytest's features.
You can monkeypatch it:
def test_method(monkeypatch): monkeypatch.setattr('sys.stdin', io.StringIO('my input')) # test code
Maybe you could run your script as a subprocess
? In Python 3.6:
import subprocess def test_a_repl_session(): comlist = ['./executable_script.py'] script = b'input\nlines\n\n' res = subprocess.run(comlist, input=script, stdout=subprocess.PIPE, stderr=subprocess.PIPE) assert res.returncode == 0 assert res.stdout assert res.stderr == b''
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With