-
1. 리펙토링 준비Kotlin/실전! 코틀린과 스프링 부트로 ... 개발 2023. 7. 31. 16:00
1. 도서관리 애플리케이션 이해하기
2. 테스트 코드란 무엇인가, 그리고 왜 필요한가?!
테스트 코드는 왜 필요한가?!
- 1. 개발 과정에서 문제를 미리 발견할 수 있다.
- 2. 기능 추가와 리팩토링을 안심하고 할 수 있다.
- 3. 빠른 시간 내 코드의 동작 방식과 결과를 확인할 수 있다.
- 4. 좋은 테스트 코드를 작성하려 하다보면, 자연스럽게 좋은 코드가 만들어 진다.
- 5. 잘 작성한 테스트는 문서 역할을 한다. (코드리뷰를 돕는다.)
3. 코틀린 코드 작성 준비하기
plugins { id 'org.jetbrains.kotlin.jvm' version '1.6.21' } dependencies { implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' } compileKotlin { kotlinOptions { jvmTarget = "11" } } compileTestKotlin { kotlinOptions { jvmTarget = "11" } }
4. 사칙연산 계산기에 대해 테스트 코드 작성하기
테스트 코드의 3부분 ( given - when - then 패턴 )
- 1. 테스트 대상을 만들어 준비하는 과정
- 2. 실제 우리가 테스트하고 싶은 기능을 호출하는 과정
- 3. 호출 이후 의도한대로 결과가 나왔는지 확인하는 과정
5. 사칙연산 계산기의 나눗셈 테스트 작성
6. Junit5 사용법과 테스트 코드 리팩토링
Junit5에서 사용되는 5가지 어노테이션
@Test - 테스트 메소드를 지정한다.
- 테스트 메소드를 실행하는 과정에서 오류가 없으면 성공한다.@BeforeEach - 각 테스트 메소드가 수행되기 전에 실행되는 메소드를 지정한다. @AfterEach - 각 테스트가 수행된 후에 실행되는 메소드를 지정한다. @BeforeAll - 모든 테스트 수행하기 전에 최초 1회 수행되는 메소드를 지정한다. @AfterAll - 모든 테스트를 수행한 후 최후 1회 수행되는 메소드를 지정한다. - BeforeAll, AfterAll 에는 @JvmStatic 을 붙여줘야 한다.
class JunitTest { companion object { @BeforeAll @JvmStatic fun beforeAll() { println("모든 테스트 시작 전") } @AfterAll @JvmStatic fun afterAll() { println("모든 테스트 종료 후") } } @BeforeEach fun beforeEach() { println("각 테스트 시작 전") } @AfterEach fun afterEach() { println("각 테스트 종료 후") } @Test fun test1() { println("테스트 1") } @Test fun test2() { println("테스트 2") } }
단언문
- assertThat(확인하고 싶은 값)
- .isEqualTo(기대값)
- .isTrue / .isFalse : 주어진 값이 true 인지 / false 인지 검증
- .hasSize(기대값) : 주어진 컬렉션의 size가 원하는 값인지 검증
val people = listOf(Person("A"), Person("B")) assertThat(people).extracting("name").containsExactlyInAnyOrder("A","B")
- 주어진 컬렉션 안의 item 들에서 name 이라는 프로퍼티를 추출한 후, 그 값이 A와 B인지 검증 (이 때 순서는 중요하지 않다)
- .coinsExactly : 순서까지 체크
assertThrow<IllegalArgumentException> { function1() }
- function1 함수를 실행했을 때 IllegalArgumentException 이 나오는지 검증
val message = assertThrows<IllegalArgumentException> { function1() }.message assertThat(message).isEqualTo("잘못된 값이 들어왔습니다")
- message 를 가져와 예외 메시지를 확인할 수도 있다.
7. Junit5으로 Spring Boot 테스트하기
Spring Boot 의 Layered Architecture
- 스프링 컨텍스트에 의해 관리되는 Bean
ㆍController - Service - Repository
- 순수한 Java 객체(POJO)
ㆍDomain
Spring Boot 각 계층을 테스트 하는 방법
- Domain 계층
ㆍ클래스를 테스트하는 것과 동일
- Service, Repository 계층
ㆍ스프링 빈을 사용하는 테스트 방법 사용 (@SpringBootTest)
ㆍ데이터 검증 위주
- Controller 계층
ㆍ스프링 빈을 사용하는 테스트 방법 사용 (@SpringBootTest)
ㆍ응답 받은 JSON을 비롯한 HTTP 위주의 검증
어떤 계층을 테스트 해야 할까?!
- 당연히 BEST는 모든 계층에 대해 많은 case를 검증하는 것!
- 하지만 현실적으로 코딩 시간을 고려해 딱 1개 계층만 테스트 한다면...
ㆍ개인적으로 (보통은) Service 계층을 테스트 합니다!
ㆍA를 보냈을 때 B가 잘나오는지, 원하는 로직을 잘 수행하는지 검증할 수 있기 때문
8. 유저 관련 기능 테스트 작성하기
9. 책 관련 기능 테스트 작성하기
10. 테스트 작성 끝! 다음으로!
- 작성한 모든 테스트를 돌리고 싶을 때
ㆍ(터미널) ./gradlew test
ㆍGradle - Tasks - verification - test
정리
1. Kotlin을 사용하기 위해 필요한 설정 방법
2. 테스트란 무엇이고, 왜 중요한가
3. Junit5의 기초 사용법
4. Junit5와 Spring Boot를 함께 사용해 테스트를 작성하는 방법
5. 여러 API에 대한 Service 계층 테스트 실습
'Kotlin > 실전! 코틀린과 스프링 부트로 ... 개발' 카테고리의 다른 글
6. 네 번째 요구사항 추가하기 - Querydsl (0) 2023.08.08 5. 세 번째 요구사항 추가하기 - 책 통계 (0) 2023.08.08 4. 두 번째 요구사항 추가하기 - 도서 대출 현황 (0) 2023.08.07 3. 첫 번째 요구사항 추가하기 - 책의 분야 (0) 2023.08.05 2. Java 서버를 Kotlin 서버로 리팩토링 (0) 2023.08.02