Я пишу контент для AWS, Kubernetes, Python, JavaScript и многое другое. Чтобы просмотреть все последние контент, обязательно Посетите мой блог и подпишитесь на мою рассылку. Следи за мной на Твиттере .
Это 17 день № 100Дазофпифона.
Этот пост будет использовать Freezegun Библиотека, чтобы продемонстрировать, как издеваться на datetime.dateTime.now
Возвращаемое значение для настройки согласованных тестовых сред.
Код Репо можно найти на GitHub в okeeffed/hello-python-datetime
Предварительные условия
- Знакомство с Пиронв . Посмотреть здесь Для моего поста на Пипенве.
- Знакомство с Jupyterlab Отказ Посмотреть здесь Для моего поста на jupyterlab.
- Мой предыдущий блог Post DateTime в Python.
- Знакомство с Pteest Отказ Смотри мой блог Post Тестирование блока Python с Pteest для стартового поста.
Начиная
Предыдущий код будет построен на вершине кода из DateTime в Python Отказ Последнее репо на okeeffed/hello-python-datetime Отказ
Ради простоты мы будем работать так, как если бы мы строим совершенно новое репо:
Давайте создадим Hello-Python-datetime
Справочник и установите необходимые зависимости.
# Make the `hello-python-datetimes` directory $ mkdir hello-python-datetimes $ cd hello-python-datetimes # Init the virtual environment $ pipenv --three $ pipenv install --dev ipython freezegun types-freezegun # Create a folder to place files $ mkdir src tests # Create the required files $ touch src/datetimes.py src/__init__.py tests/datetimes_test.py tests/__init__.py main.py
На этом этапе мы теперь готовы обновить наши main.py
файл и SRC/DateTimes.py
быть наравне с тем, что нам нужно для тестирования.
Добавьте следующее в SRC/DateTimes.py
:
from datetime import date def is_date_before_today(date_str: str): """Check if date is before today Args: date_str (str): String of a date to pass Returns: bool: Value of if date is before today """ try: date_obj = date.fromisoformat(date_str) return date_obj < date.today() except Exception: return False
Добавьте следующее в main.py
:
from src.datetimes import is_date_before_today from datetime import datetime, timedelta print(is_date_before_today("2019-01-01")) print(is_date_before_today("2022-01-01")) print(is_date_before_today("2021-08-03")) print(is_date_before_today("2021-08-04")) now = datetime.now() now_str = now.strftime('%Y-%m-%d') print(now_str) print(is_date_before_today(now_str)) now_subtract_one_day = now - timedelta(days=2) now_subtract_one_day_str = now_subtract_one_day.strftime('%Y-%m-%d') print(now_subtract_one_day_str) print(is_date_before_today(now_subtract_one_day_str)) now_add_one_day = now + timedelta(days=1) now_add_one_day_str = now_add_one_day.strftime('%Y-%m-%d') print(now_add_one_day_str) print(is_date_before_today(now_add_one_day_str))
Бег Python Main.py
Должен привезти нас на ногу со следующими:
$ python main.py True False True True 2021-08-05 False 2021-08-03 True 2021-08-06 False
Выходные данные сочетаются до ценностей печати США из main.py
Отказ Теперь мы находимся на сцене, где мы находимся в порядке, чтобы начать писать тесты.
Примечание. Если вы используете виртуальную среду, вам нужно будет запустить Pipenv Shell
войти в виртуальную среду.
Исследование Freezegun с Pтойцами
Freezegun это библиотека, которая помогает с издевательствами datetime.dateTime.now
функция. Это очень полезный инструмент для тестирования кода, который использует datetime
библиотека.
Мы можем использовать библиотеку с декоратором для теста или создания с
блокировать.
Чтобы продемонстрировать, добавить следующий код в Тесты/datetimes_test.py.
:
import datetime from freezegun import freeze_time from src.datetimes import is_date_before_today def test_freeze_time(): assert datetime.datetime.now() != datetime.datetime(2012, 1, 14) # Mocking the time to be 2012-01-14 with freeze_time("2012-01-14"): assert datetime.datetime.now() == datetime.datetime(2012, 1, 14) # Without the mock, the time should be back to normal assert datetime.datetime.now() != datetime.datetime(2012, 1, 14) @freeze_time("2012-01-14") def test_freeze_time_with_decorator(): # Testing with a decorator that mocks throughout the test assert datetime.datetime.now() == datetime.datetime(2012, 1, 14)
Первый тест демонстрирует с
Блок будет ли второй тест демонстрирует использование с декоратором.
Бег Pipenv Run Pteest
Теперь запустит тесты и отобразит результаты.
$ pipenv run pytest pipenv run pytest ================================== test session starts =================================== platform darwin -- Python 3.9.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 rootdir: /path/to/hello-python-datetimes collected 2 items tests/test_datetimes.py .. [100%] =================================== 2 passed in 0.21s ====================================
Теперь мы готовы проверить нашу iS_date_before_today
функционировать способом, похожим на как наш main.py
вызывает функции.
Тестирование функции is_date_before_today
Давайте обновим наше Тесты/datetimes_test.py
Файл для тестирования iS_date_before_today
функция.
import datetime from freezegun import freeze_time from src.datetimes import is_date_before_today def test_freeze_time(): assert datetime.datetime.now() != datetime.datetime(2012, 1, 14) # Mocking the time to be 2012-01-14 with freeze_time("2012-01-14"): assert datetime.datetime.now() == datetime.datetime(2012, 1, 14) # Without the mock, the time should be back to normal assert datetime.datetime.now() != datetime.datetime(2012, 1, 14) @freeze_time("2012-01-14") def test_freeze_time_with_decorator(): # Testing with a decorator that mocks throughout the test assert datetime.datetime.now() == datetime.datetime(2012, 1, 14) # Converting the output we expected from main.py into a set of tests. # Mocking time unnecessary, but done for the sake of completion. @freeze_time("2021-08-05") def test_is_date_before_today(): """Should return False""" now = datetime.datetime.now() now_str = now.strftime('%Y-%m-%d') assert is_date_before_today(now_str) is False @freeze_time("2021-08-05") def test_is_one_day_ago_before_today(): """Should return True""" now_subtract_one_day = datetime.datetime.now() - datetime.timedelta(days=1) now_subtract_one_day_str = now_subtract_one_day.strftime('%Y-%m-%d') assert is_date_before_today(now_subtract_one_day_str) is True @freeze_time("2021-08-05") def test_is_one_day_ahead_before_today(): """Should return False""" now_add_one_day = datetime.datetime.now() + datetime.timedelta(days=1) now_add_one_day_str = now_add_one_day.strftime('%Y-%m-%d') assert is_date_before_today(now_add_one_day_str) is False
В нашем тесте мы замораживаем время (используя декоратор) до даты этого блога Post 2021-08-05
Проверка следующих сценариев:
iS_date_before_today
По сравнению с сегодняшнем сегодня должно бытьЛожь
ОтказiS_date_before_today
по сравнению с одним днем назад должно бытьПравда
ОтказiS_date_before_today
По сравнению с одним днем впереди должен бытьЛожь
Отказ
Мы можем подтвердить, что это правда, когда еще раз работает Pipenv Run Pteest
:
$ pipenv run pytest ================================== test session starts =================================== platform darwin -- Python 3.9.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 rootdir: /Users/dennisokeeffe/code/blog-projects/hello-python-datetimes collected 5 items tests/test_datetimes.py ..... [100%] =================================== 5 passed in 0.21s ====================================
Резюме
Сегодняшний пост продемонстрировал, как использовать Freezegun Пакет, чтобы издеваться с датой тестирования с Pтойцами.
Ресурсы и дальнейшее чтение
Фото кредит: pawel_czerwinski.
Первоначально опубликовано на моем блог . Чтобы увидеть новые посты без задержки, прочитайте сообщения там и подпишитесь на мою рассылку.
Оригинал: “https://dev.to/okeeffed/mocking-python-datetime-in-tests-with-freezegun-5hjj”