kakakakakku blog

Weekly Tech Blog: Keep on Learning!

pytest の capsys で stdout(標準出力)と stderr(標準エラー)をテストする

pytest の capsys を使うと Python スクリプトで出力する stdout(標準出力)と stderr(標準エラー)をテストできる❗️関数の実行結果ではなく,その途中に出力するログに着目したい場面もあって便利〜 \( 'ω')/

docs.pytest.org

👾 src/app.py

hello() 関数は HelloWorld! を 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 にも載ってた📕