junit: влияние forkMode = "Once" на корректность теста - PullRequest
20 голосов
/ 06 июня 2011

Я бы хотел сократить время, необходимое нашей сборке (используя ant) ​​для запуска тестов. В настоящее время я использую значение по умолчанию forkMode, которое создает новый vm для каждого класса тестирования (perTest).

Я думаю о том, чтобы перейти на forkMode="once", но я не уверен, если это каким-то образом соединит тесты и, возможно, даст мне ложноположительные и / или ложноположительные результаты после выполнения моих тестов.

Вопросы:

  1. Получит ли каждый тестовый пример новый ClassLoader , чтобы все статические ссылки из предыдущих запусков больше не были доступны / не видны?

  2. Существуют ли другие вещи , которые приводят к тестовой зависимости / соединению методов тестирования, которые могут изменить поведение (помимо загрузки собственной библиотеки, которую я не использую)

  3. Как насчет сбора / завершения сборки мусора, они запускаются после каждого теста? (Я не полагаюсь на них, но я просто хочу получить полную картину)


UPDATE

Согласно текущим ответам, при использовании forkMode кажется, что junit всегда совместно использует один загрузчик классов для всех тестовых случаев на vm / fork. (поэтому forkMode = "Once" действительно означает, что для всех тестов существует один загрузчик классов)

Это имеет много преимуществ (более быстрые тесты и может привести к сбою тестов из-за статической связи), но также имеет ряд недостатков (статическая связь, которая будет работать только при использовании разделяемого загрузчика классов -> ложное срабатывание)

Ответы [ 3 ]

11 голосов
/ 08 июня 2011
  1. Бегущий по тестам эффективно создаст единый пакет всех ваших тестов и выполнит их, так что задействован только один загрузчик классов.
  2. Да, это означает, что статические данные будут передаваться между тестами, что иногда может быть полезно, но заставит вас сократить статическую связь между предложениями, что хорошо.
  3. Обычно нет явного GC, но вы можете сделать свой собственный.

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

4 голосов
/ 07 июня 2011

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

0 голосов
/ 06 июня 2011

Глядя на запись в блоге Стефана , об этом я рискну догадаться:

  1. вы получите только один загрузчик классов для forkMode = "once"
  2. у вас больше не будет доступа к среде Ant
  3. GC будет выполняться внутри порожденного GC (если forceMode = "Once"), и это означает, что это НЕ после каждого теста.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...