Рубрики
Без рубрики

Меступирование Python DateTime в тестах с Freezegun

Я пишу контент для AWS, Kubernetes, Python, JavaScript и многое другое. Чтобы просмотреть все последние контент, будь … Помечено новичками, Python, 100daysofPython.

Я пишу контент для AWS, Kubernetes, Python, JavaScript и многое другое. Чтобы просмотреть все последние контент, обязательно Посетите мой блог и подпишитесь на мою рассылку. Следи за мной на Твиттере .

Это 17 день № 100Дазофпифона.

Этот пост будет использовать Freezegun Библиотека, чтобы продемонстрировать, как издеваться на datetime.dateTime.now Возвращаемое значение для настройки согласованных тестовых сред.

Код Репо можно найти на GitHub в okeeffed/hello-python-datetime

Предварительные условия

  1. Знакомство с Пиронв . Посмотреть здесь Для моего поста на Пипенве.
  2. Знакомство с Jupyterlab Отказ Посмотреть здесь Для моего поста на jupyterlab.
  3. Мой предыдущий блог Post DateTime в Python.
  4. Знакомство с 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 Проверка следующих сценариев:

  1. iS_date_before_today По сравнению с сегодняшнем сегодня должно быть Ложь Отказ
  2. iS_date_before_today по сравнению с одним днем назад должно быть Правда Отказ
  3. 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тойцами.

Ресурсы и дальнейшее чтение

  1. ABC of Pipenv
  2. Здравствуйте, jupyterlab.
  3. Freezegun.
  4. Пиронв
  5. Тестирование блока Python с Pтойцем

Фото кредит: pawel_czerwinski.

Первоначально опубликовано на моем блог . Чтобы увидеть новые посты без задержки, прочитайте сообщения там и подпишитесь на мою рассылку.

Оригинал: “https://dev.to/okeeffed/mocking-python-datetime-in-tests-with-freezegun-5hjj”