#python #tdd
#python #tdd
Вопрос:
Я использую unittest Python.
Я хотел бы написать тест, который гарантирует, что определенный метод завершится до определенного времени. Я могу сделать это обычным вычислением разницы между отметкой времени после и отметкой времени до, но я начал задаваться вопросом, если
- обычно ли это делается в TDD, писать тесты, которые завершаются неудачей, если метод / функция неэффективны, а затем реорганизовывать, чтобы сделать его более эффективным?
- есть ли у 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, то есть к небольшим частям кода.