web-dev-qa-db-ja.com

junitテスト実行メソッドを順番に作成する方法

みんな!新しい質問があります。さまざまなキャッシュマネージャーを使用してキャッシュにデータを追加していますが、問題に直面しています。 junitとspringを使用しています。テストを実行すると、テストメソッドがランダムに実行されますが、それらを順番に実行する必要があります。どうやってするの??ここにいくつかのコードと証明するコンソール出力があります:

サービスクラス:

@Service("HelloCache")
public class CacheServiceImpl implements CacheInterface {
    @Autowired
    @Qualifier("memcachedClient")
    private MemcachedClient mBean;

    public void Add(String key, Object object) {
        mBean.set(key, 12, object);
    }

    public void Get(String key) {
        mBean.get(key);
    }

    public void Delete(String key) {
        mBean.delete(key);
    }    
}

ここにテストがあります:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "file:src/main/Java/spring.xml")
public class UsingMemcachedTest extends TestCase {
    @Autowired
    @Qualifier("HelloCache")
    private CacheInterface emcached;
    private byte[][] i = new byte[2500][3000];
    private String key = "j";
    @Test
    public void testAddBulkObjects() {
        System.out.println("");
        System.out.println("This is async BULK adding test");
        long time = System.currentTimeMillis();
        for (int k=1; k<=1000; k++) {
            emcached.Add(key+k, i);
        }
        long time2 = System.currentTimeMillis();
        long timeE=time2-time;
        System.out.println("Vremya add BULK objects: " + timeE);
        System.out.println("");
    }

    @Test
    public void testGetBulkObjects() {
        System.out.println("");
        System.out.println("This is getting BULK objects test");
        long time = System.currentTimeMillis(); 
        for (int k=1; k<=1000; k++) {
            emcached.Get(key+k);
        }
        long time2 = System.currentTimeMillis();
        long timeE=time2-time;
        System.out.println("Vremya Get object: " + timeE);
        System.out.println("");
    } 

    @Test
    public void testDeleteBulkObjects() {
        System.out.println("");
        System.out.println("This is deleting BULK objects test");
        long time = System.currentTimeMillis();
        for (int k=1; k<=1000; k++) {
            emcached.Delete(key+k);
        }
        long time2 = System.currentTimeMillis();
        long timeE=time2-time;
        System.out.println("Vremya delete object: " + timeE);
        System.out.println("");
    }

そして出力:

This is deleting BULK objects test
Vremya delete object: 137


This is getting BULK objects test
Vremya Get object: 703


This is async BULK adding test
Vremya add BULK objects: 87681

助けてください!! =)

12
PAcan

JUnitは、テストが実行される順序に関して何の約束もしません。順序は、テストが実行される環境とコンテキストによって異なります。

このため(そしてその他の理由で)、テストの動作に影響を与える順序付けは非常に悪いテスト設計と見なされます。 @Before goを使用して、白紙の状態で作業し、特定のテストのセットアップをそのテストの一部として行うことができます。

次の質問に対する受け入れられた回答は、良い説明といくつかの有用なリソースへのリンクを提供します: JUnit4で特定の順序でテストメソッドを実行する方法?

9
Aurand

バージョン4.11以降では、アノテーションを使用して実行順序を指定したり、メソッド名で順序付けしたりできます。

import org.junit.Test;
import org.junit.FixMethodOrder;
import org.junit.runners.MethodSorters;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MyTest {

    @Test
    public void test1Create() {
        System.out.println("first");
    }

    @Test
    public void test2Update() {
        System.out.println("second");
    }
}

JUnit 4.11リリースノートを参照

46

JUnit 4.11は Test Execution Order を制御できるいくつかの素晴らしいものを追加しました

4
Hiro2k