정상에서 IT를 외치다

[Android, Espresso] Ui Test using Espresso 본문

안드로이드

[Android, Espresso] Ui Test using Espresso

Black-Jin 2018. 10. 8. 11:01
반응형


안녕하세요. 블랙진입니다.

안드로이드 테스트에 관한 포스팅을 진행하고 있습니다.


아래는 이전 포스팅 내용입니다.


UnitTest, UiTest 기본 예제

UnitTest using mockito


이번 시간에는 Ui 테스트를 할 수 있는 espresso 에 관해 살펴보겠습니다.






귀여운 아이콘의 espresso!!



1. app 단계의 build.gradle 에 아래 라이브러리가 있는지 확인합니다.

android {
compileSdkVersion 28
defaultConfig {
applicationId "packageName"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"

// Espresso framework
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

// junit framework
testImplementation 'junit:junit:4.12'

// Mockito framework
testImplementation 'org.mockito:mockito-core:2.22.0'

// Espresso framework
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
}

안드로이드 3.1.3 버전 기준으로 새 프로젝트를 만들면 테스트 라이브러리가 자동으로 설정되어 있을 수도 있습니다. 본인의 프로젝트와 확인하고 없는 라이브러리만 추가해 주세요



2. 테스트 스토리


제가 테스트할 UI 스토리에 대해서 설명하겠습니다.


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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">

<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">

<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

</android.support.constraint.ConstraintLayout>

1. editText 의 문구를 입력합니다.

2. editText 의 문구가 textView 에 동일하게 입력됩니다.

3. textView 의 문구가 editText 의 기대값과 같으면 button 을 클릭합니다.


MainActivity.kt

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

editText.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(p0: Editable?) {

}

override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {

}

override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
textView.text = p0
}
})


button.setOnClickListener { Toast.makeText(this, textView.text, Toast.LENGTH_SHORT).show() }
}
}

editText 의 addTextChangedLister 를 설정하여 textView 에 editText 의 문구가 동일하게 입력되도록 하였습니다.

그리고 button 클릭시 textView 의 text 가 출력되는 예제입니다.



3. HelloWorldEspressoTest


src/androidText/java 에 HelloWorldEspressoTest 파일을 생성합니다.


import android.support.test.espresso.Espresso;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;

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

import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
import static android.support.test.espresso.action.ViewActions.typeText;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;

@RunWith(AndroidJUnit4.class)
public class HelloWorldEspressoTest {

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

@Test
public void listGoesOverTheFold() {

//editText 에 Hello World! 입력하고 키보드를 내립니다.
Espresso.onView(withId(R.id.editText)).perform(typeText("Hello World!"), closeSoftKeyboard());

//textView 의 값이 "Hello World!" 인지 확인합니다.
Espresso.onView(withId(R.id.textView)).check(matches(withText("Hello World!")));

//button 을 클릭합니다.
Espresso.onView(withId(R.id.button)).perform(click());
}
}

설명은 주석을 참고해 주세요.



4. Annotation 설명


출저 Android Testing Part1:Expresso Basic



출저 androidTest - Taehwan



출저에 표시한 두 사이트는  테스트 코드 작성에 많은 참고가 된 사이트 입니다. 위 설명 말고도 해당 사이트에 들어가 내용을 확인해 보면 더욱 좋을 것 같습니다.



5. 실행하기


HelloWorldEspressoTest 파일을 우클릭 한후 Run HelloWorldEspressoTest 를 클릭하면 테스트가 진행됩니다. 이때 디바이스 혹은 예물레이터가 있어야 됩니다. 

반응형
Comments