일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- DataBinding
- 습관만들기
- 알고리즘 자바
- Kotlin
- WebView
- Android 12
- OkHttp Interceptor
- 영어독립365
- Android
- 안드로이드 fcm
- Android Navigation
- 66챌린지
- android recyclerview
- Android Interceptor
- 안드로이드 갤러리 접근
- Android DataBinding
- Android 12 대응
- Android Jetpack
- Java
- 안드로이드 카카오 로그인
- 영어공부
- scope function
- 프로그래머스 알고리즘
- MVP Architecture
- Android ProgressBar
- Kotlin FCM
- 안드로이드
- Android WebView
- Android ViewPager2
- 카카오 알고리즘
Archives
- Today
- Total
Developer Geek
Android Unit Testing 기본 구현 in Kotlin 본문
반응형
개요
Unit Test
Unit testing
은 개발자로 하여금 에러가 없는 좋은 코드를 만들 수 있도록 도와준다.
실제 앱을 바로 개발하기 보다는 개발 전에 Unit Test
들을 작성하기를 추천하는데, 먼저 test
들을 작성하면 실제 앱 개발은 테스트 가이드 라인에 맞춰 개발하면 된다.
기능 설명
- 사용자에게
사용자 이름
,비밀번호
,비밀번호 확인
을 입력받는 상황을 가정한다. - 사용자가 입력을 완료 했을 때, 정상적으로 완료 했는지 검사하는 기능(
validRegistrationInput
)이 있다.- 실패1:
사용자 이름
또는비밀번호
또는비밀번호 확인
입력 중 빈 값이 있는 경우 - 실패2:
비밀번호
입력 값이 2자리 미만인 경우 - 실패3:
비밀번호
와비밀번호 확인
값이 다른 경우 - 실패4: 입력된
사용자 이름
이 중복되는 경우
- 실패1:
구현 예제
build.gradle(:Module): Unit Test를 위한 의존성 추가
안드로이드 신규 프로젝트를 생성하게 되면 기본적인 JUnit과 Test를 위한 의존성이 추가되어 있다.
이번에는 매우 기본적인 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가지의 테스트 모두 통과했다.
참고
질문과 잘못된 점에 대해 말씀해주시는 건 언제나 환영입니다.
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