Как проверить, что выполнение функции Python занимает меньше определенного времени

#python #tdd

#python #tdd

Вопрос:

Я использую unittest Python.

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

  1. обычно ли это делается в TDD, писать тесты, которые завершаются неудачей, если метод / функция неэффективны, а затем реорганизовывать, чтобы сделать его более эффективным?
  2. есть ли у Python unittest простой способ сделать это?

Комментарии:

1. Я не думаю, что сбой теста на самом деле что-то значит. Это может привести к сбою по целому ряду причин, таких как разное время на другой машине, что бы ни работало в фоновом режиме и т. Д.

2. Вы можете попробовать использовать модуль timeit, чтобы узнать, сколько времени это займет, а затем написать утверждение, чтобы убедиться, что оно выполнено менее чем за x секунд.

3. Люди слишком быстро рекомендуют timeit все, что связано с синхронизацией. Цель timeit состоит в том, чтобы выделять небольшие фрагменты кода. Для реального времени реальных приложений в реальных ситуациях (когда вы хотите знать, сколько времени обычно требуется вашей функции для выполнения при реальной нагрузке, а не каково ее максимально быстрое время), временные метки на самом деле являются лучшим способом.

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

Ответ №1:

Вы можете сделать это с помощью декоратора nose @timed . Я использую его для тестирования функций с синхронизацией. Пример:

 @timed(2.1)
def test():
    func_with_timeout(timeout=2)
 

Ответ №2:

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

Что касается TDD: Вы не знаете время выполнения, так что нет, вы не можете написать тест с предположением, а затем реорганизовать код, чтобы он прошел .. если вы не работаете над чем-то очень специфичным и не имеете нефункциональных требований, таких как встроенная система, которая должна реагировать в течение 50 мс…

Комментарии:

1. Что касается ограничения по времени, то это может быть обязательным требованием. Но, может быть, вы хотите сказать, что довольно редко такое требование предъявляется к чему-то, что находится в рамках unittest, то есть к небольшим частям кода.