web-dev-qa-db-ja.com

AndroidインストルメンテーションテストとAndroid Studio?

Android St​​udio 1.1rcの時点で 単体テストのサポート があり、Android Instrumentation Testsと単体テストの違いは何なのか疑問に思っています。

私が理解しているように:
単体テストは、Android AP​​I、およびAndroidインストルメンテーションを呼び出さないコードのテストに役立ちますtestsは、Android AP​​I固有の要素またはGUIコンポーネントをテストするためのむしろ統合テストです。

ただし、ユニットテストでRobolectricまたはMockitoなどのフレームワークを使用する場合は、Androidコードをテストできます。 (デバイスを必要とせずに)私が間違っていなければ。


これは正しいですか、それとも大きな違いがありますか?もしそうなら、それぞれの使用は何ですか?

67
Joen93

単体テストは、テスト対象のコンポーネントを分離します。これが、Mockito:としてユニットを依存関係から分離するため、Mockitoフレームワークと一緒によく使用される理由です。 Android APIは部分的に真であるため、あなたが言うことにも注意してください。なぜなら、 Instrumented Unit tests 、つまりInstrumentation is part Junitパッケージの、およびTestCaseをクラスとして拡張するクラス AndroidTestCase はJunitパッケージの一部ですが、A)Contextの使用を許可しますgetContext()、およびB)Android APIの一部であるリソース)を使用して呼び出すことができます!また、AndroidTestCaseは基本クラスであり、このクラスを拡張する他のクラスが非常に有用であると考えてください。これらは特にローダー、ContentProviders、さらにはサービスをテストし、またAndroid APIにアクセスできます。これらのクラスはJUnitテストフレームワークとAndroid固有のメソッドを提供します。Junit4にはServiceTestRuleがあります。これはオブジェクトから直接拡張され、このクラス内でインテントを直接起動することはできませんが、サービスのテストを簡単にすることができます。

インストルメンテーションテストこれらはJunitパッケージにも含まれていますが、Android APIの制御は計装テストのため非常に完全ですアプリケーションコードが実行される前にシステムでインスタンス化されます。テストするには、実際のアプリケーション(エミュレーターまたはUSBに接続された電話)を開く必要があります。Android components(ex。ボタン)とアプリケーションライフサイクル、それらは通常TestCase(上記で検討したもの)を拡張するJunitテストよりも遅く、一般的な使用法は、よりユーザー指向の機能テストアプローチを持つActivityInstrumentationTestCase2を使用します。

編集:現時点で最も人気のあるテストフレームワーク(2016年7月13日)の間でエスプレッソといっしょになっているRoboelectricとMockitoに関して、Roboelectricを使用すると、数分ではなく数秒で複数のテストを実行できます。連続テストを実行し、継続的な統合の対象となります。

Robolectricのサイトから:

Robolectricの代替アプローチは、Mockitoなどのモックフレームワークを使用するか、Android SDKをモックアウトすることです。これは有効なアプローチですが、多くの場合、アプリケーションコードの本質的に逆の実装であるテストを生成しますRoboelectricは、ブラックボックステストに近いテストスタイルを可能にし、テストをリファクタリングにより効果的にし、Androidの実装ではなくアプリケーションの動作にテストを集中させることができます。もし良かったら。

Jockでも使用できるMockitoは、最終クラス、匿名クラス、またはプリミティブ型を管理する必要がある場合を除いて、実際に使用されます。

31
trocchietto

計測テストは、アプリのライフサイクルとイベント(onStart、onCreateなど)を制御する機能を備えた統合テストであるように思えます。

ユニットテストは、私が理解しているように、ユニット(クラスなど)のデータと動作をテストしています。

たとえば、ゲームがあるとします。このゲームはアクティビティ(メインアクティビティ)で実行され、ロボットクラスに基づくキャラクターがあり、2つのメソッド(発射と移動)があります。インストルメンテーションテストでメインアクティビティをテストし、アプリを終了するときに正しく保存されるかどうか、復元するときに正しく復元されるかどうかなどを確認し、単体テストでロボットをテストして、その属性と動作をテストします。

免責事項:私はJavaの人ではありませんが、あなたの質問に興味を持ち、オンラインでのマイナーな検索に基づいて回答しました。より詳細な答えを見つけるためにこれに。

41
gemantzu

ユニットテスト

ローカルマシンでのみ実行される単体テスト。これらのテストは、実行時間を最小限に抑えるためにJVMでローカルに実行するようにコンパイルされます。このアプローチを使用して、Androidフレームワークに依存関係がない、またはモックオブジェクトが満たすことができる依存関係を持つユニットテストを実行します。

したがって、基本的に、プレーンJavaコードを実行して、たとえばコンテンツプロバイダー、データベース接続、メソッドの入出力をテストします。これはAndroidでは実行されません。それを実行するには、デバイスは必要ありません。

計測テスト

Androidデバイスまたはエミュレーターで実行される単体テスト。これらのテストでは、テスト対象のアプリのコンテキストなどのインストルメンテーション情報にアクセスできます。このアプローチを使用して、モックオブジェクトでは簡単に満たすことができないAndroid依存関係を持つ単体テストを実行します。

したがって、ユーザーが実際のアプリケーションをどのように使用するかを模倣しているため、デバイス(物理またはエミュレータ)を実行して実行する必要があります。ビュー、アクティビティ、コンテキストなどにアクセスできます。

リファレンス: http://developer.Android.com/tools/testing/testing_Android.html

26
Isaac Urbina

enter image description here

単体テスト

これらは、ローカル開発マシンで直接実行できる小規模で高度に焦点を絞ったテストであり、ローカル環境で直接実行されるため、非常に高速で実行時間が非常に短くなります。

統合テスト

これらは、ローカルマシンではなく実際のデバイスで実際に実行されるテストであり、一緒に動作する異なるモジュール間の統合をテストすることを目的としています。

エンドツーエンドテスト

しかし、これらのテストは実際のデバイスでも実行されるため、これらのテストの忠実度は非常に高く、完全な機能またはフローを完全にエンドツーエンドでテストするため、これらのテストの範囲ははるかに大きくなります。

単体テスト:

  • JUnit
  • モッキート
  • PowerMock

UIテスト:

  • エスプレッソ
  • UIAutomator
  • Robotium、Appium、Calabash、Robolectric

続きを読む here および here
コマンドラインからテストを実行する方法 here

5
yoAlex5

https://developer.Android.com/training/testing/fundamentals.html#testing-pyramid

小規模テストは、実稼働システムから分離して実行できる単体テストです。通常、これらはすべての主要コンポーネントをモックし、マシン上で迅速に実行する必要があります。

中規模テストは、小規模テストと大規模テストの間に位置する統合テストです。それらは複数のコンポーネントを統合し、エミュレーターまたは実際のデバイスで実行されます。

大規模なテストは、UIワークフローを完了することによって実行される統合およびUIテストです。エミュレータまたは実際のデバイス上で、主要なエンドユーザータスクが期待どおりに機能することを保証します。

0
ViT-Vetal-

単体テスト

ローカルマシンでのみ実行されます。

計測テストケース

Androidデバイスまたはエミュレーターで実行されます。エミュレーターまたはAndroidデバイスで実行されるテストケースをチェックする場合

0
mathi