10

アプリケーションのデータベースをテストフィクスチャに置き換える前にバックアップしたいと思います。Androidの制限のため、Junit3を使用せざるを得ません。また、@BeforeClassと@AfterClassの同等の動作を実装したいと思います。

更新:AndroidでJunit4をサポートするためのツール( Junit4Android )が追加されました。ちょっとしたごちゃごちゃですが、うまくいくはずです。

@BeforeClassと同等の機能を実現するために、静的変数を使用して、このように最初の実行時に初期化していましたが、すべてのテストを実行した後、データベースを復元できる必要があります。最後のテストがいつ実行されたかを検出する方法を考えることはできません(テストの実行順序は保証されていないと思うため)。

public class MyTest extends ActivityInstrumentationTestCase2<MainActivity> {
    private static boolean firstRun = true;

    @Override
    protected void setUp() {
        if(firstRun) {
            firstRun = false;
            setUpDatabaseFixture();
        }
    }
    ...
}
4

4 に答える 4

8

ジュニットのウェブサイトから:

setUp メソッドと TeaDown メソッドをスイートにラップしました。これは、単一の YourTestClass テストケースを実行する場合のためのものです。

public static Test suite() {
    return new TestSetup(new TestSuite(YourTestClass.class)) {

        protected void setUp() throws Exception {
            System.out.println(" Global setUp ");
        }
        protected void tearDown() throws Exception {
            System.out.println(" Global tearDown ");
        }
    };
}

すべてのテストケースに対して 1 つの setUp と tearDown のみを実行する場合は、スイートを作成し、それに testClass を追加して、スイート オブジェクトを TestSetup コンストラクターに渡します。 JUnit の哲学に違反しています。

于 2011-08-26T17:57:48.180 に答える
1

最近、私も同様の解決策を探していました。幸いなことに、私の場合、最後のテストが実行された後に JVM が終了した後です。そのため、JVM シャットダウン フックを追加することでこれを実現できました。

// Restore database after running all tests
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        restoreDatabase();
    }
});

お役に立てれば。

于 2011-08-26T18:12:54.977 に答える
0

これ (データをエレガントに処理するので、データを復元することを心配する必要はありません)は、モック オブジェクトを使用したテストの目的ではないでしょうか? Androidはモッキングをサポートしています。

Androidを嘲笑したことがないので、質問します。


私の経験とこのブログ投稿から、Android テストがスイートに作成され、InstrumentationTestRunnerによって実行される場合- ActivityInstrumentationTestCase2は、 InstrumentationTestCaseの拡張であるActivityTestCase拡張です- それらは を使用してアルファベット順に並べられるため、単に復元できます次のように、テスト名の中でアルファベットの一番下にあるメソッドを使用した DB:android.test.suitebuilder.TestGrouping.SORT_BY_FULLY_QUALIFIED_NAME

// underscore is low in the alphabet
public void test___________Restore() { 
    ... 
}

ノート:

継承されたテストはこの順序で実行されないため、注意が必要です。解決策は、継承されたすべてのテストをオーバーライドし、単純にオーバーライドから super() を呼び出すことです。これにより、すべてがアルファベット順に実行されます。

例:

// Reusable class w only one time setup and finish. 
// Abstract so it is not run by itself.
public abstract class Parent extends InstrumentationTestCase {
    @LargeTest
    public void test_001_Setup() { ... }

    @LargeTest
    public void test_____Finish() { ... }
}

/*-----------------------------------------------------------------------------*/

// These will run in order shown due to naming.
// Inherited tests would not run in order shown w/o the use of overrides & supers
public class Child extends Parent {
    @LargeTest
    public void test_001_Setup() { super.test_001_Setup(); }

    @SmallTest
    public void test_002_MainViewIsVisible() { ... }

    ...

    @LargeTest
    public void test_____Finish() { super.test_____Finish(); }
}
于 2011-11-22T17:58:14.030 に答える
0

テストが実行される順序を知る必要がある場合、この種の依存関係を避けることをお勧めします。必要なのは、setUpDatabaseFixture()おそらく置き換えられた実際のデータベースを復元することだけである場合、解決策はRenamingDelegatingContextの使用から得られます。とにかく、最後のテストがいつ実行されたかを知ることを避けられない場合は、次のようなものを使用できます。

...

private static final int NUMBER_OF_TESTS = 5; // count your tests here
private static int sTestsRun = 0;

...

protected void tearDown() throws Exception {
    super.tearDown();
    sTestsRun += countTestCases();

    if ( sTestsRun >= NUMBER_OF_TESTS ) {
        android.util.Log.d("tearDow", "*** Last test run ***");
    }
}
于 2011-08-29T03:01:14.257 に答える