본 시리즈는 메타 코딩님의 Junit 강의를 학습한 내용을 바탕으로 정리하였습니다.
인프런의 스프링 부트 개념정리 강의를 통해 알게 된 메타코딩...
평소에도 메타코딩님의 유튜브를 보며 학습하다 JUnit에 관한 좋은 강의가 올라와서 강의를 학습하게 되었다.
강사님과 함께 JUnit의 기본적인 내용에 대해서 프로젝트를 만들면서 배우고 더불어 JUnit과 Security 테스트를 통해 학습하면서 유닛 테스트에 대해 전반적으로 익힐 수 있게 되어 개인적으로는 아주 만족스러운 강의였다.👍👍 (역시 갓타코딩)
따라서 이번 시리즈는 JUnit에 관해 학습한 내용을 다룰 예정이다.
📌 단위 테스트는 프로그램의 기본 단위인 모듈(Module) 을 테스트 하는 것이다. 구현 단계에서 각 모듈의 개발을 완료하고 명세서의 내용대로 정확히 구현되었는지를 테스트 한다.
(출처: 프로그래민님의 블로그)
예전과 달리 단위 테스트의 필요성이 부각되고 있다. 특히 고객들에게 어떠한 서비스를 제공하는 기업들이 많아진 만큼 코드의 안정성을 중시하는 것이 요즘의 추세이다. 최근 개발자들이 선망하는 서비스 기업 회사들은 거의 다 테스트 코드를 작성하는 것이 선택이 아닌 필수항목이 되었다. 즉, 테스트 코드를 잘 짜는 것이 개발자의 기본 소양으로 자리잡게 된 것이다.
이렇게 중요한 단위 테스트... 만약 사용하지 않고 개발을 진행한다면 어떤 문제점을 야기할까?
다음과 같은 방식으로 개발한다고 생각해보자.
System.out.println()
을 통해 눈으로 확인이렇게 개발을 한다면 매 코드를 수정할 때마다 2번에서 5번을 반복해야한다. 테스트 코드가 없다보니 톰캣을 내렸다가 실행해서 직접 확인해야하는 것이다. 비효율적이다. 테스트 코드는 자동으로 코드를 검증함으로써 이러한 번거로움을 해결해준다.
단위 테스트를 사용하지 않는다면 개발자가 만든 기능의 안전을 보장받을 수 없다. 무슨 이야기인가하면...
어떤 프로그램에
B
라는 기능을 추가해달라는 요청이 들어와B
기능을 개발 후, 테스트해보았더니 잘 동작하였다. 그래서 프로그램을 재 가동했으나 기존의 잘 작동되던A
기능에 갑자기 문제가 발생하기 시작했다.
위의 경우는 규모가 큰 서비스에서는 빈번하게 발생되는 일이다. 어디서 문제가 발생했는지 알아내기가 쉽지않고 그렇다고 모든 기능을 테스트하자니 너무 많은 리소스를 필요로 하기 때문에 모든 기능을 테스트할 수는 없는 노릇이다.
이렇게 새로운 기능이 추가될 때, 기존 기능이 잘 작동되는 것을 보장해주는 것이 테스트 코드이다. A
라는 기존 기능에 여러 경우를 모두 테스트로 구현해 놓았다면 코드를 수행만 해도 문제를 조기에 발견할 수 있다.
Java의 단위테스트를 수행해주는 대표적인 Testing Framework로써 보통 JUnit4와 그 다음 버전인 JUnit5를 사용한다.
JUnit은 Spring 기반에서 다음과 같은 어노테이션과 메서드를 제공함으로써 테스트를 좀 더 편리하게 실행시킬 수 있도록 도와준다.
assertArrayEquals(a, b)
assertEquals(a, b)
assertEquals(a, b, c)
assertSame(a, b)
assertTrue(a)
assertNotNull(a)
@Test
@SpringBootTest
@DisplayName
@ExtendWith
@BeforeEach
@AfterEach
@BeforeAll
@AfterAll
@Disable
(출처 : LDH님의 벨로그)
각 어노테이션들의 기능들은 차차 강의를 통해 더 자세히 알아보자.