В JUnit 3 я мог получить имя текущего запущенного теста, например:
public class MyTest extends TestCase
{
public void testSomething()
{
System.out.println("Current test is " + getName());
...
}
}
который напечатал бы "Текущий тест - testSomething".
Есть ли какой-либо из готовых или простой способ сделать это в JUnit 4?
Фон: Очевидно, я не хочу просто печатать название теста. Я хочу загрузить специфичные для теста данные, которые хранятся в ресурсе с тем же именем, что и тест. Вы знаете, соглашение о конфигурации и все такое.
java
unit-testing
junit
Дэйв Рэй
источник
источник
Ответы:
JUnit 4.7 добавил эту функцию, кажется, используя TestName-Rule . Похоже, это даст вам имя метода:
источник
@Rule
раньше@Before
- я новичок в JUnit и зависел отTestName
моего@Before
без каких-либо трудностей.JUnit 4.9.x и выше
Начиная с JUnit 4.9,
TestWatchman
класс устарел в пользуTestWatcher
класса, который имеет вызов:Примечание: содержащий класс должен быть объявлен
public
.JUnit 4.7.x - 4.8.x
Следующий подход напечатает имена методов для всех тестов в классе:
источник
public
поле?JUnit 5 и выше
В JUnit 5 вы можете внедрить,
TestInfo
что упрощает предоставление метаданных теста для методов тестирования. Например:Подробнее: руководство пользователя JUnit 5 , TestInfo javadoc .
источник
Попробуйте это вместо этого:
Вывод выглядит так:
ПРИМЕЧАНИЕ: это НЕ работает, если ваш тест является подклассом TestCase ! Тест выполняется, но код @Rule просто никогда не запускается.
источник
Подумайте об использовании SLF4J (Simple Logging Facade для Java), предоставив некоторые аккуратные улучшения с использованием параметризованных сообщений. Объединение SLF4J с реализациями правил JUnit 4 может обеспечить более эффективные методы ведения журнала класса тестирования.
источник
Сложным способом является создание собственного Runner путем создания подкласса org.junit.runners.BlockJUnit4ClassRunner.
Затем вы можете сделать что-то вроде этого:
Затем для каждого тестового класса вам нужно добавить аннотацию @RunWith (NameAwareRunner.class). В качестве альтернативы, вы можете поместить эту аннотацию в суперкласс Test, если вы не хотите помнить ее каждый раз. Это, конечно, ограничивает ваш выбор бегунов, но это может быть приемлемым.
Кроме того, может потребоваться немного кунг-фу, чтобы вывести текущее имя теста из Runner в вашу среду, но это по крайней мере даст вам имя.
источник
JUnit 4 не имеет никакого готового механизма для тестового случая, чтобы получить свое собственное имя (в том числе во время установки и демонтажа).
источник
источник
На основании предыдущего комментария и дальнейшего рассмотрения я создал расширение TestWather, которое вы можете использовать в своих тестовых методах JUnit:
Тестовый вспомогательный класс выглядит следующим образом:
Наслаждайтесь!
источник
ImportUtilsTest
, я получаю сообщение об ошибке, кажется, это класс регистратора, у меня есть больше информации? Спасибоисточник
Я бы посоветовал вам отделить название метода тестирования от набора тестовых данных. Я бы смоделировал класс DataLoaderFactory, который загружает / кэширует наборы тестовых данных из ваших ресурсов, а затем в вашем тестовом примере cam вызывает некоторый интерфейсный метод, который возвращает набор тестовых данных для тестового примера. Привязка тестовых данных к имени метода теста предполагает, что тестовые данные могут использоваться только один раз, тогда как в большинстве случаев я рекомендую использовать одни и те же тестовые данные в нескольких тестах для проверки различных аспектов вашей бизнес-логики.
источник
Вы можете достичь этого, используя
Slf4j
иTestWatcher
источник
В Юнит 5
TestInfo
выступает в качестве замены для правила TestName из JUnit 4.Из документации:
Чтобы получить имя метода текущего выполненного теста, у вас есть две опции:
String TestInfo.getDisplayName()
иMethod TestInfo.getTestMethod()
.Для извлечения только имени текущего метода тестирования
TestInfo.getDisplayName()
может быть недостаточно, поскольку отображаемое имя по умолчанию для этого методаmethodName(TypeArg1, TypeArg2, ... TypeArg3)
.Дублирование имен методов
@DisplayName("..")
не является хорошей идеей.В качестве альтернативы вы можете использовать
TestInfo.getTestMethod()
тот, который возвращаетOptional<Method>
объект.Если метод извлечения используется внутри метода test, вам даже не нужно проверять
Optional
переносимое значение.источник
JUnit 5 через ExtensionContext
Преимущество:
Вы получаете дополнительные функции
ExtensionContext
путем переопределенияafterEach(ExtensionContext context)
.источник