
이번 프로젝트를 진행하면서, 테스트 코드를 제대로 짜보기로 기획하였다. 따라서 한 메소드가 완성 될때마다, 동작하는 지 여부를 확인하기 위한 테스트 코드를 짜면서 발생했던 문제점들과 해결법들을 적어보고자 한다.

// 메시지를 저장할 메시징 큐
private val messageQueue: BlockingQueue<CommandChatMessageRequestDto>
= LinkedBlockingQueue()
// 메시지 전송
val messageDto =
CommandChatMessageRequestDto(
sender = "Alice",
chatRoomId = chatRoomId,
message = "안녕하세요, Alice22입니다.",
messageType = CommandChatMessageType.CHAT,
)
session.send("/app/$chatRoomId", messageDto)
// 메시지 정상 전달 여부 확인
val receiveMessage = messageQueue.poll(5, TimeUnit.SECONDS)
기존 테스트 코드에서는 위 방식처럼 직접 기존 경로를 통해서 메시지가 전송되는 것을 확인하기 위해, send()를 사용하여 실제 구독 경로로 메시지를 전송하였고, 해당 경로를 구독 중인 사용자들에게 전송되어 실제 DB에 저장되었다.
하지만, 테스트 과정이 실제 환경에 영향을 미치면 안되므로, 메시지를 전송해도 실제 DB에 영향을 미치지 않고, DB에 잘 저장이 되는지를 확인하기 위해서 다른 방식을 사용하였다.
실제 DB환경에 영향을 주지 않고, 테스트 코드만을 위한 DB를 만드는 방식을 알아보니 대표적으로 2가지가 존재하였다.
1.Embedded MongoDB: Java 애플리케이션 내에서 Embedded MongoDB를 실행
2.TestContainer MongoDB: Docker 컨테이너에 MongoDB를 만들어서 실행
위와 같은 장단점을 가지고 있는 2가지 방식이 있었고, 우리 프로젝트의 특성을 대입하여 봤을때, CI/CD시에도 크게 문제가 없고, 운영 하는 과정에서 장애가 적은 "TestContainer MongoDB"를 사용하기로 결정하였다.
추가적인 조사와 실험을 해본 결과 TestContainer는 서버를 실행시에는 container를 새롭게 만들어야 하기 때문에 시간이 많이 소요되었다. 따라서 운영 검증 시에 Test Container를 사용하기로 결정하였고, 빠른 속도가 중요한 단위 테스트에는 Embedded-MongoDB를 사용하기로 결정하였다.