본문 바로가기

프로그래밍/테스트14

[kotlin] 레거시(legacy) 코드 리팩토링하기 3편 - 리팩토링 진행하기 1편 : 레거시(legacy) 코드 리팩토링하기 1편 - 테스트 코드를 작성해야하는 이유 2편 : 레거시(legacy) 코드 리팩토링하기 2편 - 리팩토링 진행하기 안녕하세요. 레거시를 리팩토링하는 3번째 시간입니다. 오늘은 이전 포스팅에서 만들어둔 라인커버리지 100%의 테스트코드에 대한 신뢰를 바탕으로 코드가 좋은 가독성을 가지는 방향으로 리펙토링을 실제로 진행해보고자 합니다. 환경 환경은 이전 시간과 마찬가지로 아래와 같습니다. 기본적인 테스트 프레임워크는 JUnit5를 사용하며 mockking을 위해서 Unit 테스트 라이브러리인 mockk를 추가로 사용합니다. // JUnit5 testImplementation("org.springframework.boot:spring-boot-starter-t.. 2022. 5. 16.
[kotlin] 레거시(legacy) 코드 리팩토링하기 2편 - 라인커버리지 100% 달성하기 안녕하세요. 오늘은 [kotlin] 레거시(legacy) 코드 리팩토링하기 1편에 이어서 테스트를 통해 실제로 라인커버리지를 100% 달성해보는 포스팅을 진행해보고자 합니다. 이전 편은 테스트 코드를 작성해야 하는 이유에 대해서 설명했습니다. 관심있으신 분들은 한번 보시는것을 추천드립니다. 환경 이번 포스팅과 다음 포스팅에 진행되는 test 환경에는 JUnit5와 코틀린 mock에 주로 사용하는 mockk 라이브러리를 이용하였습니다. build.gradle.kts의 implementation는 아래와 같이 선언하였습니다. // JUnit5 testImplementation("org.springframework.boot:spring-boot-starter-test") { exclude(group = "or.. 2022. 4. 23.
[kotlin] 레거시(legacy) 코드 리팩토링하기 1편 - 테스트 코드를 작성해야하는 이유 안녕하세요. 서비스의 시간이 오래되면 레거시 코드에 대해 고민이 생기기 마련입니다. 특히 이제는 퇴사한 사람이 남기고간 장황하고 이유를 알 수 없는 코드에 수정이 필요하게 되면 덜컥 겁이나기 시작합니다. 그런 코드들은 생성된 시간이 오래되면 오래될수록 공포감도 커지고 건들고 싶지 않아집니다. 하지만 그렇다고 수정을 안할수도 없습니다. 무작정 수정하게되면 실수 등에 의해서 잘 되던게 오히려 잘못 동작할수도 있습니다. 때문에 우리는 수정하기에 앞서 어느정도 안전장치를 만들어둘 필요가 있습니다. 그것이 바로 테스트 코드를 작성하는 것입니다. 오늘은 레거시 코드에 테스트 코드를 작성하고 커버리지를 올리는 방법에 대해서 알아보는 시간을 가져보도록 하겠습니다. 레거시 코드에 유닛 테스트 코드를 추가하면서 얻을 수 .. 2022. 4. 16.
[mockk] 코틀린 테스트 프레임워크에 대해서 알아보자 안녕하세요. 오늘은 코틀린 테스트 프레임워크인 mockk의 사용법에 대해서 알아보는 시간을 가져보도록 하겠습니다. mockk framework mockk는 코틀린 스타일로 테스트 코드를 작성할 수 있도록 도와주는 라이브러리입니다. 기존의 java에서 사용하시던 mockkito를 대체한다고 보시면 됩니다. mockk를 사용하기 위해서는 아래처럼 mockk에 대한 의존성을 주입해주실 필요가 있습니다. 포스팅을 쓰는 시점의 가장 최신 버전은 1.12.0 이므로 저는 이 버전을 사용하도록 하겠습니다. testImplementation("io.mockk:mockk:1.12.0") 테스트 서비스 예제 코드 mockk로 테스트를 만드는데 사용할 코드는 아래와 같습니다. 메인으로 테스트할 코드는 마지막에 있는 Mapp.. 2021. 9. 6.
[spring + spock + TestContainer] Spring, Spock Framework에서 기능 테스트 하기 - TestContainer 사용 안녕하세요. Spring에서 DB 기능 테스트를 할 때 어떤 걸 주로 이용하시나요? 제가 생각하기로는 여러분들은 로컬에서 쉽게 돌릴 수 있는 인메모리 DB인 H2를 가장 많이 사용하실 것 같습니다. 왜냐하면 사용하기 쉽기 때문이겠죠. 오늘제가 여러분들께 알려드리고자 하는 것은 조금 다른 기능 테스트 방법을 제공해주는 TestContainers입니다. H2를 사용하는 것과 어떻게 다르며 사용할 수 있는지 알아보도록 하겠습니다. :) TestContainer TestContainer는 로컬 환경에서 실제 DB에 테스트를 할 수 있도록 지원하는 Java 라이브러리입니다. DB라면 인메모리 DB인 H2를 사용하면 되지 않느냐? 라고 생각하실 수 있습니다. 그럼에도 불구하고 TestContainer를 왜 사용할까.. 2021. 4. 30.
[UNIT-TEST] Webflux Reactor 유닛 테스트 하기 안녕하세요. 오늘은 여러분들과 함께 알아볼 내용은 Webflux에서 채택하고 있는 Reactive Stream 프로젝트인 Reactor를 유닛 테스트하는 방법입니다. Reactive Stream의 경우 기존의 일반적인 로직과 다르게 Publisher(생산)와 Subscriber(구독)로 나누어져 있으며 각각이 서로를 의식하지 않은채 약한 결합으로 돌아갑니다. 그렇기 때문에 기존 우리가 짜던 구성으로는 테스트가 쉽지 않습니다. 따라서 테스팅을 용이하게 하기위한 구성 방법 및 테스팅 방법에 대해서 오늘 여러분들과 함께 공유하고자 합니다. 이번 포스팅에서 테스팅 프레임워크로 Spock을 사용하도록 하겠습니다. JUnit 5와 Reactor 테스팅 방법의 차이는 없으므로 동일하게 사용하셔도 좋습니다. 의존성 w.. 2020. 12. 17.
[Spock] Spock Framework 이용하기 - Where [Spock] Spock Framework 이용하기 - 개론편 [Spock] Spock Framework 이용하기 - 실습편 [Spock] Spock Framework 이용하기 - Mock [Spock] Spock Framework 이용하기 - Where 안녕하세요. 오늘은 Spock Framework의 4번째 시간입니다. 오늘 Spock Framework의 Where에 대해서 배워보도록 하겠습니다. Spock의 Where을 잘 사용할 수 있게 되면 데이터가 다르고 로직이 동일한 테스트에 대해 발생하는 중복 코드를 많이 제거할 수 있습니다. Introduction Math.max가 정상적으로 동작하는 지 검증하는 테스트 메서드를 작성해보도록 하겠습니다. 아래와 같이 2개의 파라미터 중 더 큰값이 정상적으.. 2020. 9. 4.
[Spock] Spock Framework 이용하기 - Mock [Spock] Spock Framework 이용하기 - 개론편 [Spock] Spock Framework 이용하기 - 실습편 [Spock] Spock Framework 이용하기 - Mock [Spock] Spock Framework 이용하기 - Where 안녕하세요. 오늘은 Spock Framework의 3번째 시간입니다. 이전 포스팅, [Spock] Spock Framework 이용하기 - 개론편과 [Spock] Spock Framework 이용하기 - 실습편에서는 이론과 실전을 하나하나 살펴보았습니다. 오늘은 좀 더 나아가 Spock Framework에서 Mock과 Stub을 어떻게 사용하고 활용할 수 있는지에 대해서 알아보는 시간을 가지도록 하겠습니다. Mock이란 개념에 생소하신 분들은 What .. 2020. 9. 2.
[Spock] Spock Framework 이용하기 - 실습편 [Spock] Spock Framework 이용하기 - 개론편 [Spock] Spock Framework 이용하기 - 실습편 [Spock] Spock Framework 이용하기 - Mock [Spock] Spock Framework 이용하기 - Where 안녕하세요. 오늘 포스팅할 주제느 Spock Framework 이용하기 Block편입니다. Spock Framework는 Spock Framework 이용하기 - 개론편에 이어서 2번째 시간인데요. 저번 시간에는 개론에 집중했다면 오늘은 실제로 Spock Framework를 이용하여 테스트를 만들어보고 사용해보는 시간을 가지려고 합니다. 실제 테스트는 Spock Framework의 Feature Methods 요소를 이용합니다. feature metho.. 2020. 8. 26.
[Spock] Spock Framework 이용하기 - 개론편 [Spock] Spock Framework 이용하기 - 개론편 [Spock] Spock Framework 이용하기 - 실습편 [Spock] Spock Framework 이용하기 - Mock [Spock] Spock Framework 이용하기 - Where 안녕하세요. 이전에 유닛테스트의 중요성 및 JUnit5에 대해서 포스팅을 했었습니다. 다들 도움이 되셨었나요? 오늘은 Spring에서 JUnit과 함께 많이 사용되는 Spock Framework에 대해서 알아보는 시간을 가지도록 해보겠습니다. 오늘은 Specification까지 알아보며 실제 사용은 다음 포스팅의 Block편에서 다루도록 하겠습니다. Spock Framework Spock은 java와 groovy application을 테스팅하기 위한 .. 2020. 8. 20.
[Junit5] Assertions과 Assumptions - Assumptions편 안녕하세요. 오늘은 JUnit5의 3번째 시간입니다. 이번 포스트에서는 Assertions와 Assumption중 Assumptions에 대해서 좀 더 자세히 알아보는 시간을 가지도록 하겠습니다. Assumptions Assumption 구문은 테스트 메서드가 특정한 조건에 대해서 실행하고자 할 때 사용하는 구문입니다. JUnit5에서는 org.junit.jupiter.api.assumptions 패키지의 내용물로 사용할 수 있습니다. 사전조건 테스트를 위한 사전 조건으로 사용하는 Class는 아래와 같습니다. 해당 Class는 사칙연산을 담당하는 클래스로 add, multiply, divide를 메서드로 가지고 있습니다. private final Calculator calculator = new Cal.. 2020. 5. 7.
[Junit5] Assertions과 Assumptions - Assertions편 안녕하세요. 오늘은 저번 포스팅에 이어서 JUnit5에서 제공하는 Assertions과 Assumptions에 대해서 조금더 디테일하게 알아보는 시간을 가져보도록 하겠습니다. 내용은 JUnit5 Guide에 나오는 내용을 기본으로 제 나름대로의 필요한 내용을 추가하는 식으로 진행하도록 하겠습니다. Assertions는 번역하면 단정문이라고 합니다. assertions는 만약 성공하지 않으면 테스트를 실패처리를 하기 위해서 사용합니다. Assumption은 번역하면 가정문이라고 합니다. assumptions는 특정 상황에서만 test문을 실행하고자 할때, 반대로 특정 상황에서만 실행하지 않고자할 때 사용하는 키워드입니다. 여기서 말하는 특정 상황이라는 것은 local환경 등을 들 수 있습니다. Assert.. 2020. 5. 3.