Скорость выполнения модульного теста (сколько тестов в секунду?)

StackOverflow https://stackoverflow.com/questions/10486

  •  08-06-2019
  •  | 
  •  

Вопрос

К какой скорости выполнения вы стремитесь с помощью своих модульных тестов (# тестов в секунду)?Какой срок является слишком долгим для отдельного модульного теста?

Мне было бы интересно узнать, есть ли у людей какие-либо конкретные пороговые значения для определения того, являются ли их тесты слишком медленными, или это просто когда трения из-за долго работающего набора тестов берут верх?

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

Примечание:очевидно, что интеграционные тесты - это опять же другое дело.Строго говоря, речь идет о модульных тестах, которые необходимо запускать как можно чаще.


Обзор ответов: Спасибо за отличные ответы на данный момент.Большинство советов, по-видимому, таковы: не беспокойтесь о скорости - сосредоточьтесь на качестве и просто выборочно запускайте их, если они слишком медленные.Ответы с конкретными цифрами включали в себя стремление к <10 мс до 0,5 и 1 секунды на тест, или просто сохраняя весь набор обычно выполняемых тестов менее чем за 10 секунд.

Не уверен, правильно ли отмечать один из них как "принятый ответ", когда все они полезны :)

Это было полезно?

Решение

Все модульные тесты должны выполняться менее чем за секунду (то есть все модульные тесты вместе взятые должны выполняться за 1 секунду).Теперь я уверен, что у этого есть практические ограничения, но у меня был проект с 1000 тестами, которые выполняются так быстро на ноутбуке.Вам действительно нужна такая скорость, чтобы ваши разработчики не боялись рефакторинга какой-то основной части модели (например, позвольте мне пойти выпить кофе, пока я провожу эти тесты ... через 10 минут он возвращается).

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

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

Другие советы

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

Цель - 100 тестов в секунду.Вы доберетесь туда, следуя указаниям Майкла Фезера. правила проведения модульных тестов.

Важный момент, возникший в прошлом СИТКОН дискуссия заключается в том, что если ваши тесты выполняются не так быстро, вполне вероятно, что вы не получаете преимуществ модульного тестирования при проектировании.

Я, как правило, больше сосредотачиваюсь на удобочитаемости моих тестов, чем на скорости.Тем не менее, я все еще стараюсь делать их достаточно быстро.Я думаю, что если они выполняются порядка миллисекунд, то все в порядке.Если они выполняются по секунде или больше за тест...тогда вы, возможно, делаете что-то, что должно быть оптимизировано.

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

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

В настоящее время мы проводим 270 тестов примерно за 3 с чем-то секунды.Вероятно, существует около 8 тестов, которые выполняют ввод-вывод файлов.

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

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

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

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

Точка данных - Регрессионные тесты Python

Вот цифры на моем ноутбуке для запуска "make test" для Python 2.5.2:

  • количество тестов:3851 (приблизительно)
  • время выполнения:9 мин, 6 сек
  • скорость выполнения:7 тестов в секунду

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

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

Там был один хорошая статья по этому поводу от Power Of Two games авторы Единичный тест++.

Сколько времени слишком много для отдельного модульного теста ?

Я бы сказал, что это зависит от скорости компиляции.Обычно тесты выполняются при каждой компиляции.Цель модульного тестирования - не замедлить работу, а донести сообщение "ничего не сломано, продолжай" (или "что-то сломалось, ОСТАНОВИСЬ").

Я не беспокоюсь о скорости выполнения теста до тех пор, пока это не начнет раздражать.

Опасность заключается в прекращении выполнения тестов, потому что они слишком медленные.

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

Первое, что нужно сделать, это выяснить, почему они работают слишком медленно, и проблема в модульных тестах или в тестируемом коде?

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

Некоторые фреймворки обеспечивают автоматическое выполнение определенных модульных тестов на основе эвристики, такой как время последнего изменения.Для Ruby и Rails автотестирование обеспечивает гораздо более быстрое и отзывчивое выполнение тестов - когда я сохраняю модель Rails app/models/foo.rb, соответствующие модульные тесты в test/unit/foo_test.rb убегай.

Я не знаю, существует ли что-то подобное для других платформ, но это имело бы смысл.

Одно из самых важных правил, касающихся модульных тестов, заключается в том, что они должны выполняться быстро.

Какой срок является слишком долгим для отдельного модульного теста?

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

К какой скорости выполнения вы стремитесь с помощью своих модульных тестов (# тестов в секунду)?

Вы должны стремиться к тому, чтобы каждый тест выполнялся порядка миллисекунд, все, что превышает 1 секунду, вероятно, тестирует слишком много.

В настоящее время у нас есть около 800 тестов, которые выполняются менее чем за 30 секунд, примерно 27 тестов в секунду.Это включает в себя время на запуск мобильного эмулятора, необходимое для их запуска.Большинство из них занимают от 0 до 5 мс (если я правильно помню).

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

У нас также есть настраиваемый лимит времени ожидания, установленный на 5 секунд - все, что займет больше времени, завершится неудачей.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top