테스트 코드 환경 효율적으로 통합하기

Jiwon Jung·2023년 5월 20일
0
post-thumbnail

테스트 코드는 커밋하기 전이나 특정 기능을 변경 후 여태 작성해온 테스트 코드를 모두 돌려보면서 혹시 깨진 부분이 있나 확인할 수 있기 때문에 잘 작성하는 것이 중요합니다.

하지만 테스트 코드를 전체 실행하는데도 시간이 너무 많이 걸리면 자주 돌려보기 힘들어서 안하게 될 수 도 있습니다.
테스트 코드를 수행하는 것도 비용이기 때문입니다.

예시로 한 애플리케이션에서 저는 현재까지 테스트 46개를 현재 작성했고, 이 테스트를 모두 돌려본 뒤 'Spring Boot'를 검색하여 스프링 부트 서버가 총 몇번 띄워졌는지 확인해보았습니다.

Spring Boot를 검색해보니 총 6개가 나왔는데요. 즉 6번 서버가 새로 띄워졌다는 의미입니다.

이 6개의 테스트 코드 파일 중 Persistence Layer(레포지토리)와 Business Layer(서비스) 테스트에는 모두 개별적으로 다음과 같은 애노테이션 (ex. @SpringBootTest, @ActiveProfiles("test") ) 이 붙어있던 상황이었습니다.

@ActiveProfiles("test")
@SpringBootTest
class TestServiceTest [
  ...
}

이 공통적인 부분을 하나의 통합 추상클래스에 정의한 뒤, 상속 받겠습니다.
우선 공통으로 사용할 IntegrationTestSupport라는 추상 클래스를 만들고 필요한 공통 애노테이션을 추가합니다.

@ActiveProfiles("test")
@SpringBootTest
public abstract class IntegrationTestSupport {
}

그 다음 사용하는 테스트 코드 클래스들에서 애노테이션을 제거한 뒤 방금 만든 추상클래스를 상속받게 모두 변경하겠습니다.

class TestServiceTest extends IntegrationTestSupport {
  ...
}


class TestRepositoryTest extends IntegrationTestSupport {
  ...
}

Presentation Layer(컨트롤러)쪽 테스트는 성격이 좀 달라서 컨트롤러 관련 테스트 코드 파일에는 다음과 같은 애노테이션들과 빈들이 공통적으로 들어있었는데요.

@WebMvcTest(controllers = TestController.class)
class TestControllerTest extends ControllerTestSupport {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private ObjectMapper objectMapper;

    @MockBean
    private TestService testService;
 		
    ...
}

컨트롤러쪽도 마찬가지로 통합으로 관리해줄 추상클래스를 원하는 이름으로 생성해 그곳에서 필요한 것들을 작성합니다.

@WebMvcTest(controllers = {
        TestController.class,
        TestController2.class,
        TestController3.class
})
public abstract class ControllerTestSupport {


    @Autowired
    protected MockMvc mockMvc; 

    @Autowired
    protected ObjectMapper objectMapper;

    @MockBean 
    protected TestService testService;

    @MockBean 
    protected TestService2 testService2;
}

마찬가지로 사용할 Controller 테스트 코드에 이 추상클래스를 상속받습니다.

class TestController extends ControllerTestSupport {
  ...
}

그런 다음 다시 전체 테스트를 돌려봅니다.
테스트 환경을 통합하고 나니 6번의 서버가 띄워졌던게 2번으로 줄었습니다!!!
확인해보면 Controller쪽 테스트할 때 1번, Service와 Repository쪽 테스트할 때 1번 각각 띄워진 것을 확인해볼 수 있었습니다.

테스트 코드 갯수가 적으면 잘 체감이 안오겠지만, 테스트코드가 몇 백개, 몇천개까지 커지면 커질 수록 체감하는게 커집니다. 서버가 뜨는 것도 비용이기 때문에 이러한 부분도 고려하여 테스트 코드 환경을 통합하면 더욱 좋을 것 같습니다.

이상 오늘의 포스팅 마치겠습니다. 감사합니다.

profile
게을러지고 싶어 부지런한 개발자

0개의 댓글