2011-12-08 16 views
2

すべてのテストケースクラスを含むjavaパッケージがあります。各クラスには多くのテストケースが含まれています。各クラスは、JUnitによってロードされ、1つずつ実行されます。しかし、各クラスには共通の構成コードが含まれています。共通の構成コードは繰り返し実行され、各クラスが実行されるたびに初期化されます。 これらの初期化には多くの時間がかかります。テストケースの前に設定を一度だけロードする

これらの設定変更を最初にロードし、毎回ロードする必要がないようにテストケースを実行する方法はありますか?

答えて

2

JUnit4には@BeforeClassアノテーションがあります。

public class TestClass { 

    private static SomeConnection connection; 

    @BeforeClass 
    public static void setUp() { 
    //do common setup 
    connection = new SomeConnection(); 
    } 

    @Test 
    public void testSomething() { } 

    @Test 
    public void testSomethingElse() { } 

    @AfterClass 
    public static void tearDown() { 
    //do teardown operations 
    connection.close(); 
    } 

} 

@BeforeClassでマークされたメソッドは一度だけ実行されます: はちょうどこのような何かを行います。 JUnit4を使用していることを確認してください。

更新:
はまた、それが静的でなければならないこと、注意してください、と@ChristopheRoussyが述べたように、あなたはあなたの一般的なセットアップを破壊するために@AfterClassを使用することができます。

+2

@AfterClassの使用を検討する –

2

クラス内のテストが実行される前に実行されるstaticメソッドを作成できます。また

@BeforeClass 
public static void ranOnlyOnce() { 
    /*...*/ 
} 

、あなたのテストのすべて前に一度これを実行したい場合は、グループあなたのスイートでテストし、このクラスでは、このメソッドを入れて、代わりにスイートを実行するためのJUnitを使用する必要がありますテストの

@RunWith(Suite.class) 
@SuiteClasses(value = { Test1.class, ... , Testn.class }) 
public class AllTests { 
    @BeforeClass 
    public static void beforeAllTests() { 
     /*...*/ 
    } 
} 

注釈は、Junit 4+でのみ使用できます。

0

多くの可能性があります。 MatyasとjFreneticが提案したように、最初に最も簡単なのは@BeforeClass@AfterClassです。これは、テストクラスがセットアップコードを共有していない場合に行う最も簡単な方法です。

クラスが同じセットアップとティアダウンを共有している場合は、TestRuleを使用してください。具体的にはExternalResourceを使用します。これにより、各クラスの前後にコードを実行できます。これと@BeforeClass@AfterClassの違いは、同じクラスを使用しているため、コードをより簡単に共有できることです。例:

@RunWith(Suite.class) 
@SuiteClasses({A.class, B.class, C.class}) 
public class UsesExternalResource { 
    public static Server myServer= new Server(); 

    @ClassRule 
    public static ExternalResource resource= new ExternalResource() { 
     @Override 
     protected void before() throws Throwable { 
      myServer.connect(); 
     }; 

     @Override 
     protected void after() { 
      myServer.disconnect(); 
     }; 
    }; 
} 

これはテストクラスでも同様に動作しますので、異なるクラスに対して異なる設定が可能です。

関連する問題