📑
[Python]時間を固定してテストしたい
時間を固定してテストしたい
現在時刻を使って何か処理をする関数を作った時ってテストしづらいですよね?実行した時間に依存して処理が変わるので。
そんな状況を解決してくれるライブラリがあったので紹介します。
freezegunを使う
freezegunというライブラリがあるのでそれを使います。
インストールする
サードパーティなのでインストールします。
pip install freezegun
適用対象
こちらの関数に適用したいと思います。単に年齢を算出する関数です。
age_calcurate.py
import datetime
def age(year, month, day):
today = datetime.date.today()
birthday = datetime.date(year, month, day)
return (int(today.strftime("%Y%m%d")) - int(birthday.strftime("%Y%m%d"))) // 10000
関数内で実行時の日付を取得しているため、とてもテストがしづらいと思います。今回はこれに適用してみましょう。
実際に使ってみる
from freezegun import freeze_time
from age_calcurate import age
@freeze_time("2020-05-12")
def test_2020年の誕生日の前の場合にageが24であること():
assert age(1995, 6, 12) == 24
@freeze_time("2020-06-12")
def test_2020年の誕生日当日の場合にageが25であること():
assert age(1995, 6, 12) == 25
実際に使ってみるとこんな感じです。freezegunをインポートすれば、freeze_timeという関数が使えるので、これをテスト関数にデコレータとして当てることで使えます。
実際にテスト関数中で実行される、datetime.date.today()が実行された結果はfreeze_time関数で指定した2020年5月12日になっていました。
まとめ
値を操作したい時はモックで差し替えるが一般ですが、datetimeなど組み込み関数をいじることはできないので、少なくとも時間に関してはfreezegunを使えばいいと思います。
参考
簡単にしか使わなかったですが、もうちょっと色々指定できるみたいのでこちらを参照してください。
Discussion