반응형

TDD 9

[JUnit5] Archunit 라이브러리를 이용한 아키텍처 테스트

간혹 통합테스트를 작성하다보면 아래와 같은 생각이 들곤 한다. "비즈니스 로직이 의도한대로 작동되는지 테스트는 할 수 있겠어. 하지만 로직 외에 아키텍처 의존성을 테스트할 수는 없을까?" Archunit 라이브러리를 이용하면 아키텍처 의존성, 클래스명 등을 테스트할 수 있다! 참고로 Archunit Guide는 아래 링크에서 확인할 수 있다. https://www.archunit.org/userguide/html/000_Index.html#_introduction ArchUnit User Guide ArchUnit is a free, simple and extensible library for checking the architecture of your Java code. That is, ArchUnit..

[Spring][TDD] RestAssured를 이용한 e2e test로 Controller API까지 통합 테스트해보자

그동안 나는 단위 테스트만을 진행해왔다. 도메인 로직이 잘 실행되는지 junit 문법의 Assertions로 테스트해왔다. dao test는 @JdbcTest를 이용하여 단위테스트를 했고, service test는 fake 객체를 만들어주어 단위 테스트를 진행해주었다. 그런데 컨트롤러는 @RestController에서 @RequestBody로 request를 받고, ResponseEntity를 넘겨주기 때문에 웹 애플리케이션을 직접 실행하면서 테스트하지 않는 이상, 어떻게 테스트해야할지 감이 오지 않았다. RestAssured를 이용하면 API response의 statusCode뿐만 아니라 body에 올바른 값이 담기는지도 테스트가 가능하다! 이번 시간에는 Spring 환경에서의 RestAssured를..

[220225][JAVA] 크리스와 페어 협업미션을 통해 배운 점 (로또(자동) 미션)

로또 1단계 미션을 크리스와 함께 진행하였다. 크리스는 보이는 라디오에서도 나와 같이 활동했고, 회식도 함께 진행한 덕에 서로 편하게 소통할 수 있었으며, 거주지도 서로 가까워 페어 미션동안 오프라인으로 만나면서 진행하였다. 이번 시간에도 페어에게 정말 많은 걸 배울 수 있었고, 크리스에게 java 개념들과 특정 구조에 대한 이점을 배울 수 있었다 :) 정규식 성능 개선 그 동안은 정규식 String만 따로 위에 빼준 다음에, String.matches()로 정규식을 비교해주었다. 그러나, String.matches()를 이용할 경우 아래와 같은 작업이 발생한다. matches 과정마다 Pattern.compile이 발생하는데, 이 때 Pattern.compile이 컴파일 과정에서 성능을 좀 많이 잡아먹..

[TDD 리팩토링] @ParameterizedTest을 이용한 테스트 메소드에서의 여러 값 검증

아래의 테스트 코드를 한 번 보자. 빈 문자열 또는 null일 경우 0을 반환해주게 하는 테스트 코드이다. 또 다른 테스트 코드도 한 번 보자. 방금 보여준 두 개의 테스트 코드는 모두 어딘가에 하자(?)가 존재한다. 바로바로... 하나의 테스트 메소드에 불필요하게 너무 많은 assert문이 존재한다는 것이다! 이러한 경우는 보통, 검증을 제대로 못했거나, 하나의 메소드에 하나의 test라고 생각했지만 여러 개의 test를 묶어놓은 경우이다. 우리는 위 코드들을 알아보기 쉽게 리팩토링해볼 것이다. 1. @ParameterizedTest 이용 먼저 맨 처음 테스트코드 먼저 고쳐보자. 사실 리뷰어(이하 미르)의 피드백을 받기 전까진 @ParameterizedTest가 무엇인지도 몰랐다. @Parameteri..

[211219] 유스콘 2021 웨비나 컨퍼런스를 듣고 왔다

우아한형제들, 인프랩, 넥스트스탭에서 주최한 유스콘 2021 웨비나를 듣고 왔다. 마침 어떻게 공부할지 고민이 많기도 했고, 웨비나 들은 경험이 많이 없기도 했으며, 스프링과 java 웨비나라서 한 번 들어보는 것도 좋겠다 싶어서 참여하였다. https://frost-witch-afb.notion.site/YOUTHCON-21-365e94c3df3443e5b1322520a8b1a2ef YOUTHCON'21 유쾌한 스프링방에서 탄생한 유스콘은 👨‍🎓 젊은 개발자와 👨‍🏫 선배 개발자가 함께 가치 있는 기술에 관한 정보와 경험을 공유하는 콘퍼런스입니다. 여기서 발표하는 사람들을 잘 기억 frost-witch-afb.notion.site 다 듣지는 않았고 일부 참여하였는데 간단하게 요약 및 느낀점을 포스팅하겠..

[TDD] Test 코드에서 Exception을 받고 싶을 때

간혹 테스트코드를 작성할 때, 예외를 띄우는 것을 기대하는 경우가 있을 것이다. 그런 경우는 아래와 같이 작성하면 된다. @Test void notFoundMessageCode(){ Assertions.assertThatThrownBy(()-> messageSource.getMessage("no_code", null, null)) .isInstanceOf(NoSuchMessageException.class); } - assertThatThrownBy : 예외가 throw됐을 경우 그 예외를 catch해주는 기능을 가진다. 위 코드에선, no_code라는 메시지가 저장돼있지 않아 람다식에서 NoSuchMessageException 에러를 throw해주었으며, 따라서 isInstanceOf에서 예상한 에러 ..

[Spring][TDD] MockMvc를 이용한 Controller Test

우리가 API를 개발하거나, 컨트롤러에서 view로 model을 넘겨줄 때, 또는 spring security로 로그인하여 권한이 있을 때만 service logic을 테스트할 수밖에 없는 경우가 분명히 존재한다. 이럴 땐, 직접 실행하여 테스트해보는 수밖에 없을까? 그렇지 않다. 임의의 가짜 객체 Mock을 만들어서 가상으로 테스트해보면 된다! 이 때 사용되는 방법엔 @WebMvcTest, @AutoConfigureMockMvc가 있는데, 둘의 기능은 거의 비슷하나, @AutoConfigureMockMvc가 전자와는 다르게 @Service, @Repository가 붙은 객체들도 모두 메모리에 올린다는 차이점이 존재한다. 또한, @WebMvcTest는 @SpringBootTest의 MockMvc와 충돌할..

[SQL][TDD] ERROR 1146 (42S02): Table doesn't exist 해결

로그인 구현을 위해 해시함수를 구현하여 encrypt를 해주는 Salt 기능을 만들기 위해 테스트를 하던 중 [SQL] ERROR 1146 (42S02): Table doesn't exist 에러가 발생했다. 그 이유는 아래 Salt Entity가 존재하는데, Salt 테이블이 만들어지지 않기 때문이다. @Entity @Getter @Setter public class Salt { @Id @GeneratedValue private Long id; @NotNull private String salt; public Salt() {} public Salt(String salt) { this.salt = salt; } } 참고로 이 Salt Entity는 Member Entity와 1:1 연관관계 매핑이 돼있는..

[TDD] @Rollback을 쓰면 원래 DB의 데이터도 사라질까?

@Rollback을 쓰기에 겁나는 사람을 위해 포스팅해본다. 테스트 코드를 작성할 때, @Rollback이라는 기능을 쓰면 테스트 코드에서 insert한 데이터들을 다시 rollback 시켜준다는 점은 모두 알고 있을 것이다. 예시로 db가 텅 비어있었는데, test code에서 repository.save(member1); 을 한다고 해도, @Rollback 어노테이션을 붙일 경우 db가 rollback되어 텅 비는 것을 확인할 수 있기 때문이다. 그럼 db가 비어있지 않고 데이터가 이미 있는 경우에선 rollback을 써도 될까? 정답은 YES. @Rollback은 테스트 코드에서 insert된 데이터들만 rollback시켜주지, 모든 데이터를 rollback시킨다는 의미가 아니다. 위 사진에서 볼 ..

반응형