이 글을 쓰게 된 이유
Java의 JUnit을 기반으로 문서들을 보다보니, Java의 assert와 Kotlin의 assert가 다른 것들을 알게 되었다. 예를 들어 Java에서 asserThat을 사용해 동일성을 테스트 하려면 다음과 같이 작성해야 한다.
assertThat("a", is("a"))
하지만 이를 Kotlin의 assert로 바꾸면 다음과 같이 된다.
assertEquals("a","a")
이러한 차이가 여러개 있다 보니 Unit Testing을 알아보는데 방해가 되어서 이번 글에서 정리하고 넘어가고자 한다.
Kotlin의 assert
Kotlin에는 다양한 assert가 있다. 그 중 자주 사용되는 것은 assertEquals, assertNotEquals, Assert.assertTrue, Assert.assertFalse, Assert.assertThrows, Assert.assertNotNull, Assert.assertNull 이다. 이번 글에서는 이들에 대해 알아볼 것이다.
assertEquals, assertNotEquals : 동등성 비교를 위한 연산자
assertEquals와 assertNotEquals는 인스턴스의 동등성 비교를 위해 사용한다.
assertEquals의 앞에는 나오기 기대되는 값이 오며, 뒤에는 실제 테스트에서 나온 값이 온다. 예를 들어 테스트에서는 "b"가 나왔는데 나오기를 기대한 값은 "a" 라면 다음과 같이 작성된다. 만약 둘이 같다면 테스트가 통과되고 다르다면 테스트가 실패한다.
Assert.assertEquals("a", "b")
assertNotEquals는 나오면 안되는 값이 앞에 오며, 테스트 결과가 뒤에 온다. 만약 둘이 다르다면 테스트가 통과되고 같다면 테스트가 실패한다.
Assert.assertNotEquals("a", "b")
assertTrue, assertFalse : 참, 거짓 확인을 위한 연산자
assertTrue와 assertFalse는 참과 거짓 확인을 위한 연산자이다. assertTrue의 입력으로 참이 오면 테스트가 통과하고 거짓이 오면 테스트가 실패하며 assertFalse는 그 반대이다.
Assert.assertTrue(true)
Assert.assertFalse(false)
assertThrows : 예외 발생 확인을 위한 연산자
만약 특정 메서드가 예외를 발생시켜야 한다면 assertThrows를 사용할 수 있다. assertThrows는 첫째 파라미터로 발생할 예외를 특정하며, 둘째 파라미터는 람다식으로 특정한 메서드를 실행한다. 만약 둘째 파라미터의 람다식이 첫째 파라미터의 예외를 발생시키면 테스트가 통과한다.
Assert.assertThrows(IllegalStateException::class.java) {
throw IllegalStateException()
}
예를 들어 아래와 같이 사용될 수 있다.
Assert.assertThrows(IllegalStateException::class.java) {
loginUseCase.logIn("error", "error")
}
assertNotNull, assertNull
assertNotNull과 assertNull은 파라미터로 받는 값이 null인지 여부를 확인하기 위한 연산자이다. assertNotNull의 입력이 null이 아닌 값이 오면 성공하고, null이 오면 실패한다. assertNull은 그 반대이다.
Assert.assertNotNull("a")
Assert.assertNull(null)
정리
이번 시간에는 JUnit의 다양한 assertion에 대해 알아보았다. 테스트 코드 또한 유지 보수 되어야 하는 코드이기 때문에 가독성이 매우 중요하다. 테스트가 생긴 초창기에는 모든 assertion이 assert나 assertTrue로 작성된 적도 있었다. 하지만 선배 개발자들은 테스트의 가독성을 위해 다양한 표현을 넣는 것이 중요하다는 판단을 내렸고, 다양한 assertion을 만들어 가독성을 개선시켰다.
예를 들어 아래와 같이 쓰는 것보다.
Assert.assertTrue("a" == "a")
아래와 같이 쓰는 것이 가독성이 뛰어나다.
Assert.assertEquals("a", "a")
영어에서도 Yes를 대체할 수 있는 단어는 Certainly, Sure 등등 다양하다. 좋은 소통을 위해서는 하나만 쓰기 보다 상황에 맞는 적절한 단어를 쓰는 것이 중요하다. 어떤 것이 테스트 코드 독자에게 가독성이 좋을지 판단하는 것은 테스트 코드 작성자에게 달렸다. 이 글에서 알아본 다양한 표현을 통해 테스트 코드의 가독성을 높이도록 하자.
'Unit Testing' 카테고리의 다른 글
Test Double이란 무엇인가? Test Double의 종류, 사용법 알아보기 (0) | 2022.12.18 |
---|---|
Unit Testing에서 Test Double이 필요한 이유는 무엇일까? (0) | 2022.12.17 |
IntelliJ, Android Studio에서 Test Coverage 확인과 Test Coverage의 한계점 (0) | 2022.12.15 |
IntelliJ, Android Studio에서 Test 결과를 시각적으로 확인하는 방법 : Gradle 사용 (0) | 2022.12.14 |
Command Line에서 Test 실행하기 : Gradle Task 활용하기 (0) | 2022.12.13 |