50

@BeforeTestCase を拡張する JUnit 3 クラスがたくさんあり、それらを、@After@Testなどの注釈を付けて JUnit4 テストに自動的に移行したいと考えて
います。大きなバッチ実行でこれを行うためのツールはありますか?

4

7 に答える 7

58

私の意見では、それはそれほど難しいことではありません。それでは試してみましょう:

0.輸入

3 つの注釈をインポートする必要があります。

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

次のいくつかの変更を行った後は、必要ありませんimport junit.framework.TestCase;

test*1.メソッドに注釈を付ける

で始まるすべてのメソッドの前に注釈を付ける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

ファイルごとに文字列を 1 つだけ削除する

" extends TestCase"

4. 主なメソッドを削除しますか?

おそらく、テストを実行する既存のメイン メソッドを削除/リファクタリングする必要があります。

5.suite()メソッドを@RunWithClass

saua のコメントによると、メソッドの変換が必要suite()です。ありがとう、さあ!

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

結論

たとえそれが私の脳を殺してしまうとしても、それは一連の正規表現を介して非常に簡単に行われると思います ;)

于 2009-03-24T13:19:43.750 に答える
37

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

注: 上記の順序で実行することが重要です。

于 2010-12-26T19:45:10.707 に答える
5

私たちは、かなり大きなコード ベースを JUnit4 に移行している最中です。このような移行を行うのはこれが 2 回目なので、コードをどこかに保存することにしました。

https://github.com/FranciscoBorges/junit3ToJunit4

上記の回答で列挙されたものよりも多くのコーナーケースを扱います。そのような:

  • TestCase.setUp()との呼び出しTestCase.tearDown()
  • TestCase(String)サブクラスのコンストラクター内でのコンストラクターの呼び出し
  • TestCase.assert*に移動したメソッドの呼び出しAssert
  • パッケージ名のjunit.framework修正org.junit
于 2013-05-24T09:10:08.307 に答える
3

私の知る限り、利用可能な移行ツールは (まだ) ありません。私が知っているのはこれです:

  • 昨年、ナッシュビルの OOPSLA で API の移行に関する論文が発表されましたが、残念ながらそのツールは公開されていないようです。ペーパーへのリンクを提供します(理論がかなり重いので、あえてほとんど役に立たないかもしれませんが):「アノテーションリファクタリング:レガシーアプリケーションのアップグレード変換の推論」 .

  • 上で「利用可能なツールは (まだ) ありません」と書いたのは、私の学生である Lea Hänsenberger が現在、JUnit 4 a から JExample への単独ではなく、JUnit 3 から JUnit 4 への API の自動移行に取り組んでいるためです。Twitter で JExample をフォローしてください。彼女が最初のベータ版をリリースしたときに通知を受け取る。

この情報がお役に立てば幸いです。

于 2009-03-23T09:26:18.423 に答える
3

現時点では、これを行うツールを知りません.Eclipseがプラグインをすぐに提供することを期待しています.基本的な変換を行います。レガシ アプリケーションのスケルトン テスト ケースを自動的に生成するようなものを作成する必要があったため、すでにかなりの量のサポート コードを用意しています。どうぞご利用ください。

于 2008-11-05T10:08:07.343 に答える
1

素敵な投稿。次の正規表現文字列で Netbeans を使用してアップグレードを行いました: (最初の行の検索文字列、2 番目の文字列の置換)

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

正規表現チェックボックスにフラグを立てることを忘れないでください!

于 2010-06-28T06:09:49.563 に答える