Developer Geek

Android Unit Testing 기본 구현 in Kotlin 본문

안드로이드

Android Unit Testing 기본 구현 in Kotlin

devGeek 2022. 6. 23. 13:14
반응형

 

 

Android Unit Test란

Android Unit Test 개요 모바일 앱 개발을 하는데 있어, MVVM, Jetpack, KMM(Kotlin Multiplatform) 등 다양한 트렌드를 볼 수 있다. 그 중 테스트 기술은 요즘 중요하고 선호하는 것 중 하나이다. 또한 테스트 기..

devgeek.tistory.com

개요

Unit Test

Unit testing은 개발자로 하여금 에러가 없는 좋은 코드를 만들 수 있도록 도와준다.
실제 앱을 바로 개발하기 보다는 개발 전에 Unit Test들을 작성하기를 추천하는데, 먼저 test들을 작성하면 실제 앱 개발은 테스트 가이드 라인에 맞춰 개발하면 된다.

기능 설명

  • 사용자에게 사용자 이름, 비밀번호, 비밀번호 확인을 입력받는 상황을 가정한다.
  • 사용자가 입력을 완료 했을 때, 정상적으로 완료 했는지 검사하는 기능(validRegistrationInput)이 있다.
    • 실패1: 사용자 이름 또는 비밀번호 또는 비밀번호 확인 입력 중 빈 값이 있는 경우
    • 실패2: 비밀번호 입력 값이 2자리 미만인 경우
    • 실패3: 비밀번호비밀번호 확인 값이 다른 경우
    • 실패4: 입력된 사용자 이름이 중복되는 경우

구현 예제

build.gradle(:Module): Unit Test를 위한 의존성 추가

안드로이드 신규 프로젝트를 생성하게 되면 기본적인 JUnitTest를 위한 의존성이 추가되어 있다.
이번에는 매우 기본적인 Unit Test를 진행하기 때문에 추가적인 의존성을 추가할 필요는 없다.

프로젝트를 생성했을 때의 기본 값이다.

dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.4.2'
    implementation 'com.google.android.material:material:1.6.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

}

RegistrationUtil.kt: 테스트 될 대상(객체) 구현

  • 테스트할 대상을 만들기 위해, 임의의 디렉토리에 RegistrationUtil.kt Object 파일을 만든다.
  • RegistrationUtil은 싱글톤이기 때문에 따로 오브젝트를 생성할 필요는 없다.
  • 3개의 인자(username, password, confirm password)를 받는 validRegistrationInput 함수를 구현한다. 이 함수는 테스트의 대상이된다.
object RegistrationUtil {

    private val existingUsers = listOf("Rahul", "Rohan")

    /**
     * The test cases will pass if..
     * ...username/password/confirmPassword is not empty
     * ...password is at least 2 digits
     * ...password matches the confirm Password
     * ...username is not taken
     */

    fun validRegistrationInput(
        userName: String,
        password: String,
        confirmPassword: String
    ): Boolean {
        /**
         * Write conditions along with their return statement
         * if (username | password | confirm password) are empty return false
         */
        if (userName.isEmpty() || password.isEmpty() || confirmPassword.isEmpty()) {
            return false
        }
        /** if username exists in the existingUser list return false */
        if (userName in existingUsers)
            return false
        /** if password does not matches confirm password return false */
        if (password != confirmPassword)
            return false
        /** if digit count of the password is less than 2 then return false*/
        if (password.count { it.isDigit() } < 2)
            return false
        return true
    }
}

RegistrationUnitTest.kt: 테스트 클래스 구현

테스트 파일 만들기

아래 사진 처럼 프로젝트의 패키지들 중 (test)라고 작성되어있는 패키지가 있다. 해당 패키지에 RegistrationUtilTest.kt 클래스 파일을 만든다.

Code

import org.junit.Assert.*
import org.junit.Test

class RegistrationUtilTest{
    /**
     * Write tests for the RegistrationUtil class considering all the conditions
     * annotate each function with @Test
     * We can use backtick to write function name..
     * whatever we write in those backtick will be considered as function name
     */
    @Test
    fun `empty username return false`(){

        // Pass the value to the function of RegistrationUtil class
        // since RegistrationUtil is an object/ singleton we do not need to create its object
        val result = RegistrationUtil.validRegistrationInput(
            "",
            "123",
            "123"
        )
        // assertThat() comes from the truth library that we added earlier
        // put result in it and assign the boolean that it should return
        assertFalse(result)
    }
    /**
     * follow the same for other cases also
     * in this test if username and correctly repeated password returns true
     */
    @Test
    fun `username and correctly repeated password returns true`() {
        val result = RegistrationUtil.validRegistrationInput(
            "Rahul",
            "123",
            "123"
        )
        assertFalse(result)
    }

    /** in this test userName already taken returns false */
    @Test
    fun `username already taken returns false`() {
        val result = RegistrationUtil.validRegistrationInput(
            "Rohan",
            "123",
            "123"
        )
        assertFalse(result)
    }

    /** if confirm password does not matches the password return false */
    @Test
    fun `incorrect confirm password returns false`() {
        val result = RegistrationUtil.validRegistrationInput(
            "Rahul",
            "123",
            "1234"
        )
        assertFalse(result)
    }

    /** in this test if password has less than two digits than return false */
    @Test
    fun `less than two digit password return false`() {
        val result = RegistrationUtil.validRegistrationInput(
            "Rahul",
            "abcd1",
            "abcd1"
        )
        assertFalse(result)

    }
}

Test 결과 확인

테스트 실행 밥법

작성한 테스트 코드(파일)을 실행하는 방법은 아래 이미지와 같이 해당 파일에서 마우스 우클릭을 통해 나온 옵션 중 Run 'RegistrationUtilTest...'를 선택해주면 된다.

테스트 결과

작성한 5가지의 테스트 모두 통과했다.

참고

 

Unit Testing in Android using JUnit - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

질문과 잘못된 점에 대해 말씀해주시는 건 언제나 환영입니다.
zero5.two4@gmail.com

반응형

'안드로이드' 카테고리의 다른 글

[Android] PendingIntent 란  (0) 2022.10.01
JUnit Annotations with Example in Kotlin  (0) 2022.06.24
Android Unit Test란  (0) 2022.06.21
Android Application Class란 in Kotlin  (0) 2022.06.17
Higher-Order Function(고차함수)란 in Kotlin  (0) 2022.06.14
Comments