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


109

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

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

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

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

誰かここで何か経験がありますか?


2
また、テストプロジェクトの作成も試みました。Eclipseプロジェクトの場合と同様に、Androidコマンドラインツールを使用すると、AndroidManifest.xmlファイルが見つからないため、エラーが発生します。GoogleはGrundleプロジェクトに対応するためにAndroidツールを更新する必要があるようです。ただし、私はAndroidでのテストに慣れていないので、あなたを助けることはできません=(
Kage

回答:


56

この回答は、Androidのテストを始めたばかりの人を対象としています。テストがどのように機能するかを理解するのに役立つ2つの簡単な例を示します。次の10分間進むと、自分のアプリにテストを追加する準備がすべて整います。簡単なことに驚かれることでしょう。確かにそうだった。

Androidテストの概要

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

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

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

ここに画像の説明を入力してください

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

ローカル単体テストを作成する方法

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

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

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

ここに画像の説明を入力してください

合格するはずです(この回答を読んでいる間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());
    }
}

緑色のボタンの1つをもう一度押します。

ここに画像の説明を入力してください

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

独自のテストを行う

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

手動でテストを行う方法の説明を書くこともできますが、まだ始めたばかりなので、自動記録機能を使用してみましょう。とてもシンプルです。

まず、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> 

次に、メニューの[実行]> [エスプレッソテストの記録 ]を押します。

ここに画像の説明を入力してください

起動したら、エミュレータのボタンをクリックし、終了するには、[記録]ダイアログで[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());
    }
}

すごい!これで、最初のインストゥルメントテストが作成されました。それはとても簡単でした。実際のテストにするためには、アサーションを追加する必要がありますが、これはレコーダーでも簡単に実行できます。見るこのビデオを少し深く行くことに。

さらなる研究

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


1
素晴らしい答え@Suragch。簡単な質問:ローカル単体テストケースのサポートファイルはどこに配置しますか?それはハッキーですが、テストのベースからの完全なパスを入れて喜んでいますが、Android Studioで実行した場合、テストはroot_ /appから実行されますが、Gradleコマンドライン(またはCI)から実行した場合は、 _root。(理想的には、assetsどちらかの方法で実行したときに特定のフォルダにアクセスしたい)。
mm2001

@ mm2001、私はこの答えを自分でテストする方法を学ぶ方法として書いたので、私はあなたのところまで到達していません。私が理解する前にこれを理解した場合、コメントを残すことができますか?
Suragch

私はこれが便利だと思いました:stackoverflow.com/a/42751502/19506-フォルダーtest/resourcesを作成してそこにファイルを置く、たとえばでファイルにtest.txtアクセスする、と書いてありますgetClass().getClassLoader().getResource("test.txt")。APKアセットに直接アクセスすることはおそらく悪い考えであると判断したので、ビルドステップでテストするファイルをコピーするか、外部の更新プロセスで対処します。Gradleの異なるバージョンについては、いくつか疑問が残っていますが、私はまだそれに直面していません。
mm2001

36

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

以下のアンドロイドのGradleプラグインユーザガイド私は(私はデフォルトの「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固有のテストランナーが必要であることを理解しているため、これが機能するかどうかはわかりません。


20

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. これで、テストファイルを作成して実行できます。


androidTest.setRoot( 'instrumentTest')を忘れないでください
IgorGanapolsky

3
現在のAndroid Studioバージョンでは、それは必要ではありません。さらに、instrumentTestという名前のすべてをandroidTestに
Yuriy Chernyshov

「instrumentTest」と「androidTest」の名前は完全に任意です。これらは、テストプロジェクトの単なるディレクトリ名です。'tests'ディレクトリを作成することもできます。さらに、テストフレームワークでのSDKのパッケージ名はandroid.test.InstrumentationTestCaseです。だから、標準的には、「機器」または「機器」は、テストに名前を付けるのに意味があると信じています。以下のソースコードを参照してください:grepcode.com/file/repository.grepcode.com/java/ext/...
IgorGanapolsky

7
こちらのドキュメントを読んでください:tools.android.com/tech-docs/new-build-system。バージョン0.9.0以降、instrumentTestandroidTestに名前が変更されました
Yuriy Chernyshov 2014

1
@IgorGanapolskyネーミングフォルダandroidTestは任意ではありません。フォルダを緑色にするには、この操作を行う必要があります。
時計屋2015


10

Android Studio v.2.3.3

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

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

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


7

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

テスト構造


4

Android Studioは進化し続けているため、上記の応答は最終的には適用されなくなります。Android Studio 1.2.1.1の現在のバージョンについては、テストに関する素晴らしいチュートリアルがあります。

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


2
はい、ASは進化し続けているため、最先端のテクノロジーに関する記事を作成するのは愚かなことであり、適用されるバージョン番号について言及することはありません。唯一の手掛かりは、一番下の日付です。
トム

3

Android Studioを使用すると、テストアプリケーションがアプリケーションプロジェクトに統合されるようです。

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


3

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

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

コードを読みやすく、保守しやすく、十分にテストされた状態で頑張ってください!


問題は、計装テストに関するものでした。また、インストルメンテーションテストの作成も困難です。stackoverflow.com/questions/35426990/…で
モニカ

2

Android Studioは、最初は開発者向けプレビューで、現在はベータ版です。プロジェクトのTestクラスのパスは時間の経過とともに変更されましたが、使用している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 Studio 1.1以降、単体テストの作成に対する公式(実験的)サポートがあります(Roboelectricも動作します)。

出典:https : //sites.google.com/a/android.com/tools/tech-docs/unit-testing-support


Androidテストの作成のサポートは、新しいサポートテストライブラリで強化されました。あなたはここで素晴らしいプレゼンテーションを見ることができます:docs.google.com/presentation/d/…– marius bardan '27
04/27

0

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));
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.