Лучший способ автоматически перенести тесты из JUnit 3 в JUnit 4? - PullRequest
45 голосов
/ 05 ноября 2008

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

Ответы [ 6 ]

54 голосов
/ 24 марта 2009

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

0. Импорт

Вам необходимо импортировать три аннотации:

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

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

1. Аннотировать test* Методы

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

2. Методы Annotate 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

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

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

Заключение

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

35 голосов
/ 26 декабря 2010

Вот фактические регулярные выражения, которые я использовал для выполнения предложений 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]+@Test\n[ \t]+@Test
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]+@Override\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]+@Before\n[ \t]+@Before
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]+@Override\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]+@After\n[ \t]+@After
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

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

4 голосов
/ 24 мая 2013

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

https://github.com/FranciscoBorges/junit3ToJunit4

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

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

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

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

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

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

3 голосов
/ 05 ноября 2008

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

1 голос
/ 28 июня 2010

Хороший пост. Я сделал обновление, используя 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

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

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