2

Android アプリケーションの単体テストは、パブリック コンストラクターを持たないクラス (NotificationManager など) や、Context.getText のようにオーバーライドできないメソッドを持つクラスがあるため、予想以上に難しいことがよくあります。

NotificationManager については、委任者を使用しました。コンテキストについても同じことを行いますが、それは、コンテキストを使用するすべてのクラス (多く) で、コンテキストから派生することさえできない独自のコンテキストを使用する必要があることを意味します。次に、コンテキストを Android API に渡す必要があるときはいつでも、ラッパー内から実際のコンテキストを取得する必要があります。

これは正しいです?それを行う別の方法はありますか?これらのメソッドを final として宣言する理由は何ですか? Android 向けの大きなアプリケーションの単体テストを実際に書いた人はいますか?

編集

getText メソッドが final として定義されている理由がわかりました。これはテンプレート メソッドです。したがって、呼び出された非最終メソッドをオーバーライドするだけで十分です

これも機能することがわかりましたが、少し奇妙です

4

3 に答える 3

2

質問が少し漠然としているので、長い回答を書きます。

public コンストラクターを持たないクラスがあります (NotificationManager など)。

システム全体のリソース/コンポーネント (NotificationManager など) があり、Android ではアプリケーションがオンデマンドで構築/インスタンス化することを好まないため、代わりに、これらのリソースはシステムによって集中管理および管理され、アプリケーションは常にシステム提供の API を使用してそれらを取得する必要があります。 .

Context.getText のようにオーバーライドできないメソッドを持つクラス

通常、Java では、final としてマークされたメソッドは API によって保護されていることを意味し、API 開発者はアプリケーション開発者によってデフォルトの動作がオーバーライドされることを望んでいません。特に、このメソッド Context.getText() では、実際に Template メソッド パターンを使用しています。詳細については、以下の herschel のコメントとソース コードを確認してください。

次に問題は、これらの Android コンテキスト ベースのリソース/コンポーネントを使用して記述されたコードを適切にテストするにはどうすればよいかということです。

Android SDK が提供する答えは Test Project (InstrumentationTestRunner 経由) です。通常、InstrumentationTestRunner を使用する場合、システムは test.apk (テスト プロジェクトからビルド) と app.apk (アプリケーション プロジェクトからビルド) の両方をインストールし、test.apk を使用してテスト用に app.apk を操作します。これは、AndroidTestCase API (下の図では JUnit と呼ばれます) を使用するか、InstrumentationTestCase API (下の図では Instrumentation と呼ばれます) を使用するかに関係なく発生します。対応するテスト可能な Android コンテキスト ベースのリソース/コンポーネント (つまり、Activity、NotificationManager、または TextView) はすべて、実際に実行中の app.apk インスタンスから取得されます。テスト プロジェクトで独自の MockContext を作成/使用する場合、図から、実行中のアプリケーションに InstrumentationTestRunner によってモック オブジェクトが注入されることがわかります。

ここに画像の説明を入力

インストルメンテーション テストを使用することの欠点は効率に関するものです。単一のメソッドから単一のメソッドをテストするだけでよいのに、完全な実行ライフ サイクルに入ります (エミュレーターを開始 -> test.apk と app.apk の両方をインストールして開始し、InstrumentationTestRunner を起動する)。クラス(コメントで述べたように)。私は Ollie に同意します。これは敵対的な設計です。

これがRobolectric の出番であり、彼らの Web サイトからの引用です。Robolectric は、Android SDK jar の牙を剥ぐ単体テスト フレームワークであり、Android アプリの開発をテスト駆動できます。テストはワークステーションの JVM 内で数秒で実行されます。

私自身の経験から、アプリケーションは約 10 のアクティビティといくつかのサービスで構成され、他のカスタム ビュー/ウィジェットは主にリモート サーバーとの HTTP 通信を行い、インストルメンテーション テスト (テスト プロジェクト経由) と Robolectic テスト Android コンテキスト ベースのコードの両方を使用します。時間が許す限り、アプリケーションのほぼすべてのクラス/パブリック メソッドをテストできます。

于 2012-04-17T23:58:37.783 に答える
0

Android は、多くの点でテストに対して非常に敵対的です。

Roboelectric http://pivotal.github.com/robolectric/をご覧ください。

私はあなたがこれらを読んだと仮定します:

http://developer.android.com/guide/topics/testing/index.html

http://developer.android.com/resources/tutorials/testing/helloandroid_test.html

于 2012-04-17T16:20:26.750 に答える
0

Android が提供する *TestCase クラスは、発生しているテストの問題を解決できるはずです。これらのインスタンスのほとんどでは、必要に応じてオーバーライドできるコンテキストが生成されます。そこから始めるか、何かをテストする方法についてより具体的な質問をすることをお勧めします。

于 2012-04-17T16:21:59.220 に答える