web-dev-qa-db-ja.com

Android St​​udioでテストを作成するにはどうすればよいですか?

Intellij Ideaに基づいたAndroid St​​udioをダウンロードしました。

どのようにテストを作成しますか?

テストモジュールを作成するオプションがありますが、これは何もしないようで、srcで新しいプロジェクトを作成するだけです

ホットキーCTRL + AlT + Tを押してみました。これにより、既存のクラスで単体テストを作成できますが、現在のプロジェクトに配置したいようです。もちろん、これはTDDには役立ちません

誰もがここで経験を持っていますか?

108
Martin

この回答は、Androidテストを始めたばかりの人向けです。テストがどのように機能するかを確認するのに役立つ2つの簡単な例を示します。次の10分間続ければ、テストを独自のアプリに追加するための準備がすべて整います。私はあなたがそれがどれほど簡単であるかに驚くだろうと思う。確かにそうだった。

Androidテストの紹介

実行するテストには2つの異なるタイプがあります。

  • ローカルユニットテスト。これらはJVM(Java仮想マシン)上でローカルに実行されます。ローカルであるため、高速です。これらを使用して、Java AP​​IではなくAndroidのみを必要とするコードの部分をテストできます。 (時には、ローカルでより多くのものをテストするために偽のAPIオブジェクトを作成できます。これは モック と呼ばれます。モックContextは例です。)
  • 計装テスト。これらのテストは、実際のデバイスまたはエミュレーターで実行されます。そのため、ローカルテストよりも遅くなります。ただし、完全なAndroid AP​​Iを使用できるため、より柔軟です。

新しいプロジェクトを作成すると、次のデフォルトのフォルダーが表示されます。

enter image description here

すべてがすでにそこにあり、テストを作成するのを待っています。すべて設定済みです!

ローカルユニットテストを作成する方法

上の画像に示されているExampleUnitTestファイルを開きます。次のようになります。

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        assertEquals(4, 2 + 2);
    }
}

すべてのテストを実行するには緑の二重矢印を、1つだけを実行するには緑の単一矢印を押します。 (この場合、テストは1つだけなので、両方が同じことを行います。)

enter image description here

パスする必要があります(この回答を読んでいるときに2 + 2がまだ4である限り)。おめでとうございます、最初のテストを実行しました!

独自のテストを作成する

独自のテストを作成しましょう。最初にこのクラスをメインアプリプロジェクトに追加して、テストするものを用意します。

public class MyClass {
    public int add(int a, int b) {
        return a + b;
    }
}

ここで、テストクラスのaddition_isCorrect()メソッドを次のコードのように変更します(または単に別の名前のメソッドを追加します)。

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() throws Exception {
        MyClass myClass = new MyClass();
        int result = myClass.add(2, 2);
        int expected = 4;
        assertEquals(expected, result);
    }
}

もう一度実行すると、パスするはずです。おめでとうございます、あなたはあなた自身の最初のテストを作成しました! (まあ、技術的には私のものだったと思いますが、ちょっと、十分に近いです。私のものはあなたのものです。)

インストルメント済みテストを作成する方法

ExampleInstrumentedTestファイルを開きます。次のようになります。

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.example.myapp", appContext.getPackageName());
    }
}

緑色のボタンのいずれかをもう一度押します。

enter image description here

実際のデバイスが接続されているか、エミュレータがセットアップされている限り、それが起動してアプリが実行されているはずです。おめでとうございます、あなたは最初の計装されたテストを実行しました!

独自のテストを作成する

インストルメントされたテストは、テストを実行するために Espresso を使用します。アプリをテストできるのは、小さなロボットユーザーのようなものです。ボタンを押す、またはTextViewのプロパティを読み取るなどの操作を行うように指示できます。

テストを手動で行う方法の手順を記述できますが、開始したばかりなので、 auto-record function を使用しましょう。とても簡単です。

まず、UIにボタンを追加して、作業できるようにします。これは私がしました:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context="com.example.myapp.MainActivity">

    <Button
        Android:id="@+id/myButton"
        Android:text="Click me"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"/>

</Android.support.constraint.ConstraintLayout> 

次に、メニューのRun> Espresso Testの記録を押します。

enter image description here

起動後、エミュレータのボタンをクリックしてから、[記録]ダイアログで[OK]を選択します。次のテストコードを自動生成する必要があります。

@LargeTest
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void mainActivityTest() {
        ViewInteraction appCompatButton = onView(
                allOf(withId(R.id.myButton), withText("Click me"), isDisplayed()));
        appCompatButton.perform(click());
    }
}

すばらしいです!最初の計装テストを作成しました!それはとても簡単でした。おそらくアサーションを追加して実際のテストにする必要がありますが、それはレコーダーでも簡単に実行できます。 このビデオ を見て、もう少し詳しく見てみましょう。

さらなる研究

最初にビデオを見てから、ドキュメントを読みます。それはすべて非常に役立ちます。最後のリンクは、テスト対象を選択する際に考慮すべき重要な事項をカバーする一連の記事へのリンクです。

44
Suragch

編集: .1.8現在、IDEでサポートされています 。以下の手順を使用する代わりに、そこの手順に従ってください。

Android Gradle Plugin User Guide に従って、新しく作成されたプロジェクトで次の手順を実行することでコマンドラインでテストを実行できました(デフォルトの 'com.example.myapplication'パッケージを使用しました):

  1. テスト用にsrc/instrumentTest/Javaディレクトリを追加します
  2. パッケージcom.example.myapplication.testにテストクラス(ActivityTestCaseを拡張)を追加します。
  3. 仮想デバイスを開始する
  4. コマンドライン(MyApplicationProject/MyApplicationディレクトリ)で、コマンド「../gradlew connectedInstrumentTest」を使用します。

これでテストが実行され、テスト結果がMyApplicationProject/MyApplication/build/reports/instrumentTests/connectedに配置されました。私はAndroidアプリをテストするのは初めてですが、うまくいくようです。

IDE内から、同じテストクラスを試して実行することができます。あなたがする必要があります

  1. Build.gradleを更新してMaven Centralをレポとしてリストします
  2. Build.gradleを更新して、JUnit 3.8をinstrumentTestCompile依存関係として追加します。 instrumentTestCompile 'junit:junit:3.8'
  3. 「プロジェクト構造」で、JUnitを手動で移動して依存関係の順序の最初に移動します

ただし、これは失敗します(テストの実行時に使用されるクラスパスにテスト出力ディレクトリがありません)。ただし、Android固有のテストランナーが必要であると理解しているため、これが動作するかどうかはわかりません。

36
Chris

gradle.buildファイルを使用することをお勧めします。

  1. src/androidTest/Javaテスト用のディレクトリを追加します(Chrisが説明を開始します)

  2. gradle.buildファイルを開き、そこに指定します:

    Android {
    
        compileSdkVersion rootProject.compileSdkVersion
        buildToolsVersion rootProject.buildToolsVersion
    
        sourceSets {
    
            androidTest {
                Java.srcDirs = ['androidTest/Java']
            }
        }
    }
    
  3. 「プロジェクトをGradleファイルと同期」(トップパネル)を押します。フォルダー「Java」(「androidTest」内)が緑色になっているはずです。

  4. これで、テストファイルを作成して実行できます。

20

この投稿 Rex St JohnによるAndroid studioでのユニットテストには非常に便利だと思います。

http://rexstjohn.com/wp-content/uploads/2014/01/Screen-Shot-2014-01-24-at-6.26.20-PM-300x137.png

12
Saeed Zarinfam

Android Studio v.2.3.3

テストするコードコンテキストを強調表示し、ホットキーを使用します:CTRL + SHIFT + T

ダイアログインターフェイスを使用して、セットアップを完了します。

テストフレームワークは、最良の結果を得るためにプロジェクトパッケージレイアウトをミラー化することになっていますが、正しいディレクトリとビルド設定があれば、カスタムテストを手動で作成できます。

10

現在(スタジオ0.61)、適切なプロジェクト構造を維持するだけで十分です。 Eclipseのように個別のテストプロジェクトを作成する必要はありません(以下を参照)。

Tests structure

7
Daber

Android Studioは進化し続けているため、上記の回答は最終的には適用できなくなります。 Android St​​udio 1.2.1.1の現在のバージョンについては、テストに関する素敵なチュートリアルがあります:

http://evgenii.com/blog/testing-activity-in-Android-studio-tutorial-part-1/

4
AndroidDev

主な変更点の1つは、Android St​​udioを使用すると、テストアプリケーションがアプリケーションプロジェクトに統合されることです。

これが特定の問題に役立つかどうかはわかりませんが、Gradleプロジェクトでテストを作成するためのガイドを見つけました。 Android Gradleユーザーガイド

3
Kage

私が見つけた最も簡単な方法は、 私の次のブログ投稿 で合理化されたものです:

  1. すべてのユニットテスト(できればcom.example.app.tests)を書き込むフォルダーを作成します。
  2. 新しいテストクラス(できればNameOfClassTestedTests、つまりBankAccountLoginActivityTests)を作成します。
  3. InstrumentationTestCaseの拡張
  4. 失敗した単体テストを作成して、単体テストの構成に成功したことを確認します
  5. 単体テストのメソッド名は、単語「test」で開始する必要があることに注意してください(testTestedMethodNameExpectedResult()、つまりtestBankAccountValidationFailedShouldLogout())
  6. 単体テスト用にプロジェクトを構成します。
  7. 「実行...」メニューを開き、「構成の編集」をクリックします
  8. [+]ボタンをクリックします
  9. Android Testsテンプレートを選択します
  10. 実行構成の名前を入力します(「AppName Tests」が望ましい)
  11. モジュールコンボボックスでアプリを選択します
  12. [パッケージ内のすべて]ラジオボタンを選択します(通常、すべてのテストクラスですべてのユニットテストを実行するため、このオプションを選択します)。
  13. 手順1のテストパッケージ名(com.example.app.testsなど)を入力します
  14. テストを実行するデバイスを選択します
  15. 設定を適用して保存する
  16. 単体テストを実行します(そして失敗を予期します):
  17. [実行]メニューから新しく作成したテスト構成を選択します
  18. [実行]をクリックして、出力コンソールで結果を読み取ります。

コードを読みやすく、保守しやすく、十分にテストしてください。

3
nurxyz

Android Studioは、最初は開発者向けのプレビューであり、現在はベータ版であるため、動いているターゲットの1つです。プロジェクト内のテストクラスのパスは時間の経過とともに変化しますが、使用しているASのバージョンに関係なく、パスは.imlファイルで宣言されます。現在、バージョン0.8.3では、内部imlファイル内に次のものがあります。

      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="Java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="Java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="Java-test-resource" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/Java" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/groovy" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
  <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />

.imlファイルは、テストクラスを配置する場所を示しています。

2

Android St​​udio 1.1の時点で、ユニットテスト(Roboelectricも同様)を作成するための公式(実験的)サポートがあります。

ソース: https://sites.google.com/a/Android.com/tools/tech-docs/unit-testing-support

2
marius bardan

Gradleファイル内に以下のlibを追加します

 androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.Android.support', module: 'support-annotations'
    })

AndroidTestディレクトリ内にHomeActivityTestクラスを作成し、テストを実行する前に、文字列リソースファイル内にflurry_api_keyおよびsender_id文字列を追加し、失敗および成功の場合の値を変更します。

@RunWith(AndroidJUnit4.class)
public class HomeActivityTest
{
    private static final String SENDER_ID = "abc";
    private static final String RELEASE_FLURRY_API_KEY = "xyz";

    @Test
    public void gcmRegistrationId_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(SENDER_ID, appContext.getString(R.string.sender_id));
    }

    @Test
    public void flurryApiKey_isCorrect() throws Exception
    {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assert.assertEquals(RELEASE_FLURRY_API_KEY, appContext.getString(R.string.flurry_api_key));
    }
}
0