バナー画像

アプリ開発の現場では、プログラムは作って終わりではなく、それが想定どおりに動作するのか確認するテスト工程をかならず実施します。

この記事では、Android 開発でもっともメジャーなツールである、Android Studio を使用して、アプリのテストを自動化する方法を解説します。

なぜテストが必要か

そもそも、なぜテストが必要なのでしょうか?

プログラマーによって書かれたソースコードには、ほぼ 100% の確率でバグが潜んでいると言っても過言ではありません。どれだけ優秀なプログラマーであっても、最初から完璧なプログラムを作るのは困難です。

バグがあるプログラムを世に送り出してしまうと、ユーザーからのクレームにより企業のイメージが低下したり、最悪の場合、バグによってサービスが停止し、その期間中の売上を損失することになります。

つまり、バグがない品質のよいアプリを作るためには、テストが必須で、開発工程においてテスト工程は非常に重要な役割を占めています。

テストの自動化とは

スマホアプリに限らず多くのアプリケーションは、リリース後のバグ修正や機能追加が行われます。

アプリを修正するたびに人の手によってテストを行うと、時間とコストや確認ミスが発生する恐れがあるため、それらを減らすために、テストコードを作成し、アプリのテストを自動化する手法を用いることがあります。

Android アプリ開発においても、テストを自動化する仕組みが用意されています。

サンプルアプリの準備

テスト行うには、テスト対象となるアプリが必要です。

今回は次のイメージのような簡単なサンプルアプリを作って、テストコードを書いてきます。

この、サンプルアプリは、名前(NAME)を入力してボタンをクリックすると、下の MESSAGE に「Hello 」を表示するだけのシンプルなアプリです。

サンプルアプリのソースコード

View の XML 省略しますが、上のサンプルアプリの Java ソースは次のようになっています。

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     * 「click me」ボタンをクリックした時の処理
     */
    public void  onClickBtn(View view) {
                //NAME の入力値を取得
        EditText input = (EditText)findViewById(R.id.name);

          //MESSAGE に 「Hello <NAME>」を表示する
        TextView message = (TextView)findViewById(R.id.message);
        message.setText("Hello " + input.getText());
    }
}

テストの準備

今回は Espresso よる UI テストを実施する方法を紹介します。

Espresso を用いたテストでは、ボタンをクリックする操作など、実際のアプリの操作をテストコードで記述し、UI の表示内容などを確認します。

Espresso を使用するためには、Android Studio で作成したプロジェクトに対し、追加で以下の設定を行います。

build.gradle の編集

app ディレクトリ内の build.gradle を開き、dependencies に以下の行を追加します。

dependencies {
    //↓追加
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test:rules:1.2.0'
}

さらに、defaultConfig 以下の設定を追加します。

defaultConfig {
    //↓追加
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

Espresso のセットアップ方法は、開発者ページでも詳しく解説されています。

Espresso のセットアップ手順

ポテパンダの一言メモ

Android のテストでは、JUnit を使った従来のテストを行うこともできます。UIが頻繁に変更されるアプリでは、UI のテストコードはすぐに古くなるため、使用する場合はポイントを絞り、通常のテストは JUnit を使った従来の API テストを実施することが多いです。

テストコードの作成

それでは、テストコードを作成していきます。

androidTest ディレクトリ内に、ActivityMainTest.java という名前で新しいクラスを作成します。

今回は、次の項目をチェックするテストを作成します。

  • 画面起動時は、NAME および MESSAGE は空欄であること
  • ボダンをクリックすると、MESSAGE に「Hello <NAME>」が設定されること。

上の項目を確認するテストコードは、次のとおり。

package com.example.myapplication;

import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

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

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

    @Test
    public void sampleTest() {
        // 起動時は NAME および MESSAGE ともに空欄であることをチェック
        onView(withId(R.id.name)).check(matches(withText("")));
        onView(withId(R.id.message)).check(matches(withText("")));

        // NAME に「Jon」を入力
        onView(withId(R.id.name)).perform(typeText(("Jon")));

        //「click me」ボタンをクリック
        onView(withId(R.id.btn)).perform(click());

        // MESSAGE に「Hello <NAME>」が設定されることをチェック
        onView(withId(R.id.message)).check(matches(withText("Hello Jon")));
    }
}

テストの実行

作成したテストコードを実行する場合は、対象のテストメソッドの上で、右クリック → [実行] の順に選択します。

テストを実行すると、エミュレーターまたは実機上でアプリが起動し、テストコードに従い自動的にアプリが操作されテストが行われます。

テスト結果が正常であれば、次のような表示になるでしょう。

テストに失敗すると、赤色のアイコン表示となり、出力メッセージにテストに失敗した原因が出力されます。

まとめ

Android Studio の UI テストツールである Espresso 使って、アプリの UI をテストする方法を紹介してきました。

Espresso を使用することで、より直感的なコードで UI のテストコードが作成できますので、是非試してみましょう。

【関連記事】
電卓アプリのサンプルコード!Java互換のKotlinでAndroidアプリを作る

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。