2011-07-21 9 views
8

アプリケーションがランタイムチェックによってインスツルメンテーションテストの一部として実行されているかどうかを確認しますか?Androidアプリケーションがインスツルメンテーションテストの一部として実行されているかどうかを調べることは可能ですか?

背景:アプリケーションは、起動時にデータベース同期を実行します。しかし、それは定期的に開始されたときにのみ起こるはずです。特にdb同期をテストする計測テストに干渉します。驚くことではないが。

他のすべてのテストでは、それは単なるCPUサイクルの無駄です。

+0

を実行されていないので、あなたはそのための任意の解決策を見つけましたか? – Piotr

答えて

2

ActivityUnitTestCaseを使用している場合は、setApplicationを使用してカスタムアプリケーションオブジェクトを設定し、そこにデータベースの同期をオンまたはオフに切り替えるフラグを設定できますか?私のブログでカスタムApplicationオブジェクトを使用した例があります:

http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-3/

+0

興味深い。私はすでにインストルメンテーションテストフラグを設定できるカスタムアプリケーションを持っています。私は明日それを試してみるよ。 – Martin

+0

何か他に考えているもの - RoboGuice http://code.google.com/p/roboguice/を使用してdb同期コードのテスト専用バージョンを適切に注入することができます(これは実際にテストコードで行います) )。 http://www.swiftkey.net/blog/?p=496 –

+0

アクティビティとサービスのテストケースには 'setApplication'メソッドしかなく、単純な' AndroidTestCase'メソッドは存在しないようです。しかし、彼らはとにかくOKを実行するようだ。とにかくそれは唯一の開いているようです。 thnaks。 – Martin

5

APIレベル11、ActivityManager.isRunningInTestHarness()方法が提供されていますので。これはあなたが望むことをするかもしれません。

+8

テストやアプリの設定を実行している間は、私には間違いが返ってきます – Piotr

+0

このメソッドは基本的にシステムアプリでのみ使用されます。いくつかのプラットフォームテストハーネスで動作します。ここに私のバグを見てください:http://b.android.com/191171 –

1

アクティビティに余分なインテントを渡して、テスト中であることを示すことができます。あなたのテストで

1)、あなたの活動に余分な "のtestMode" 合格:のtestModeをチェックし、あなたの活動では

2):

Bundle extras = getIntent().getExtras(); 
if (extras != null && extras.getBoolean("testMode")) { 
    // disable your database sync 
} 
+0

私はいくつかのレガシーコードテストのためにこのメソッドを使用します。私は、あなたのプロダクションコードは一般的にテストを何らかの方法で処理するべきではないことを指摘します。 –

3

はるかに簡単な解決策はのためのチェックです(ActivityUnitTestCaseを使用するソリューションとは異なり)JUnit 4で動作し、アクティビティ/サービスにカスタムインテントを送信する必要はありません(場合によっては不可能かもしれません)

private boolean isTesting() { 
    try { 
     Class.forName("com.company.SomeTestClass"); 
     return true; 
    } catch (ClassNotFoundException e) { 
     return false; 
    } 
} 
0

私にとってこの作品は、実際のデバイスが

public static boolean isUnitTest() { 
    return Build.BRAND.startsWith(Build.UNKNOWN) && Build.DEVICE.startsWith(Build.UNKNOWN) && Build.DEVICE.startsWith(Build.UNKNOWN) && Build.PRODUCT.startsWith(Build.UNKNOWN); 
} 
+0

DEVICEで2回テストする必要があるかどうかは不明です。 AS 2.3.3および組み込みJDKのBRAND、DEVICEおよびPRODUCTを持つテストマシンでは、テストはnullになります。return(Build.BRAND == null || Build.BRAND.startsWith(Build.UNKNOWN))&& (Build .DEVICE == null || Build.DEVICE.startsWith(Build.UNKNOWN))&& (Build.PRODUCT == null || Build.PRODUCT.startsWith(Build.UNKNOWN)); – Timores