Тестовый вызов: как настроить общий набор тестов - PullRequest
6 голосов
/ 29 ноября 2011

Есть ли способ узнать в тестовом классе JUnit 4, был ли этот класс инициирован Test-Suite?У меня есть глобальные вещи, которые я хочу запустить перед всеми тестами (в отношении БД в памяти), поэтому я подумал сделать это в тестовом костюме.Тем не менее, я все еще хочу иметь возможность инициировать один тест за раз без Test-Suit, поэтому мне нужно знать, нужно ли мне инициализировать глобальные вещи в части @Before теста ... Кто-нибудь знаетесли это возможно ?

Ответы [ 3 ]

6 голосов
/ 29 ноября 2011

Есть несколько способов добиться этого.Самый простой и простой способ - создать «тест», который запускается в начале и в конце комплекта, который устанавливает базу данных, а затем устанавливает глобальный флаг.В ваших тестах @Before и @After вы проверяете этот флаг и, если необходимо, выполняете настройку / разрыв.

@RunWith(Suite.class)
@SuiteClasses({SetupTest.class, RealTest.class, TeardownTest.class});

Это простейшее решение, но оно не очень хорошее, поэтому более подходящее решение будетиспользовать TestRule .Посмотрите на расширение ExternalResource .Это реализует логику до и после, которая окружает ваши методы тестирования.Это позволит вам отделить ваши методы @Before и @After, чтобы везде использовать один и тот же код.

Затем, для вашего пакета, вам также необходимо реализовать логику до / после.К сожалению, класс, аннотированный @RunWith (Suite.class), фактически не создается, поэтому вы не можете использовать конструктор этого класса, но вы можете расширить Suite .В зависимости от того, как вы это запустите, вам потребуется реализовать один из конструкторов, используя в качестве примера @RunWith:

public class MySuite extends Suite {
    /**
     * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code>
     * 
     * @param klass the root class
     * @param builder builds runners for classes in the suite
     * @throws InitializationError
     */
    public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
        this(builder, klass, getAnnotatedClasses(klass));
        // put your global setup here
        // set global variable
    }
}

Затем запустите ваш набор тестов с помощью

@RunWith(MySuite.class)

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

Если вы хотите большей гибкости (скажем, выполнение кода установки только для определенных методов), то посмотрите мой ответ на Как определить правило метода JUnit влюкс .

2 голосов
/ 29 ноября 2011

Я бы использовал примечания JUnit @ BeforeClass и @ AfterClass , чтобы указать методы для выполнения этого типа работы.

Из Javadoc @BeforeClass:

Иногда несколько тестов должны использовать вычислительно дорогостоящие настройки (например, вход в базу данных).Хотя это может поставить под угрозу независимость тестов, иногда это является необходимой оптимизацией.Аннотирование открытого статического метода void no-arg с помощью @BeforeClass заставляет его запускаться один раз перед любым из тестовых методов в классе.Методы @BeforeClass суперклассов будут запускаться до тех, которые используются текущим классом.

0 голосов
/ 21 июня 2013

Вы можете поместить некоторый код @BeforeClass в каждый набор тестов, который делегирует вспомогательный класс, который выполняет общую установку.Вспомогательный класс может иметь static boolean, который записывает, была ли настройка уже выполнена.Если это уже сделано, вспомогательный класс ничего не сделает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...