Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

По-моему, это не может быть так сложно. Поэтому попробуйте:

0. Импорт

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

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

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

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

Все методы, начинающиеся с public void test, должны сопровождаться аннотацией @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
})

Заключение

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

Ответ 2

Вот фактические регулярные выражения, которые я использовал для выполнения предложений 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 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 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 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

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

Ответ 3

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

https://github.com/FranciscoBorges/junit3ToJunit4

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

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

Хорошая почта. Я выполнил обновление с помощью 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

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