4

私はテストにかなり慣れていないので、jUnit テストとRobotium. 私のアプリケーションには 4 つの画面があります。

Splash Screen --> Screen2--> Screen 3--> Autocomplete Screen.
[init()]                               [ check values generated by init() method]

オートコンプリート画面は、ユーザーが何かを入力する場所であり、アプリは製品の大規模なデータベースからオートコンプリートを実行します。スプラッシュ スクリーンではinit()、別のクラスのメソッドを使用して多くのアプリ変数を初期化しています。このinit()メソッドは、ユーザーの設定をロードし、データベースの作成をチェックします... (製品データベースは apk に事前にパッケージ化されており、最初の起動時にデータベースをコピーし、copyed SharedPreferences=true としてマークします)。

問題: オートコンプリート画面のテストを分離するにはどうすればよいですか? AutocompleteActivity の onCreate は、SplashScreen で呼び出された init() に依存します。jUnit が , のインスタンスを作成するタイミングがわかりませんActivity(おそらくコンストラクターで? )。これが私のTestCaseCodeです:

import android.test.ActivityInstrumentationTestCase2;
import android.view.View;
import android.widget.ListView;

import com.jayway.android.robotium.solo.Solo;
import com.supervalu.mobile.android.AutoCompleteActivity;
import com.supervalu.mobile.android.db.LocalDb;

public class AutocompleteTest extends
        ActivityInstrumentationTestCase2<AutoCompleteActivity> {
private Solo solo;

public AutocompleteTest() {
    super("com.****.*****.*****", AutoCompleteActivity.class);
}

protected void setUp() throws Exception {
    super.setUp();
    LocalDb.init(getActivity().getApplicationContext());
    solo = new Solo(getInstrumentation(), getActivity());

}

public void test1Character() {
    solo.sleep(2000);
    solo.enterText(0, "c");
    solo.sleep(10000);
View v = getActivity().findViewById(
            com.*****.****.*****.R.id.list);
    solo.waitForView(v);
    assertTrue(((ListView) v).getChildCount() > 0);


}

public void test3Character() {
    LocalDb.init(getActivity().getApplicationContext());
    solo.enterText(0, "che");
    View v = getActivity().findViewById(
            com.*****.****.*****.R.id.list);
    solo.waitForView(v);
    assertTrue(((ListView) v).getChildCount() > 0);
}

protected void tearDown() throws Exception {

    solo.finishOpenedActivities();
    super.tearDown();

}

LocalDbonCreate には、メソッドによって初期化する必要があった Whcih からのいくつかの値が必要なため、テスト ケースはクラッシュし続けますinit()

コンストラクターでのスーパー呼び出しの前に init() 関数を追加できません。これを回避する方法はありますか、それともスプラッシュ スクリーンからテスト ケースを開始する必要がありますか?

問題 2 : スプラッシュ画面からテストを開始した場合、テストを実行する前に、最初にオートコンプリート画面に移動する必要があります。同様にそれを行ったとします。次に、各テストについて、test1character() クラスが setUp() を実行し、次にテスト、tearDown() を実行し、test3characters() 関数のシーケンス全体を再開します。実際に入力をテストする前に、毎回オートコンプリート画面への移動を繰り返し続けるのは非常に面倒です。これについても何か提案はありますか?

どのようなアプローチを取るべきかわかりません。誰かが私を案内してもらえますか?

4

4 に答える 4

0

私はあなたの問題を本当に理解していませんが、私は助けようとします.

アクティビティの開始 (およびその onCreate コールバックの呼び出し) を実行するには:

getActivity();

通常はsetUp()メソッド内にあります (各テストの前に呼び出します)。

あなたが言うように、テストごとにsetUp()andtearDown()メソッドが呼び出されます。

アプリのナビゲーションをテストする最善の方法は簡単なテストであり、必要に応じてすべてのインテントを作成して、テストする必要があるすべてのアクティビティを開始できると思います。

お役に立てば幸いです。

于 2011-12-14T17:58:45.763 に答える
0

単体テストを行う場合は、テスト クラスを ActivityUnitTestCase に拡張して単一のアクティビティをテストし、onCreate を呼び出す startActivity メソッドを使用する必要があります。ActivityInstrumentationTestCase2 は、アクティビティの機能テスト用です。

詳しくは Android リファレンス ドキュメントを参照してください。

提供された引数を指定して、Context.startActivity() によって開始された場合と同じ方法で、テスト対象のアクティビティを開始します。このメソッドを使用してアクティビティを開始すると、tearDown() によって自動的に停止されます。

このメソッドは onCreate() を呼び出しますが、Activity ライフサイクル メソッドをさらに実行したい場合は、テスト ケースから自分で呼び出す必要があります。

setUp() メソッドから呼び出さないでください。このメソッドは、各テスト メソッドから呼び出す必要があります。

于 2013-06-04T18:13:03.453 に答える
0

Android アクティビティ メソッドの分離されたメソッド テストを実行するには、モッキング フレームワークがより良い代替手段であることがわかりました。現時点では、jMockit はエンドロイドの基本クラスを効果的にモックアップできる唯一のフレームワークです。

多くのセットアップおよび分解コードを破棄できます。テストケースを参照してください:

https://github.com/ko5tik/andject/blob/master/src/test/java/de/pribluda/android/andject/ViewInjectionTest.java

于 2011-11-22T11:08:53.207 に答える