LoginSignup
2
4

More than 1 year has passed since last update.

Android StudioでEspressoを使ったUIテストのやり方

Posted at

はじめに

EspressoはAndroid StudioのUIテスト(画面のテスト)が出来ます。その使い方を紹介します。

今回は・・・

以下のようなアプリケーションがあるとします。

MainActivity.java
package com.websarva.wings.android.uitest1;

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 {

    private TextView textView;
    private EditText editText;
    private String text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView=findViewById(R.id.text);
        editText=findViewById(R.id.editTextTextPersonName);
    }

    //ボタンを押すと挨拶を表示
    public void display(View view){
        text=editText.getText().toString();
        textView.setText(text+"さん、こんにちは!");

    }


}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editTextTextPersonName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="216dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="名前を入力"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.497"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="268dp"
        android:onClick="display"
        android:text="表示"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

画面はこんな感じ
Screenshot_20211223-030245.png

名前を入力して「表示」を押すと、挨拶が表示される。
Screenshot_20211223-030313.png
このアプリケーションのUIテストをします。

手順

build.gradleに以下を追加

androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestImplementation 'androidx.test:rules:1.1.0'

androidTestにテストクラスを作る
下の画像のようにパッケージ名(andoidTest)と書かれているフォルダがあります。すでにExampleInstrumentedTest.javaがありますね。ここにクラスを作ります。
スクリーンショット 2021-12-23 135527.png
いつも通り、フォルダの上で右クリック→New→Java Class。名前はEsTestにしときます。スクリーンショット 2021-12-23 140333.png

どんなUIテストでも必要なコード
ではこのEsTest.javaに以下を書きましょう。

EsTest.java
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 EsTest {
    private String stringToBetyped;

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

    @Before
    public void initial(){
        //事前処理
    }

    @Test
    public void listGoesOverTheFold() {
        //テスト内容
    }
}

上がUIテストコードの雛形です。「事前処理」と「テスト内容」のところを穴埋めします。
穴埋めした結果が以下です。

EsTest.java
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.replaceText;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;

import static androidx.test.espresso.Espresso.onView;
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 EsTest {
    private String stringToBetyped;

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

    @Before
    public void initial(){
        stringToBetyped="たなか";
    }

    @Test
    public void listGoesOverTheFold() {
        onView(withId(R.id.editTextTextPersonName)).perform(replaceText(stringToBetyped));
        onView(withId(R.id.button)).perform(click()); 
        onView(withId(R.id.text)).check(matches(isDisplayed()));
    }
}

穴埋めしたコードの説明をします。
initialでは、初期化で後のテストで使いたい変数を定義します。

  @Before
    public void initial(){
        stringToBetyped="たなか";
    }

listGoesOverTheFold()ではUIテストを行います。基本は下の形です。

onView(withId(目標の部品のid)).perform(やりたいこと);
onView(withId(目標の部品のid)).check(チェックしたいこと);

例えばコードにある

onView(withId(R.id.editTextTextPersonName)).perform(replaceText(stringToBetyped));

onView(withId(名前の欄を)).perform("たなか"のテキストにする);

ということです。

onView(withId(R.id.button)).perform(click());

onView(ボタンを).perform(クリックする);

ですし、

onView(withId(R.id.text)).check(matches(isDisplayed()));

onView(挨拶のテキストが).check(表示されているか);

になります。つまり
名前の欄に"たなか"と入力してボタンを押したら、挨拶のテキストが表示されるのかをテストするコードです。

いざ、テスト!
EsTest.javaのファイルの上で右クリック→Runしてください。すると、下のようにテストを通過出来たことが分かります
スクリーンショット 2021-12-25 110320.png

もし、

   public void display(View view){
        text=editText.getText().toString();
        //textView.setText(text+"さん、こんにちは!");
    }

このようにテキストが表示されないコードを書いてテストすると
スクリーンショット 2021-12-25 110358.png
テストが通過出来なかったことが分かります。

終わりに

少しでも参考になれば幸いです!

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4