pytest の capsys
を使うと Python スクリプトで出力する stdout(標準出力)と stderr(標準エラー)をテストできる❗️関数の実行結果ではなく,その途中に出力するログに着目したい場面もあって便利〜 \( 'ω')/
👾 src/app.py
hello()
関数は Hello と World! を stdout と stderr に出力して,version()
関数は Python バージョンを stdout に出力する.サンプルコードなので特に意味はないけど今回はこの関数をテスト対象にする💡
import platform import sys def hello(): print('Hello') print('World!', file=sys.stderr) def version(): print(platform.python_version())
👾 tests/test_app.py
テストコードでは capsys.readouterr()
を使って stdout と stderr を取得して簡単に assert できる👌
from app import hello, version def test_main(capsys): hello() captured = capsys.readouterr() assert captured.out == 'Hello\n' assert captured.err == 'World!\n' def test_version(capsys): version() captured = capsys.readouterr() assert captured.out == '3.12.2\n'
テスト実行
テストできた👌
$ pytest . ===================================================== test session starts ===================================================== (中略) configfile: pytest.ini collected 2 items tests/test_app.py .. [100%] ====================================================== 2 passed in 0.01s ======================================================
参考資料
capsys
は「テスト駆動 Python 第2版」の CHAPTER 4 にも載ってた📕