Как написать бегун JUnit, который запускает метод @BeforeCategory перед TestCase в @Category?

1

Я пытаюсь написать конкретный JUnit Runner, и я не нашел хороших учебников/примеров в Интернете.

Требования следующие:

  • У меня будут некоторые категоризированные тесты (например, A.java из категории catA, B.java из категории catA, C.java из категории catC
  • Каждый тест имеет единственный метод @BeforeClass который необходимо запустить, если тест запускается самостоятельно
  • При запуске всех тестов из той же категории метод @BeforeClass должен запускаться только один раз.
  • Каждый метод @Test из теста Junit также имеет @Before и @After.

При этом я рассмотрел различные варианты.

Я начал с создания Test Suites который будет представлять мои тестовые категории, используя предоставленный junit Suite Runner. (@RunWith(Suite.class)). Вам необходимо вручную предоставить Tests в пакете, используя @SuiteClasses() который раздражает.

Итак, я посмотрел на ClasspathSuite Runner, который позволяет помещать все классы из класса в каждый набор и фильтровать их после @Category

Он также предоставляет аннотацию @BeforeSuite которая запускается один раз при запуске пакета.

=> Все почти идеально.

  • Когда запускается один тест, запускается @BeforeClass из этого теста
  • Когда Test Suite запускается, правильные Tests запускаются (благодаря @Category), то @BeforeSuite вызывается только один раз, но @BeforeClass каждого теста также называется, где он не должен.

=> Все это заставило меня задуматься о внедрении моего собственного Бегуна. Я попробовал расширить ClasspathSuite Runner, но он не предназначен для этого. Я попытался расширить ассортимент Suite Runner, но мне это не удалось.

Не могли бы вы помочь мне понять, как реализовать эти требования в JUnit Runner?

  • 0
    Можете ли вы более конкретно рассказать о том, какие у вас были проблемы с расширением раннеров ClasspathSuite и Suite ? Кроме того, не org.junit.experimental.categories.Categories делать то, что вы хотите?
Теги:
junit
junit-runner

1 ответ

1
Лучший ответ

Как насчет этого, не написав бегуна? Вместо этого напишите метод @BeforeClass котором используется одиночный список, который записывает каждый метод перед категорией, который был запущен в текущем тестовом прогоне, и знает, как запускать все методы перед категорией (каждый, вероятно, в своем классе). Метод @BeforeClass определяет свой класс @Category, проверяет список и

  • ничего не делает, если этот @Category категории предшествующей категории уже запущен или
  • запускает метод перед категорией и замечает в списке, что @Category метод @Category был запущен.

Лучше не требовать настраиваемого бегуна, потому что он будет работать в средах, которые предоставляют свои собственные бегуны, такие как IDE и серверы непрерывной интеграции.

  • 0
    Хороший вопрос о предоставлении решения без собственного бегуна. Отлично работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню