Лучший способ автоматически переносить тесты с JUnit 3 на JUnit 4?

У меня есть куча classов JUnit 3, которые расширяют TestCase и хотят автоматически перенести их на тесты JUnit4 с аннотациями, такими как @Before , @After , @Test и т. Д.
Любой инструмент, чтобы сделать это в большом пакетном запуске?

На мой взгляд, это не может быть так сложно. Итак, давайте попробуем:

0. Импорт

Вам нужно импортировать три annotations:

 import org.junit.After; import org.junit.Before; import org.junit.Test;` 

После внесения следующих изменений вам не понадобится import junit.framework.TestCase; ,

1. Аннотатный test* Методы

Все методы, начинающиеся с public void test должны предшествовать annotations @Test . Это задание выполняется с помощью регулярного выражения.

2. Аннотировать методы SetUp и TearDown

Eclipse генерирует следующий setUp() :

 @Override protected void setUp() throws Exception { } 

Должно быть заменено:

 @Before public void setUp() throws Exception { } 

То же самое для tearDown() :

 @Override protected void tearDown() throws Exception { } 

заменен на

 @After public void tearDown() throws Exception { } 

3. Избавьтесь от extends TestCase

Удалите ровно одно вхождение в файл строки

 " extends TestCase" 

4. Удалить основные методы?

Вероятно, необходимо удалить / реорганизовать существующие основные методы, которые будут выполнять тест.

5. Преобразовать метод suite() в @RunWithClass

Согласно комментарию Saua, должно быть преобразование метода suite() . Спасибо, saua!

 @RunWith(Suite.class) @Suite.SuiteClasses({ TestDog.class TestCat.class TestAardvark.class }) 

Вывод

Я думаю, это очень легко с помощью набора регулярных выражений, даже если это убьет мой мозг;)

Вот фактические регулярные выражения, которые я использовал для выполнения предложений furtelwart:

 // Add @Test Replace: ^[ \t]+(public +void +test) With: @Test\n $1 Regular Expression: on Case sensitive: on File name filter: *Test.java // Remove double @Test's on already @Test annotated files Replace: ^[ \t][email protected]\n[ \t][email protected] With: @Test Regular Expression: on Case sensitive: on File name filter: *Test.java // Remove all empty setUp's Replace: ^[ \*]+((public|protected) +)?void +setUp\(\)[^\{]*\{\s*(super\.setUp\(\);)?\s*\}\n([ \t]*\n)? With nothing Regular Expression: on Case sensitive: on File name filter: *Test.java // Add @Before to all setUp's Replace: ^([ \t][email protected]\n)?[ \t]+((public|protected) +)?(void +setUp\(\)) With: @Before\n public void setUp() Regular Expression: on Case sensitive: on File name filter: *Test.java // Remove double @Before's on already @Before annotated files Replace: ^[ \t][email protected]\n[ \t][email protected] With: @Before Regular Expression: on Case sensitive: on File name filter: *Test.java // Remove all empty tearDown's Replace: ^[ \*]+((public|protected) +)?void +tearDown\(\)[^\{]*\{\s*(super\.tearDown\(\);)?\s*\}\n([ \t]*\n)? With nothing Regular Expression: on Case sensitive: on File name filter: *Test.java // Add @After to all tearDown's Replace: ^([ \t][email protected]\n)?[ \t]+((public|protected) +)?(void +tearDown\(\)) With: @After\n public void tearDown() Regular Expression: on Case sensitive: on File name filter: *Test.java // Remove double @After's on already @After annotated files Replace: ^[ \t][email protected]\n[ \t][email protected] With: @After Regular Expression: on Case sensitive: on File name filter: *Test.java // Remove old imports, add new imports Replace: ^([ \t]*import[ \t]+junit\.framework\.Assert;\n)?[ \t]*import[ \t]+junit\.framework\.TestCase; With: import org.junit.After;\nimport org.junit.Before;\nimport org.junit.Test;\nimport static org.junit.Assert.*; Regular Expression: on Case sensitive: on File name filter: *Test.java // Remove all extends TestCase Replace: [ \t]+extends[ \t]+TestCase[ \t]+\{ With: { Regular Expression: on Case sensitive: on File name filter: *Test.java // Look for import junit.framework; Find: import junit\.framework Manually fix Regular Expression: on Case sensitive: on // Look for ignored tests (FIXME, disabled, ...) Find: public[ \t]+void[ \t]+\w+test Manually fix Regular Expression: on Case sensitive: on // Look for dummy/empty tests Find: public[ \t]+void[ \t]+test[\w\d]*\(\s*\)\s*\{\s*(//[^\n]*)?\s*\} Manually fix Regular Expression: on Case sensitive: on 

Примечание: важно сделать это в порядке, указанном выше.

Мы находимся в середине переноса достаточно большой базы кода на JUnit4. Поскольку это второй раз, когда я делаю такую ​​миграцию, я решил где-то сохранить код:

https://github.com/FranciscoBorges/junit3ToJunit4

В нем рассматриваются более угловые случаи, чем те, которые перечислены в ответах выше. Такие как:

  • вызовы TestCase.setUp() и TestCase.tearDown()
  • вызывает конструктор TestCase(String) внутри конструктора подclassа
  • вызывает методы TestCase.assert* которые переместились в Assert .
  • исправление имен пакетов junit.framework to org.junit
  • и т.д

Я не знаю инструмента, который бы сделал это в данный момент – я ожидал бы, что Eclipse предоставит некоторый плагин довольно коротко – но вы можете сбить простое исходное дерево, исследующее class Java, который сделает это за вас, если вы хотите только сделать базовое преобразование. Мне пришлось написать что-то похожее, чтобы автоматически генерировать скелетные тестовые примеры для устаревшего приложения, поэтому у меня уже есть достаточный объем кода поддержки. Вы можете использовать его.

Насколько я знаю, нет доступных средств миграции (пока). Я знаю это:

  • В прошлом году в OOPSLA в Нэшвилле была опубликована статья о миграции API, но, увы, их инструменты, похоже, не были открыто доступны. Я предоставлю ссылку на статью (хотя я считаю, что она мало полезна для вас, поскольку она довольно тяжелая теория): «Рефакторинг аннотаций: выведение преобразований для устаревших приложений» .

  • Выше я написал «нет доступного инструмента (пока)», потому что мой ученик Лея Хянсбергер в настоящее время работает над перенесенной миграцией API, а не с onyl, JUnit 4 a в JExample, а также с JUnit 3 на JUnit 4. Пожалуйста, следуйте JExample on Twitter чтобы получить уведомление, когда она выпустит первую бета-версию.

Надеюсь, эта информация поможет вам.

Хороший пост. Я выполнил обновление с помощью Netbeans со следующими строками RegEx: (строка поиска первой строки, вторая строка замены)

 public void test @Test\n public void test @Override\n.*protected void onSetUp @Before\n protected void onSetUp @Override\n.*protected void onTearDown @After\n protected void onTearDown 

Не забудьте установить флажок «Регулярное выражение»!

Давайте будем гением компьютера.