pytestはPythonでテストを書くのに人気なツールです。
今回はpytestで関数をモックする方法と標準出力をテストする方法をメモがてら記載していきます。
関数のモック
pytestではmocker
を使うことで関数をモックできます。
まずはmain.py
としてget_id()
関数を以下のように定義します。
from uuid import uuid4
def get_id():
id = uuid4()
return f"Your ID: {id}"
このときuuid4()
は毎回ランダムな文字列を返します。
実行するたびにid
部分が変わってしまうので、このままではテストをすることができません。
そこで以下のようにuuid4()
をモックすることができます。
main.py
をテストするtest_main.py
を以下のように用意します。
from main import get_id
def test_get_id(mocker): # 引数にmockerと指定
id = "fef317a6-69fc-772d-51f6-8537aa728335"
mocker.patch("main.uuid4", return_value=id) # 第一引数にモックする関数を指定
value = get_id()
assert value == f"Your ID: {id}"
ポイントはテスト関数の引数にmocker
と指定するところです。
これによってpytestのmocker
を使うことができます。
次にmocker.patch
で関数をモックします。
第一引数にはモックする関数を、return_value
にはモックとして返す値を指定します。
こうすることで、main.py
内のuuid4()
という関数は、テストの上ではモックされ、必ず"fef317a6-69fc-772d-51f6-8537aa728335"
をid
として返すようになります。
標準出力をテストする
ログがちゃんと出ているかをテストするには、標準出力を見る必要があると思います。
標準出力をテストで受け取るにはcapsys
を使うことができます。
例として以下のようなmain.py
があるとします。
def print_log(user: str, message: str):
print(f"{user=}")
print(f"{message=}")
これをテストするtest_main.py
は以下のように書けます。
from main import print_log
def test_print_log(capsys): # 引数にcapsysと指定
print_log(user="test", message="Hi")
captured = capsys.readouterr() # 標準出力と標準エラー出力を受け取る
assert captured.out == "user='test'\nmessage='Hi'\n"
mocker
と同じように、テスト関数test_print_log
の引数にcapsys
を指定します。
captured = capsys.readouterr()
とすることで、標準出力と標準エラー出力を受け取ることができます。
標準出力はcaptured.out
に入っています。
おわりに
pytestで関数をモックする方法と標準出力をテストする方法をまとめました。
特に関数のモックは複雑な関数をテストするのに必須となってくると思うので、様々に使えるようにしていきたいです。