web-dev-qa-db-ja.com

Robolectric vs Android Test Framework

RobolectricAndroid Test Framework?私は両方のフレームワークに関するドキュメントを読みましたが、Robolectricに関する明確なメリットは、それがJVMではなくJVMで実行されることですDalvikVM。Androidフレームワーク。

際立った他の大きな利点はありますか?

45
Traxex1909

2015年4月更新:GradleビルドツールとAndroid Studio 現在、ユニットテストを公式にサポート Android.jarがスタブ(実際の実装なし)エラーをスローしないようにします。そのため、スタブが適切にモックされている場合、Java VMでテストを実行できます。また、3番目の選択肢があります。この答えの一番下までスクロールしてください。

さて、Robolectricについて:

長所:単体テストで有用であることが判明した方法について、いくつかのポイントを示します。

  1. エミュレーターを実行する必要はありません。そのため、エミュレーターまたはデバイスを必要とせずに、プロジェクトの非UIパーツの一部をテストできます。これは、継続的統合/ビルドサーバーでのテストの実行にも適用され、エミュレータインスタンスを起動する必要はありません。

  2. Android Studioを使用すると、テストケースを満たすために実装に取り​​組んでいるときに特定のテストクラスをすばやく実行できます。コードを記述しながらデバッグできます。これは生産性の大幅な向上です。

  3. ほとんどすべてのAndroid関連するものをSQLiteでさえ、シャドウオブジェクトとして偽造できます。さらに、各シャドウオブジェクトは、通常のAndroidが提供しない多くの便利な機能を公開します。 Android Objectの対応するシャドウを使用すると、内部チェックを実行したり、特別なメソッドを呼び出したりできます。

  4. AsyncTasks、LoopersHandlersなどのマルチスレッドコードをテストするときに、本当に光ります。メインスレッドであっても、スレッドルーパーを一時停止して早送りできます。ハンドラーベースのコールバックテストに最適です。

  5. JUnit 4形式がサポートされています。 Androidは、前回チェックしたときにJUnit 3を保持しています。

  6. Mockito、Espressoなどのような他のテストツールと組み合わせることができます。

  7. 模擬アクティビティインスタンスcreationRobolectric.buildActivity()およびActivityControllerを介したその制御をサポートします。フラグメント/ビューの操作は、このような模擬アクティビティインスタンスでも機能します。

  8. 現在、 アドオンモジュール が提供されており、マルチデックス、v4サポート、プレイサービス、マップ、httpクライアントもカバーしています。そのため、これらのライブラリ関数も使用してコードを簡単にテストできるようになりました。

短所:あまり良くないことがわかったところ:

  1. Robolectricは単体テストの支援に優れていますが、実際のデバイスまたはエミュレーターが提供できるすべての機能を網羅しているわけではありません。たとえば、センサー、gps、open-glなど。

  2. 統合またはUIテストを行う際には、エミュレーターまたは実際のデバイスが必要です。そのため、アクティビティとサービスが完全なAndroid環境(カメラアプリを使用して画像を取得するなど、他のアプリアプリ)、限定されたものではありません。ここでは、UIをテストする機能もあるため、デフォルトのテストフレームワークを使用する必要があります。

  3. JNIロードはサポートされていないようです。したがって、ネイティブの依存関係を持つコードはテストできません。

  4. 現時点では、Robolectricは動作するためにGoogleマップjarに固定された依存関係を持っています。そして、Mavenから別のAndroid.jarをダウンロードします。そのため、プロジェクトのセットアップには少し手を加える必要があります。 更新:v3の時点で、Gradleを介してすべての依存関係を大騒ぎせずにプルするようです

  5. 新しいAndroidツールは、カバレッジとレポート生成などをサポートしますが、デバイスでテストを実行する場合のみです。Robolectricでは、追加のGradleタスクを作成(Jaococを実行)する必要があります) 更新:Gradle 2.9 + jacocoプラグインが付属しています。

  6. GradleとAndroidビルドツールは新しいビルドバージョンを高速で出荷しているため、安定したRobolectricバージョンは変更されたビルドツールで問題を起こすことがあります。最も一般的な問題は次のとおりです。マニフェストが見つからない、ビルド出力パスの不一致、リソースがロードされない、ビルド構成の問題など。いくつかの問題は、Androidツールのバグにも関連しています。次のバージョンでこれらの問題が修正されるまで、ランナーまたは回避策を適用してください 未解決の問題 を確認し、それに応じてテストを構成してください。


別の代替手段は、フレームワークを使用せずに、自分で単純にモックすることです。その「ハードな方法」ですが、最もカスタマイズ可能な方法です。 JMockit のある単純なJUnit:

@RunWith(JMockit.class)
public class OtherTest {
    public void testHandlerCallback(@Mocked final FragmentTransaction transaction,
                                    @Mocked final FragmentManager manager,
                                    @Mocked final Activity activity,
                                    @Mocked final LayoutInflater inflater,
                                    @Mocked final ViewGroup parent) {

        final List<Fragment> fragments = new ArrayList<>();
        new Expectations() {{
            activity.getFragmentManager(); result = manager;
            manager.beginTransaction(); result = transaction;
            transaction.add(withCapture(fragments), anyString);
            transaction.commit(); result = new Delegate<Void>() {
                public int commit() {
                    View v = fragments.get(0).onCreateView(inflater,parent,null);
                    Deencapsulation.invoke(v,"onMeasure",0,0);
                  return  0;  
                }
            };
        }};
    }
}

上記は粗雑でインラインの例です。実際に、テスト中のコンポーネント(たとえばFragmentTestHarness)を取得し、完全に隔離された環境にラップしてテスト用に準備する適切な再利用可能なクラス(たとえばFragment)を作成できます。

77
S.D.

方法を共有するには...

Robolectric SQLの場合、コンテキストを必要とするオブジェクトのアクティビティが流れます。

APIのJUnit4 Javaモジュールは、データが正しく返されることを確認します。

Espresso UI表示を正しくチェックします。

Apiを変更したときは、jUnit4のみを実行します。

APIとUIまたはSqliteの間のデータバインディングを変更した場合、Robolectricのみを実行します。

UIを変更したときは、Espressoのみを実行します。

Robolectricとエスプレッソを一緒に実行することもありますが、非常にまれです。

しかし、Play Storeに公開する前にすべてを実行します。

現時点では本当のメリットはないと思うからです。しかし、それを使用して製品の品質と開発速度を向上させる方法をご覧ください。

間違っている場合は修正してください。

25
Shawn Thye

Robolectricの主な利点は速度です。 Robolectricを使用した単体テストでは、テストを実行するのに実行中のエミュレーターまたはデバイスは必要ないため、はるかに高速です。

それでも、実際のデバイスに対して実行される統合テストのスイートが必要な場合がありますが、これは非常に小さなスイートです。

3
koljaTM

Robolectricは、Androidフレームワークをモックまたは偽造する必要がある場合にのみ使用します、たとえばコンテキストが必要な場合。 Android Test Frameworkを使用する場合は、Instrumented testsを実行する必要がありますそれは超遅いです。

頻繁に実行できるようにテストを作成する場合、たとえばtddアプローチに従うため、これはオプションではありません。したがって、この場合Robolectricは便利です。

したがって、Robolectricの主な利点は、Espressoまたは計装テスト一般的に。

欠点は、気付く必要があるAndroid環境を偽造することです。現実の問題を検証するには、従来のAndroid Frameworkアプローチを使用することをお勧めします。

最善の方法は、ユニットテストを実行できるようにコードを記述し、コンテキストやその他のAndroidフレームワークの依存関係を必要としないようにすることです。

Robolectricは、Android I/O 2018以降のテストフレームワーク- Robolectricの公式ページ およびI/O 2018の このビデオ を見る

1
luckyhandler