Вывод: разделение тестовых модульных и интеграционных тестов
я унаследовал нагрузку теста Junit, но эти тесты (кроме большинства не работающих) представляют собой смесь фактического модульного теста и интеграционных тестов (требующих внешних систем, БД и т. д.).
поэтому я пытаюсь придумать способ, чтобы на самом деле отделить их, так что я могу запустить модульный тест красиво и быстро и интеграционные тесты после этого.
опции..
разделить их на отдельные справочники.
перейти к Junit4 (от v3) и аннотировать классы, чтобы разделить их.
используйте соглашение об именовании файлов, чтобы сказать, что такое класс, т. е. AdapterATest и
AdapterAIntergrationTest.
3 есть проблема, что Eclipse имеет возможность "запустить все тесты в выбранном проекте / пакете или папке". Поэтому было бы очень сложно просто запустить интеграционные тесты.
2: рискует, что разработчики могут начать писать интеграционные тесты в классах модульных тестов, и это просто становится грязным.
1: Кажется, самое аккуратное решение, но моя интуиция говорит, что там должно быть лучшее решение.
Итак, это мой вопрос, как вы разбиваете интеграционные тесты и правильные модульные тесты?
6 ответов:
в настоящее время я использую отдельные каталоги из-за организационной политики (и наследие Junit 3), но я хочу перейти к аннотациям сам теперь я нахожусь на Junit 4.
Я бы не слишком беспокоился о том, что разработчики помещают интеграционные тесты в ваши классы модульных тестов - добавьте правило в свои стандарты кодирования, если это необходимо.
Мне интересно узнать, какие другие решения могут быть помимо аннотаций или физического разделения классов..
вы можете разделить их очень легко, используя категории JUnit и Maven.
это очень кратко ниже путем разделения модульных и интеграционных тестов.
Определить Интерфейс Маркера
Первым шагом в группировке теста с использованием категорий является создание интерфейса маркера.этот интерфейс будет использоваться для пометки всех тестов, которые вы хотите запустить как интеграцию тесты.
public interface IntegrationTest {}
отметьте свои тестовые классы
добавьте аннотацию категории в верхнюю часть тестового класса. Он принимает имя вашего нового интерфейса.
import org.junit.experimental.categories.Category; @Category(IntegrationTest.class) public class ExampleIntegrationTest{ @Test public void longRunningServiceTest() throws Exception { } }
Настройка Модульных Тестов Maven
Красота этого решения заключается в том, что на самом деле ничего не меняется для единичного теста.мы просто добавляем некоторую конфигурацию в плагин maven surefire, чтобы сделать его игнорируйте любые интеграционные тесты.
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.11</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.12</version> </dependency> </dependencies> <configuration> <includes> <include>**/*.class</include> </includes> <excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups> </configuration> </plugin>при выполнении теста mvn clean будут выполняться только ваши немаркированные модульные тесты.
Настройка Интеграционных Тестов Maven
Опять же конфигурация для этого очень проста.для выполнения только интеграционных тестов используйте следующее:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.11</version> <dependencies> <dependency> <groupId>org.apache.maven.surefire</groupId> <artifactId>surefire-junit47</artifactId> <version>2.12</version> </dependency> </dependencies> <configuration> <groups>com.test.annotation.type.IntegrationTest</groups> </configuration> </plugin>если вы обернете это в профиль с id
IT, вы можете работать только быстрые тесты с помощьюmvn clean install. Чтобы запустить только интеграционные / медленные тесты, используйтеmvn clean install -P IT.но чаще всего, вы хотите, чтобы запустить быстрые тесты по умолчанию и все тесты
-P IT. Если это так, то вы должны использовать трюк:<profiles> <profile> <id>IT</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <excludedGroups>java.io.Serializable</excludedGroups> <!-- An empty element doesn't overwrite, so I'm using an interface here which no one will ever use --> </configuration> </plugin> </plugins> </build> </profile> </profiles>как вы можете видеть, я исключаю тесты, которые аннотированы с
java.io.Serializable. Это необходимо, потому что профиль унаследует конфигурацию по умолчанию плагина Surefire, поэтому даже если вы говорите<excludedGroups/>или<excludedGroups></excludedGroups>, стоимостьюcom.test.annotation.type.IntegrationTestбудет использоваться.вы также не можете использовать
noneтак как это должен быть интерфейс на пути к классам (Maven проверит это).Примечания:
- зависимость к
surefire-junit47необходимо только тогда, когда Maven не переключается на JUnit 4 runner автоматически. ИспользуяgroupsилиexcludedGroupsэлемент должен сработать выключатель. посмотреть здесь.- большая часть кода выше была взята из документации для Maven Failsafe plugin. Смотрите раздел " Использование категорий JUnit" на этой странице.
- во время моих тестов, я обнаружил, что это даже работает, когда вы используете
@RunWith()аннотации для запуска наборов или тестов на основе Spring.
мы используем плагин maven Surefire для запуска модульных тестов и плагин Maven Failsafe для запуска интеграционных тестов. Модульные тесты следуют за
**/Test*.java **/*Test.java **/*TestCase.javaсоглашения об именах, интеграционные тесты -**/IT*.java **/*IT.java **/*ITCase.java. Так это на самом деле ваш вариант номер три.в нескольких проектах мы используем TestNG и определяем различные группы тестов для интеграционных/модульных тестов, но это, вероятно, не подходит для вас.
Я бы переехал в Junit4 только для того, чтобы иметь его:)
вы можете разделить их на различные наборы тестов. Я не знаю, как они организованы в Junit3, но в Junit4 должно быть легко создать наборы тестов и поместить все реальные модульные тесты в один из них, а затем использовать второй набор для интеграционных тестов.
теперь определите конфигурацию запуска для обоих наборов в eclipse, и вы можете легко запустить один набор. Эти комплекты также могут быть запущены из автоматизированный процесс, позволяющий запускать модульные тесты каждый раз при изменении источника и, возможно, совместные испытания (если они действительно большие) только один раз в день или раз в час.
используя IfProfileValue весна аннотация позволяет достичь этого без требуется плагин maven или конфигурация.
аннотировать классы или методы теста интеграции с помощью IfProfileValue
import org.springframework.test.annotation.IfProfileValue; @IfProfileValue(name="test-groups", value="integration") public class ExampleIntegrationTest{ @Test public void longRunningServiceTest() throws Exception { } }для запуска только с помощью модульных тестов:
mvn clean testдля запуска с помощью интеграционного теста и модульных тестов:
mvn clean test -Dtest-groups=integrationкроме того, "выполнить все тесты" в IDE будет выполняться только модульный тест. Добавить
-Dtest-groups=integrationк аргументам VM для выполнения интеграционных и модульных тестов.
нет ни одного правильного ответа. Как вы уже объяснили, есть несколько способов сделать это, которые будут работать. Я сделал как схему именования файлов, так и разделение вещей на разные каталоги.
похоже, что разделение вещи на разные каталоги может работать лучше для вас, и это кажется мне немного яснее, поэтому я склоняюсь к этому.
Я не думаю, что буду пробовать аннотации, потому что это кажется мне более мелкозернистым. Ты действительно хочешь этих двоих? типы тестов, смешанных вместе в одном файле? Я бы не стал.
Comments