Как проверить конечный автомат с помощью pytest?

Я новичок в тестировании, и мне нужно найти способ тестирования конечного автомата, который я написал, похожий на этот https://code.activestate.com/recipes/577308-simple-state-machine-implementation/ с использованием pytest.

Код принимает словарь временных рядов в качестве входных данных {timestamp: value}, а затем создает новый словарь {timestamp: string}.

Вот пример одной из функций, которые определяют изменение состояния:

def state_t_high():
    global current_element, duration_timer, recovery_timer, output_series
    # print("T_HIGH")
    if current_element == number_of_elements:
        return state_done
    elif input_series[inputList[current_element]] < THRESHOLD:
        current_element += 1
        return state_normal
    elif input_series[inputList[current_element]] >= THRESHOLD and duration_timer <= TRIGGER_DUR:
        duration_timer += 1
        current_element += 1
        return state_t_high
    elif input_series[inputList[current_element]] >= THRESHOLD and duration_timer > TRIGGER_DUR:
        duration_timer += 1
        output_series[inputList[current_element]] = 'too high'
        current_element += 1
        return state_p_high

Насколько я могу судить, код работает нормально, однако я не знаю, как правильно его протестировать. Я не создал никаких классов, остальная часть кода просто загружает входной файл и затем загружает результат на сервер.

Заранее спасибо!

1 ответ

Использование глобальных переменных не подходит для тестирования. Но, конечно, вы всегда можете использовать макет и макетировать все в файле. Но это показатель того, что что-то не так с вашим кодом.

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

Я не знаю контекст вашего приложения, но попробуйте инкапсулировать глобальные элементы в класс. И попробуйте следовать методологии TDD. Начните писать тесты, сначала определяя интерфейсы.

Другие вопросы по тегам