Junit: влияние forkMode = "один раз" на правильность теста
Я хотел бы сократить время, затрачиваемое нашей сборкой (используя ant) для запуска тестов.
В настоящее время я использую по умолчанию forkMode
, который открывает новый vm для каждого тестового класса (perTest
).
Я собираюсь переключиться на forkMode="once"
, но я не уверен, что это как-то сочтет тесты и, возможно, даст мне ложные положительные и/или ложные отрицательные результаты после запуска моих тестов.
Вопросы:
-
Будет ли каждый тестовый пример получить новый ClassLoader, чтобы все статические ссылки из предыдущих прогонов больше не были доступны/видимы?
-
Существуют ли другие вещи, которые приводят к тестированию зависимости/сочетания методов тестирования, которые могут изменить поведение (помимо загрузки загружаемой библиотеки, которую я не использую)
- Как насчет сбора/завершения сборки мусора, они запускаются после каждого теста? (Я не полагаюсь на них, но я просто хочу получить полную картину).
UPDATE
В соответствии с текущими ответами кажется, что junit всегда использует один загрузчик классов между всеми тестовыми примерами на vm/fork при использовании forkMode.
(поэтому forkMode = "once" действительно означает наличие одного загрузчика классов для всех тестов)
У этого есть много преимуществ (более быстрые тесты и может привести к сбоям тестов из-за статической связи), но также и некоторые недостатки (статическая связь, которая будет работать только при использовании общего загрузчика классов → false positive)
Ответы
Ответ 1
- Тест-бегун будет эффективно создавать один комплект всех ваших тестов и запускать их - чтобы задействовался только один загрузчик классов.
- Да, это означает, что статические данные будут разделяться между тестами, которые иногда могут быть удобными, но заставят вас сократить статическую связь между предложениями, что хорошо.
- Обычно нет явного GC, но вы можете сделать свой собственный.
Как правило, все ваши тесты в одной виртуальной машине - это хорошо. Это заставляет вас смотреть на статическую связь и намного быстрее. Реально, это также способ, которым ваша IDE будет запускать их, и это действительно так, как следует запускать тесты - как можно ближе к тому, как вы компилируете.
Ответ 2
Обратите внимание, что режим по умолчанию открывает новую виртуальную машину для каждого тестового примера (то есть класс) не для каждого теста (т.е. метода). В приложении, которое я тестирую в настоящее время, возникают проблемы, возникающие при повторном использовании виртуальной машины для более чем одного теста: объекты и состояние оставлены после более ранних тестов и перестают работать позже. Это не может быть проблемой, если ваше приложение хорошо структурировано и ваши тесты строго автономны. Я сомневаюсь, что сборка мусора запускается автоматически после каждого теста: как правило, трудно гарантировать, что она будет вызываться в любой момент времени в любом случае.
Ответ 3
Глядя на запись в блоге Stefan об этом я бы рискнул догадаться:
- вы получите только один загрузчик классов для forkMode = "once"
- у вас больше не будет доступа к среде Ant
- GC будет выполняться внутри порожденного GC (если forceMode = "once" ), и это означает, что он НЕ после каждого теста.