📑

[Python]時間を固定してテストしたい

2021/05/02に公開

時間を固定してテストしたい

現在時刻を使って何か処理をする関数を作った時ってテストしづらいですよね?実行した時間に依存して処理が変わるので。

そんな状況を解決してくれるライブラリがあったので紹介します。

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を使えばいいと思います。

参考

簡単にしか使わなかったですが、もうちょっと色々指定できるみたいのでこちらを参照してください。

https://github.com/spulec/freezegun

Discussion