본문 바로가기

TDD6

[Kotlin] Kotest 사용해보기 코틀린에는 kotest라는 테스트 프레임워크가 존재합니다. 코틀린을 사용한다면 자바에서 사용하던 assertj대신 한 번쯤 kotest를 사용해보는 것도 좋다고 생각합니다. 간단히 java에서 사용하던 방식의 테스트를 작성하고 해당 코드를 kotest로 변경하는 과정을 소개해보겠습니다. Quick Start kotest는 JUnitPlatform gradle plugin을 사용합니다. 최소 4.6 버전 이상의 Gradle이 필요하기 때문에 버전을 꼭 확인해야 합니다. (최근에는 gradle 7.x 버전이 나오고 있기 때문에 새 프로젝트라면 큰 문제는 없습니다.) // gradle + groovy test { useJUnitPlatform() } // dependency testImplementation .. 2022. 5. 4.
[Java] @BeforeEach와 독립적인 단위 테스트 테스트 코드를 작성하다보면 공통적으로 갖는 상태를 필드 변수로 선언하고 @BeforeEach 애노테이션을 사용하여 각 테스트가 실행 되기 전 필드 변수를 초기화 해줍니다. 테스트 메서드마다 상태를 초기화할 수 있어 독립적으로 테스트를 유지할 수 있고 테스트가 돌아가는 지점의 코드가 간결해져 많이 이용하곤 하는데요. 정말 BeforeEach를 사용하는 것이 좋은 점만 있을까요? @BeforeEach의 사용으로 인해 발생하는 문제점을 알아보고 이 문제를 해결할 수 있는 방안에 대해 포스팅해보려합니다. BeforeEach를 사용한 테스트코드 먼저 @BeforeEach를 사용하여 테스트 픽스처를 초기화하는 테스트를 간단하게 만들어봅시다. class WalletTest { private Wallet wallet;.. 2022. 4. 6.
[Java] Mockito를 사용하여 TDD 적용해보기 최근 우아한 테크 코스 교육 입과 선물(?)로 배민 5000원 쿠폰을 받았습니다. 감사하게도 쿠폰을 받았는데 가만히 있을 수 없죠. 이 쿠폰이 생성되는 과정을 Mockito를 사용하여 TDD 적용해보겠습니다. 물론 실제처럼 작성하려 하면 굉장히 복잡할테니 엄청난 축약 버전으로 코드를 작성해보고자 합니다. 본문을 시작하기 앞서 왜 Mocking을 하는 것일까요? 실제로 개발을 할 때는 다른 팀, 외부 관계사 등등 다양한 포인트로 요청을 보낼 것입니다. 그런데 테스트 코드를 작성할 때 각 실제 포인트로 요청을 보내야 할까요? 저는 아니라고 생각합니다. 갑작스런 전사휴가(?) 혹은 점검으로 응답을 받지 못하는 등 이유가 있겠죠 ㅋㅋ. (반박 댓글점 부탁드립니다 ㅋ) 그래서 대역을 사용하는 것이고 그 중에서도 .. 2022. 2. 17.
[Java] JUnit으로 System.in, System.out 테스트하기 deep dive 레벨 1 미션 레이싱카는 콘솔을 기반으로 진행됩니다. 1단계를 진행하며 작성한 단위 테스트에서는 입, 출력값을 테스트 할 필요가 없었지만 2단계 미션인 MVC리팩토링 과정에서는 컨트롤러를 테스트하는 방법에 대해 많이 고민하게 될 텐데요. 이번 포스팅에서는 입, 출력값에 대한 테스트를 추상클래스로 작성하여 상속을 통해 실제 테스트가 진행되는 코드를 깔끔하게 유지하면서 I/O를 테스트 할 수 있는 코드를 작성해보고자 합니다. Scanner 와 System.in 먼저 테스트를 진행하기 위해서는 사용자가 원하는 입력값을 입력해야 합니다. 이번 미션의 프로덕션 코드에서 아래 예시처럼 Scanner 인스턴스를 System.in 인자로 생성 했을텐데요. Scanner scanner = new Scanner(Syste.. 2022. 2. 16.
[Java] 대역으로 Junit 테스트 코드 작성하기 지난 포스팅에서 Random 값을 테스트 할 수 있는 StubNumberGenerator 를 만들어 간단하게 테스트를 진행해보았다. 이번 포스팅에서는 레벨 1 미션의 랜덤값에 의한 테스트를 자유자재로 할 수 있는 스텁 객체를 만들고자 한다. Stub 이란? Stub이란 구현을 단순한 것으로 대체한 것이다. 테스트에 맞게 단순히 원하는 동작을 수행해준다. 대역 테스트에는 실제 동작을 구현하는 Fake, 호출된 내용을 기록하는 Spy, 기대값을 반환 받는 Mock이 있다. 이번 테스팅은 단순히 원하는 동작을 수행해준다는 의미에서 Stub이라고 접두사를 붙였다. 처음 Stub 객체를 작성할 때는 내가 작성한 테스트가 동작하기 위한 객체를 만들었다. public class StubNumberGenerator i.. 2022. 2. 15.
[Java] 인터페이스로 분리하여 객체 테스트하기 level 1 첫 미션으로 프리코스에서 진행한 racingGame 을 페어 프로그래밍으로 구현하는 미션을 받았다. TDD로 구현하라는 미션덕분에 많은 크루들이 Random 값을 테스트하는 방법, System.in을 테스트하는 방법에 대해 궁금증을 품었고 그 중에서도 Random 값에 대한 테스트에 어려움을 겪었던 것 같다. 내 코드와 리뷰 나는 과거 Mockito를 사용한 경험이 있어 Mockito 라이브러리를 가져와 임의의 랜덤값을 제공하는 가짜 객체를 만들어 테스트 했다. MockRandomGenerator Random 값을 가짜로 전달해줄 수 있는 임의의 추상 클래스를 생성하여 상속받아 테스트했다. public abstract class MockRandomGenerator { MockedStatic.. 2022. 2. 13.