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で関数をモックする方法と標準出力をテストする方法をまとめました。
特に関数のモックは複雑な関数をテストするのに必須となってくると思うので、様々に使えるようにしていきたいです。