0

ライブラリプロジェクトから「派生」するテスト実装を実行して、Androidテストを実行します(baselibと「具体的なアプリプロジェクト」を含むマルチモジュールプロジェクトがあるため)。テストの実装は、これらの具体的なアプリ プロジェクトの 1 つであり、InstrumentationTestCase によって起動されます。このテスト ケースでは、RoboGuice によるライブラリ プロジェクトからいくつかの部分をモックします。つまり、モック化されたクラス (永続化処理、データベース処理など) を使用して baselib の「実際の」実装を実行します。これを行うには、デバイスで同じアプリを 2 回起動することはできないため、すべてのテスト ケースでテスト インスタンス全体を閉じて再起動する必要があります。これらのテストは、ある種のワークフローをテストするため、Junit テストよりも統合テストですが、それをテストする他の可能性はありません。Android テストでの JUnit の可能性は非常に限られているように見えるためです。現時点では、同時に実行できるテスト ケースは 1 つだけです。複数のテスト ケースを実行すると、テスト全体がハングするからです。テストがフリーズする原因が構成の変更 (プライベート メソッドを参照) であるかどうかは既に確認しましたが、これが原因ではありません。TearDown メソッドで私の試みを参照してください。走れない

getInstrumentation().finish(0, new Bundle());

私が得るので

テストを完了できませんでした。理由: 'テストの実行が完了しませんでした。3 回のテストが予想され、1' を受け取りました

私も走れません

getInstrumentation().callActivityOnDestroy(アクティビティ);

ここにはアクティビティがないためです。さらに、StartTestActivity はテストの最後に実行される別のアクティビティ「MainMenuActivity」を起動するため、起動時に起動されるアクティビティ「StartTestActivity」は、テストの終了時に実行される同じアクティビティではありません。Instrumentation.ActivityMonitorの使用についてはすでに考えましたが、これでは必要な機能が提供されません。
それにもかかわらず、起動時にテスト全体が行うのと同じテスト条件で、すべてのテスト ケースで何らかの方法で開始したいのですが、InstrumentationTestCase がバックグラウンドで何をしているのかわからないため、インストルメンテーション全体を再起動する方法がわかりません。設定。どういうわけかテスト インスタンスを停止して再起動する必要がありますか、それとももっと良い解決策がありますか? 何か案は?(ちなみに、すべてのテスト自体は正常に実行されるため、テスト自体の問題ではありません)。

public class WorkflowModule1Test extends InstrumentationTestCase
{
    private PersistenceManagerMock persistenceManager;

    @Override
    protected void setUp() throws Exception
    {
        super.setUp();
    }

    @Override
    protected void tearDown() throws Exception
    {
        super.tearDown();

        if (persistenceManager != null)
        {
            persistenceManager.clear();
        }
    }

    public void testSaveLocaleEN() throws PersistenceException
    {
        updateLocaleConfiguration(Locale.ENGLISH);

        Intent intent = new Intent(getInstrumentation().getContext(), StartTestActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        getInstrumentation().startActivitySync(intent);

        persistenceManager = (PersistenceManagerMock)RoboGuice.getInjector(ContextProvider.getApplication()).getInstance(IPersistenceManager.class);

        List<Entity> entities = persistenceManager.getEntities();

        assertTrue(entities.size() == 1);
        assertTrue(entities.get(0) instanceof LanguageUsageRel);
        assertTrue(((LanguageUsageRel)entities.get(0)).getLanguageId().equals("EN"));
    }

    public void testSaveLocaleDE() throws PersistenceException
    {
        updateLocaleConfiguration(Locale.GERMAN);

        Intent intent = new Intent(getInstrumentation().getContext(), StartTestActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        getInstrumentation().startActivitySync(intent);

        persistenceManager = (PersistenceManagerMock)RoboGuice.getInjector(ContextProvider.getApplication()).getInstance(IPersistenceManager.class);

        List<Entity> entities = persistenceManager.getEntities();

        assertTrue(entities.size() == 1);
        assertTrue(entities.get(0) instanceof LanguageUsageRel);
        assertTrue(((LanguageUsageRel)entities.get(0)).getLanguageId().equals("DE"));
    }

    private void updateLocaleConfiguration(Locale locale)
    {
        Locale.setDefault(locale);
        Configuration configuration = new Configuration();
        configuration.locale = locale;
        getInstrumentation().getContext().getResources().updateConfiguration(configuration, getInstrumentation().getContext().getResources().getDisplayMetrics());
    }
}
4

2 に答える 2

0

代わりに拡張すればActivityInstrumentationTestCase2、これで多くの問題が解決すると思います。

別のメモ: 分解ロジックを呼び出しの前に置きますsuper.tearDown()

于 2013-06-02T19:14:29.667 に答える
0

私は自分で解決策を見つけました。この 2 つのフラグを設定する必要があります。

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
于 2013-06-05T06:37:47.557 に答える