Подтвердить что ты не робот

Junit: влияние forkMode = "один раз" на правильность теста

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

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

Вопросы:

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

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

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


UPDATE

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

У этого есть много преимуществ (более быстрые тесты и может привести к сбоям тестов из-за статической связи), но также и некоторые недостатки (статическая связь, которая будет работать только при использовании общего загрузчика классов → false positive)

4b9b3361

Ответ 1

  • Тест-бегун будет эффективно создавать один комплект всех ваших тестов и запускать их - чтобы задействовался только один загрузчик классов.
  • Да, это означает, что статические данные будут разделяться между тестами, которые иногда могут быть удобными, но заставят вас сократить статическую связь между предложениями, что хорошо.
  • Обычно нет явного GC, но вы можете сделать свой собственный.

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

Ответ 2

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

Ответ 3

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

  • вы получите только один загрузчик классов для forkMode = "once"
  • у вас больше не будет доступа к среде Ant
  • GC будет выполняться внутри порожденного GC (если forceMode = "once" ), и это означает, что он НЕ после каждого теста.