1. ホーム
  2. android

Android StudioにおけるAndroid Instrumentation TestとUnit Testの違いとは?

2023-07-23 04:40:55

質問

Android Studio 1.1rcの時点では ユニットテストのサポート となっています。 Android Instrumentation TestsとUnit testsの違いが気になるところです。

私の理解では

ユニット テスト は、Android API を呼び出さないコードをテストするのに便利です。 API を呼び出さないコードをテストするのに便利であり Android インストルメンテーション テスト はむしろ統合テストです。 Android API の特定の要素や GUI コンポーネントをテストするための統合テストです。

しかし、もしあなたが Robolectric または モッキート を使うことができます。 を使用すると、Android のコードをテストできます (デバイスは必要ありません)。


これは正しいのでしょうか、それとももっと大きな違いがあるのでしょうか。もしそうなら、それぞれどのような用途があるのでしょうか?

どのように解決するのですか?

単体テスト これは、しばしばMockitoのようなMocksフレームワークと一緒に使用される理由です:ユニットを依存関係から分離するためです。Android APIに関してあなたが言っていることは部分的に正しいことに注意してください。 インスツルメンテッドユニットテスト であり、すなわち インスツルメンテーションはJunitパッケージの一部でもあります。 また、TestCase を継承したクラスである AndroidTestCase はJunitパッケージの一部ですが、A)getContext()で呼び出せるContext、B)Android APIの一部であるResourcesを使用することができます! また、AndroidTestCaseは基本クラスであり、このクラスを継承する他のいくつかのクラスが非常に便利であることを考慮してください。これらのクラスはJUnitのテストフレームワークとAndroid固有のメソッドを提供します。Junit4では、ServiceTestRuleというオブジェクトを直接継承したクラスがあり、このクラス内で直接Intentを開始することはできませんが、より簡単にServiceをテストすることができるようになりました。

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

編集:RoboelectricとMockitoについて、それはEspressoと一緒に、現時点(2016年7月13日)で最も人気のあるテストフレームワークの間です。 Roboelectricは、数分ではなく数秒で複数のテストを実行することができ、これは継続的なテストを実行する必要があり、継続的統合の対象となるチームでは本当に便利なものです。

Robolectricのサイトより。

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

Junitでも使えるMockitoは、finalクラスや匿名クラス、プリミティブ型などを管理する必要があるとき以外は、本当によく使っています。