アプリ開発の現場では、プログラムは作って終わりではなく、それが想定どおりに動作するのか確認するテスト工程をかならず実施します。
この記事では、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 のセットアップ方法は、開発者ページでも詳しく解説されています。
テストコードの作成
それでは、テストコードを作成していきます。
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 のテストコードが作成できますので、是非試してみましょう。
Android のテストでは、JUnit を使った従来のテストを行うこともできます。UIが頻繁に変更されるアプリでは、UI のテストコードはすぐに古くなるため、使用する場合はポイントを絞り、通常のテストは JUnit を使った従来の API テストを実施することが多いです。