Статьи

OSGi Testsuite: знакомство с фильтрами классов

OSGi Testsuite — это тестер JUnit, который собирает динамические тестовые классы для выполнения. Он был опубликован моим коллегой Рюдигером около года назад и уже доказал свою полезность в некоторых проектах. Однако для gonsole нам пришлось использовать некрасивое исправление, потому что поддерживается только версия 1.0 .*Test соответствия постфикса для имен тестовых классов.

Я решил эту проблему с версией 1.1, введя аннотацию @ClassnameFilters которая использует регулярные выражения для сопоставления произвольных шаблонов имен. Этот пост объясняет вкратце, как это работает.

OSGi Testsuite

OSGi Testsuite предоставляет средство запуска тестов JUnit BundleTestSuite которое можно использовать для запуска всех тестов в пределах определенного количества пакетов OSGi. Чтобы использовать его, аннотируйте класс с помощью @RunWith(BundleTestSuite.class) и указывайте комплекты с помощью @TestBundles({"bundle.1", ...}) . При запуске JUnit обработает все классы в перечисленных комплектах, имена которых заканчиваются на 'Test' .

1
2
3
@RunWith( BundleTestSuite.class )
@TestBundles( { "org.example.bundle1", "org.example.bundle2" } )
public class MasterTestSuite {}

К сожалению, фиксация тестового постфикса оказалась слишком негибкой. В gonsole мы используем разные постфиксы для модульных и интеграционных тестов. И мы не хотим, чтобы модульные тесты выполнялись в рамках запуска OSGi Testsuite. Но это различие невозможно с версией 1.0.

ClassnameFilters

Вдохновленный ClasspathSuite (который работает аналогично OSGi Testsuite на простых тестах JUnit), я представил аннотацию @ClassnameFilters . Это позволяет определять фильтры на основе регулярных выражений для соответствия произвольным шаблонам имен тестов:

1
2
3
4
@RunWith( BundleTestSuite.class )
@TestBundles( { "org.example.bundle1", "org.example.bundle2" } )
@ClassnameFilters( { ".*ITest" } )
public class IntegrationTestSuite {}

Обработка примера включала бы все тесты классов в перечисленных пакетах, имена которых заканчиваются на постфикс 'ITest' . Обратите внимание, что классы с простым постфиксом 'Test' не будут обрабатываться.

Кроме того, можно указать шаблоны исключения , используя начальный символ '!' :

1
2
3
4
@RunWith( BundleTestSuite.class )
@TestBundles( { "org.example.bundle1", "org.example.bundle2" } )
@ClassnameFilters( { ".*ITest", "!.*FooITest" } )
public class IntegrationTestSuite {}

Данный пример теперь будет выполнять все тесты классов в перечисленных пакетах, имена которых заканчиваются 'ITest' постфикс 'ITest' за исключением классов, имена которых заканчиваются на «FooITest». Достаточно просто, не правда ли?

Вывод

В OSGi Testsuite был добавлен механизм фильтрации для динамического выполнения тестовых классов, который соответствует произвольным шаблонам имен. Спецификация фильтра легко выполняется с ClassnameFilters аннотации ClassnameFilters и регулярных выражений.

Код доступен по публичной лицензии Eclipse и размещен на GitHub:

https://github.com/rherrmann/osgi-testsuite

Последнюю стабильную версию можно получить из этого репозитория p2:

http://rherrmann.github.io/osgi-testsuite/repository

Ссылка: OSGi Testsuite: Представляем Classname Filters от нашего партнера JCG Фрэнка Аппеля в блоге Code Affine .