Server/JUnit, Spock 18

Java - Spock으로 BDD 테스트하기! (JUnit 대체)

Spock Spock은 BDD(Behaviour-Driven Development) Framework입니다. TDD프레임워크인 JUnit과 비슷한 점이 많으나, 기대하는 동작과 테스트 의도를 더 명확하고 간결하게 드러내주는 큰 장점이 있습니다. 해당 포스팅에서는 Spock을 사용할 때의 이점과 사용 방법에 대해 알아보겠습니다. 테스트 아래의 MemberTier라는 enum에 대한 테스트를 진행하겠습니다. MemberTier는 각 멤버의 등급마다 다른 할인율을 적용해서 계산해주는 함수형 인터페이스를 필드로 가지고 있습니다. public enum MemberTier { BRONZE("할인율 0%", (price) -> { validPrice(price); return calPrice(price, 0); })..

Server/JUnit, Spock 2022.08.25

Spring Boot - Chaos Monkey를 활용한 운영 이슈 테스트!

이번 포스팅에선 카오스 엔지니어링을 할 수 있게 도와주는 라이브러리 Chaos Monkey For Spring Boot (CM4SB)에 대해 알아보자. 카오스 엔지니어링 아무리 훌륭한 기업이라도 운영 중인 어플리케이션에 장애 발생은 불가피하다. 이는 자주 접하는 장애일 수도 있고 뜬금없는 장애일 수도 있다. 이러한 장애를 미리 테스트해서 방지하거나 대책을 찾는 것을 카오스 엔지니어링이라고 한다. 카오스 엔지니어링 툴은 로컬에서는 경험하기 힘든 아래와 같은 이슈를 미리 확인해 볼 수 있는 툴이다. 네트워크 지연 서버 장애 디스크 오작동 메모리 누수 Chaos Monkey For Spring Boot (CM4SB) 란 ? Chaos Monkey For Spring Boot (CM4SB)란 Netflix에서..

Server/JUnit, Spock 2022.06.11

JUnit - TestContainers 사용하는 방법! (+ 장단점 비교)

CI / CD 자동화된 테스트 내가 회사에서 개발하는 서비스의 DB 환경은 아래와 같다. test 환경에서는 어떤 DBMS를 사용할 수 있는가? prod, stage -> mysql 5.7 dev -> mysql 5.7 test -> ? test 환경에서 h2 데이터베이스를 많이 사용한다. 이 경우 CI/CD에서 h2 데이터베이스를 사용해서 자동화된 테스트를 어렵지 않게 할 수 있다. 문제는 h2와 mysql은 다른 부분이 적잖게 존재한다. 가령 격리 수준, 전파 속성, 지원하는 SQL 등 차이점이 많이 존재한다. 실제 운영환경과 유사하게 테스트하기 위해서는 test용 db도 mysql로 실행해야 한다. 그래서 고민을 하게 된다. 로컬에서는 도커나 로컬DB를 띄워서 테스트할 수 있지만 CI/CD의 자동화..

Server/JUnit, Spock 2022.06.06

Mockito로 BDD 테스트 코드 작성하기 (BDDMockito)

BDD BDD란 Danial Terhorst-North와 Charis Matts가 TDD에서 착안한 방법론으로 행위 주도 개발(Behavior-Driven Development)을 말한다. 테스트 대상의 상태의 변화를 시나리오를 기반(Narrative)으로 테스트하는 패턴을 주로 사용한다. 이 때 권장하는 행동 패턴은 Given, When, Then 구조이다. 해당 패턴은 어떤 상태에서(Given) 어떤 행동을 했을 때(When) 어떤 결과가 되는 지(Then)를 테스트한다. BDDMockito 다양한 테스트 코드를 보면 Mockito를 사용할 때 when().thenReturn()와 given().thenReturn()패턴이 있는데 전자는 org.mockito.Mockito가 제공하는 기능이고 후자는 ..

Server/JUnit, Spock 2022.06.05

Mockito를 제대로 사용하는 방법들! (단위테스트)

우리는 JUnit Test에서 Mock을 위한 Framework 중 Mockito를 많이 사용한다. 해당 포스팅은 Mocking을 하는 과정에서 '어 이런 상황에는 어떻게 Mock 하지?' 라고 생각할 때 해결을 하기 위해 다양한 기법에 대해 다룬다. Mockito 기본 사용 천리길도 한 걸음부터라고 기본 사용 방법부터 보자. 먼저 의존성을 추가한다. testImplementation 'org.mockito:mockito-core:3.11.2' testImplementation 'org.mockito:mockito-junit-jupiter:3.11.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0' 이후 Mockito를 사용할 테스트 클..

Server/JUnit, Spock 2022.06.04

JUnit5 - 단위 테스트에서 프로퍼티 불러오기

테스트 코드를 작성하다보면 Property에서 값을 가져오는 일이 많이 생긴다. 그런데 @Value("${property-path}")를 사용해도 프로퍼티 값이 불러와지지 않는다. 해당 포스팅에서는 단위 테스트에서 프로퍼티를 가져오는 방법에 대해 다룬다. 1. @TestPropertySource @TestPropertySource를 사용하면 해당 파일의 프로퍼티를 읽을 수 있다. @TestPropertySource(locations = "classpath:application.yml")) @SpringBootTest(classes = UserService.class) public class UserServiceTest { private UserService userservice; @Value("${pro..

Server/JUnit, Spock 2022.06.02

Spring - OpenFeign을 Mocking하는 방법!

해당 포스팅은 테스트 시 OpenFeign의 FeignClient를 Mocking 하는 방법에 대해 다룬다. Product 코드 실제 코드단의 OpenFeign 코드이다. 매우 심플하다. 먼저 인터페이스를 보자. public interface CacheApiClient { Office getOfficeSetting(long officeNo); } 인터페이스를 사용하는 이유는 DIP 원칙을 지키기 위해서이다. 클라이언트를 필요에 따라 WebClient나 새로운 클라이언트로 변경이 가능하게 작성하기 위해서 사용처에서 인터페이스에 의존한다. 구현체는 아래와 같다. @FeignClient(name = "cache-api", url = "${domain.apis.cache-api}") public interfac..

Server/JUnit, Spock 2022.06.02

JUnit5 - Parameterized Tests

Parameterized Tests @ParameterizedTest 애노테이션을 @Test 애노테이션 대신 사용하면 여러 개의 파라미터 값에 대해 각각 테스트를 수행하는 코드를 간편하게 작성할 수 있다. @ParameterizedTest @ValueSource(ints = {0, 1, 3, 5, 15, -10, -200 Integer.MAX_VALUE}) void isInteger_ShouldReturnTrueForIntegers(int number) { assertTrue(Numbers.isInteger(number)); } ValueSource @ValueSource 애노테이션에 지정한 배열을 파라미터 값으로 넘기면 각 인수에 대해 테스트를 각각 실행한다. @ParameterizedTest @Val..

Server/JUnit, Spock 2022.05.29