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

Использовать Guava.

import com.google.common.reflect.TypeToken;
import java.lang.reflect.Type;

public class GenericClass {
  private final TypeToken typeToken = new TypeToken(getClass()) { };
  private final Type type = typeToken.getType(); // or getRawType() to return Class

  public Type getType() {
    return type;
  }

  public static void main(String[] args) {
    GenericClass example = new GenericClass() { };
    System.out.println(example.getType()); // => class java.lang.String
  }
}

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

Примечание: для этого необходимо создать экземпляр подкласса в GenericClass, чтобы он мог привязать параметр типа правильно. В противном случае он просто вернет тип как T.

20
задан David Tchepak 9 January 2009 в 01:32
поделиться

10 ответов

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

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

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

20
ответ дан 30 November 2019 в 00:35
поделиться

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

4
ответ дан 30 November 2019 в 00:35
поделиться

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

Вот являются числами на моем ноутбуке для выполнения, "делают тест" для Python 2.5.2:

  • количество тестов: 3851 (приблизительно)
  • время выполнения: 9 минут, 6 секунд
  • уровень выполнения: 7 тестов / секунда
1
ответ дан 30 November 2019 в 00:35
поделиться

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

Медленные тесты только становятся проблемой, поскольку система назревает и заставляет сборку занимать часы, в которую точку Вы более вероятно сталкиваетесь с проблемой большого количества вида медленных тестов, а не одного или 2 тестов, которые можно оптимизировать легко... таким образом, необходимо, вероятно, обратить внимание СРАЗУ ЖЕ, если Вы видите много тестов рабочие сотни миллисекунд каждый (или хуже, секунды каждый), вместо того, чтобы ожидать, пока это не добирается до сотен тестов, берущих ту длинную точку (в которой точке будет действительно трудным решить проблему).

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

1
ответ дан 30 November 2019 в 00:35
поделиться

Мы в настоящее время в 270 тестах приблизительно в 3.something секунды. Существует, вероятно, приблизительно 8 тестов, которые выполняют файл IO.

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

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

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

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

1
ответ дан 30 November 2019 в 00:35
поделиться

Целью составляют 100 с тестов в секунду. Путем Вы добираетесь существует следующим Michael Feather правила модульных тестов .

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

3
ответ дан 30 November 2019 в 00:35
поделиться

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

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

0
ответ дан 30 November 2019 в 00:35
поделиться

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

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

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

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

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

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

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

0
ответ дан 30 November 2019 в 00:35
поделиться

Был хорошая статья об этом от Питания Двух игр, авторов UnitTest ++ .

0
ответ дан 30 November 2019 в 00:35
поделиться

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

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

0
ответ дан 30 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: