JoungSik/토비의 스프링 - 2장

Created Tue, 14 Dec 2021 23:02:34 +0900 Modified Sat, 31 Dec 2022 01:31:35 +0900
1734 Words

토비의 스프링 - 2장

이번 장에서는 테스트에 대해 알아보겠습니다.

모든 개발자는 기능을 개발하고 완료되면 테스트를 합니다. 그건 기능의 개발이 완료 되었다는 체크를 위해서 입니다. 그런데 이 테스트를 하는 방법은 굉장히 여러가지 방법이 있습니다. 그 방법에는 직접 실행해보는 방법부터 테스트 코드를 작성하는 방법과 테스트 프레임워크를 사용하는 방법 등이 있는데 자신의 환경과 테스트 해야 하는 항목에 따라 선택을 하게 됩니다.

테스트를 하는 이유에는 기능의 완료를 체크 하는 것도 있지만 만들어진 코드에 대한 확신과 테스트 결과를 두고 내부의 코드를 유연하게 바꿀 수 있도록 도움을 주는 것도 있습니다.

여기서는 직접 실행하는 테스트가 아닌 테스트 프레임워크를 사용해 테스크 코드를 작성하는 방법을 최종 목표로 두고 이야기를 하려고 합니다.


테스트 코드를 작성할 때 있어 테스트 할 코드의 단위를 정해야 할 필요가 있습니다.

스프링 MVC 를 기준으로 로그인 페이지에서 유저가 입력한 데이터를 컨트롤러가 전달 받아 모델로 데이터를 이용해 조회하고 그 결과 값을 컨트롤러가 전달받아 뷰로 보내고 뷰는 결과 값을 유저에게 전달합니다.

이런 일련의 과정을 하나의 단위로 정하거나 유저에게 데이터를 전달 받는 부분까지만 하나의 단위로 정하거나 모델에서 데이터를 이용해 조회해 결과 값을 내는 것 까지를 하나의 단위로 정하든 그건 테스트에 따라 다릅니다.

이런 단위 중 독립적으로 진행할 수 있으며 가장 작은 단위로 쪼갤 수 있는 테스트를 단위 테스트 (Unit Test) 라고 부릅니다. 대체로 메소드로 이해 할 수 있습니다. 그리고 위의 일련의 과정을 전부 수행하는 통합 테스트 (Integration Test) 도 있습니다.

이번 장에서는 단위 테스트를 기준으로 설명 되어 있습니다. 그리고 JUnit 라고 하는 테스트 프레임워크를 사용합니다.

JUnit 는 이런 단위 테스트를 진핼 할 수 있는 자바 테스트 프레임워크 입니다.

프레임워크이기 때문에 의존성을 주입 할 수 있는 형태로 코드를 작성하면 프레임워크가 작성된 코드를 가져가 실행하게 됩니다. 따라서 코드를 작성할 때 사용 될 수 있도록 코드를 작성하는 방법을 배워야 합니다.

그 방법은 공식 홈페이지별도의 책이 있을 정도로 내용이 많지만 간략하게 사용하는데에는 검색만으로도 충분하니 따로 작성하지는 않겠습니다. 필요에 따라 찾아보고 적용하면 된다고 생각합니다.


다음은 테스트 코드를 작성 할 떄의 주의점 입니다.

놓치고 가는 부분도 없지 않아 있어 주의를 하면 좋습니다.

  1. 테스트 코드는 그 테스트의 의도를 명확하게 할 수 있는 네이밍을 하는게 좋다.
  2. 동일한 테스트를 반복적으로 했다면 그 결과 값은 매번 같아야 한다.
  3. 테스트는 외부 환경에 영향을 받지 말아야 하고 다른 테스트들과는 독립적으로 동작해야 한다.

전체적으로 테스트는 독립적으로 실행되어 주변 환경에 영향을 받지 않으며 동일한 입력 값에는 동일한 결과 값을 내야 하며 테스트의 의도를 알 수 있는 명확한 이름을 가지고 있어야 합니다.

마지막으로 코드를 작성하다보면 잘 돌아가는 상황만 생각하기 때문에 실패하는 상황을 고려 해야 하는 개발자는 테스트 코드를 작성 할때도 본인이 모르는 사이에 문제가 될법한 입력 값을 피해서 입력하는 상황을 주의 해야 합니다.


테스트 코드를 작성하는 방법론 중에는 TDD 라는 기법이 있습니다.

이는 먼저 기능에 대한 입력 값과 동작 방식, 그리고 결과 값을 머리속에서 생각하고 바로 코드를 작성 하는게 아닌 이를 테스트 코드로 표현해 작성하고 이 테스트를 통과하는 실제 코드를 작성하는 기법을 말합니다.

  1. 특정 기능에 대한 입력 값, 동작 방식, 결과 값을 테스트 코드로 작성
  2. 해당 테스트 코드를 만족하는 실제 코드를 작성
  3. 테스트를 실행하며 만족하는지를 확인

이 방법이 유효한 이유는 테스트 코드 자체가 기능에 대한 명세가 될 수 있다는 점과 개발이 완료된 시점에 테스트 또한 성공해야만 하기 때문에 개발자 스스로도 코드에 대한 안정감을 얻을 수 있습니다. 또한 테스트를 만들고 코드를 만드는 작업을 같이 진행하기 때문에 작성한 코드들이 많아 테스트 하기 힘들거나 귀찮아지는 점에서도 벗어나 바로 바로 진행 할 수 있게 됩니다.

스프링에서도 테스트를 진행 할 수는 있지만 테스트는 독립적으로 진행 할 수 있어야 하기 때문에 독립적인 환경을 구성 할 수 있는 방법이 많습니다. 그러니 방법이 없다고 생각하지 말고 찾아보길 바랍니다. 대표적으로는 @before 나 @after 같은 방식과 ioc 를 불러오는 방법도 있으니 상황에 따라 사용하면 됩니다.

마지막으로 테스트는 결과 값은 바뀌지 않은 채 내부 구조를 바꾸는 리펙토링을 진행할 때 반드시 라고 해도 좋을 정도로 꼭 필요한 작업이고 테스트를 통한 검증이 개발자 스스로 코드에 대한 안정감을 얻을 수 있기 때문에 꼭 진행해야 한다고 생각합니다.