PyTest и stati c классы путаницы - PullRequest
0 голосов
/ 27 марта 2020

Я учусь использовать Python / PyTest и наткнулся на то, что не могу отработать.

Я создал класс "stati c", который предоставляет временную метку, позволяющую мне контролировать модульное тестирование других классов, использующих функции времени:

"""This class overrides the system datetime function for this application.
   This will allow for unit tests to control the time and accurately, and reliably, test functionality."""
from datetime import datetime


class DateTimeStamp():
    _custom_time = 0

    @staticmethod
    def getCurrentTimeStamp():
        """Returns the current time, or the overridden time if set"""
        return DateTimeStamp._custom_time if DateTimeStamp._custom_time else datetime.now()

    @staticmethod
    def clear_override():
        """Clears any previous override allowing the code to access real time again"""
        DateTimeStamp._custom_time = 0

    @staticmethod
    def override(years, months, days, hours=0, minutes=0, seconds=0, millis=0):
        """Allows the date and time to be manually set, and fixed, to allow testing"""
        DateTimeStamp._custom_time = datetime(years, months, days, hours, minutes, seconds, millis, tzinfo=None)

Это работает нормально, а модульные тесты - отлично.

Затем я перешел к своему классу Logger, используя приведенный выше DateTimeStamp.getCurrentTimeStamp () для получить время записи журнала. Сейчас я пытаюсь выполнить его модульное тестирование, но что-то странное.

Мой класс Logger имеет две функции следующим образом:

def _generate_log_entry(self, log_text):
    # Get the current time and date
    log_time = DateTimeStamp.getCurrentTimeStamp()
    # Create the line to text to be logged
    log_entry = self._getLogTimeAsString(log_time) + ", " + log_text

    return log_time, log_entry

def _getLogTimeAsString(self, log_time):
    """Uses the current time to create a log timestamp"""
    return log_time.strftime("%H:%M:%S.%f")

Моя функция pytest для проверки:

def test_generate_log_entry(logger):
    """This test ensures that the line of text is generated correctly with the given input"""
    # First, let's stop time!
    DateTimeStamp.override(1968, 4, 15, 11, 23, 45, 4567)
    log_time, log_entry = logger._generate_log_entry("this is a test")
    assert log_entry == "11:23:45.004567, this is a test"

Однако тест не пройден, поскольку журнал возвращает «16: 19: 59.216502, это тест», т. Е. Он использует мое текущее время / дату, а не переопределенное время / дату.

AssertionError: assert '16:32:47.916...his is a test' == '11:23:45.0045...his is a test'

Похоже, что класс Logger использует другую версию класса DateTimeStamp stati c, отличную от той, которую использует PyTest? Это правильное поведение? Если да, то как я могу использовать мой класс stati c DateTimeStamp для модульного тестирования, если другие классы игнорируют мои изменения?

Для дополнительной отладки я изменил функцию теста на:

def test_generate_log_entry(logger):
    """This test ensures that the line of text is generated correctly with the given input"""
    # First, let's stop time!
    print("Before Time", DateTimeStamp.getCurrentTimeStamp())
    DateTimeStamp.override(1968, 4, 15, 11, 23, 45, 4567)
    print("Override Time", DateTimeStamp.getCurrentTimeStamp())
    log_time, log_entry = logger._generate_log_entry("this is a test")
    print("Log Time!", log_time)
    print("After Time", DateTimeStamp.getCurrentTimeStamp())
    assert log_entry == "11:23:45.004567, this is a test"

Это показывает мне:

Before Time    2020-03-26 17:02:32.066054
Override Time  1968-04-15 11:23:45.004567
Log Time!      2020-03-26 17:02:32.066054
After Time     1968-04-15 11:23:45.004567

Почему, черт возьми, класс Logger не использует мою переопределенную метку времени?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...