Spring Framework에서 JUnit5 사용하기 (2)
전 포스팅 글에서 Test Order Method 까지 알아보았으므로 WebMVC Test를 진행해 보려고 한다.
Mock과 Spy 객체를 이용하여 Test를 할 것이기 때문에 두 객체의 차이를 분명하게 알아야 한다.
Mock과 Spy객체를 사용하는 이유는 스프링 Test를 진행하다보면 모듈간의 의존성이 있을 수 밖에 없는데 특정 모듈을 테스트 할 때 의존성이 있는 외부 모듈에 대해 어떻게 처리 할 건지에 대해 정의할 필요가 있기 때문이다.
이것을 Stubbing이라고 하는데 여기서 Mock과 Spy객체의 차이가 발생한다. 특정 클래스에 대해 Mock객체를 생성하면 클래스 안의 인스턴스 변수는 모두 null값이 되고, 메서드 또한 로직이 사라진 빈 껍데기가 되어버린다. interface랑 비슷하게 변한다고 생각하면 쉽다. (interface랑 같다는 것이 아님!)
반면 Spy객체를 생성하면 클래스 안의 있는 인스턴스 변수나 메서드들은 그대로 존재하고 실제로 Spy객체 안에 있는 메서드들을 호출하면 실제로 호출되어 값들이 반영된다.
이것만 보면 Spy객체는 사용할 필요가 없어 보인다. 왜냐하면 굳이 Spy객체를 사용하지 않더라도 클래스 인스턴스를 만들어서 사용하는것과 같아보이기 때문이다.
하지만 정말 같다면 Spy객체의 존재는 이미 사라지고 없었을 것이다. Mock은 한번 객체를 생성하면 정의되어 있는 모든 인스턴스 변수나 메서드들에 대해 정의를 해야만 원하는 로직이 돌아갈 수 있도록 되어있지만 Spy객체는 기본적으로 로직들이 돌아가되, 특정 부분만 따로 도려내서 Stubbing 가능하다는것이 핵심이다.
지금까지 나는 JUnit의 개념에 대해 학습했고 Spring에서의 활용도 학습했고 MockMVC객체, Mock객체와 Spy객체 또한 학습했으므로 이것을 활용하여 무엇을 할 수 있고 어떠한 결과물을 낼지에 대한 생각을 해야한다.
위에 정의된 3가지 객체를 이용하여 앞으로 인수테스트, 단위테스트, 통합테스트를 진행하여 결과물을 도출 할 생각이다.
간략하게 단위테스트, 통합테스트, 인수테스트 정의에 대해 짚고 넘어가본다.
단위 테스트
-
소형 테스트에 속하는 단위 테스트는 클래스 범주 내에서 작은 단위(ex. 메서드단위)의 기능에 대한 유효성을 검증하는 테스트이다.
-
매우 간단하고 명확하며 빠르게 실행된다.
-
하나의 메서드에 대해 하나 이상의 테스트가 존재 할 수 있고 각각의 조건에 대해 유효성을 검증한다.
-
작은 단위로 쪼개진 테스트는 해당 로직이 어떤 역할을 하는지 쉽게 파악할 수 있다.
-
개발자관점의 테스트이므로 소프트웨어 내부 코드에 관련한 지식을 반드시 알고 있어야 하는 화이트박스 테스트이다.
통합 테스트
-
중형 테스트에 속하는 통합 테스트는 서로 다른 모듈 혹은 클래스 간 상효작용의 유효성을 검사하는 테스트이다.
-
단위테스트를 전부 성공적으로 끝마쳤다 할지라도 그것이 곧 통합테스트도 성공할 것이라는 보장은 절대 없다.
-
테스트를 위한 사전 조건이 필요한 경우가 많아서 단위테스트 보다 테스트 코드를 작성하기가 복잡하다.
-
하지만 더 넓은 범위의 종속성까지 테스트 함으로써 단위테스트보다 좀 더 유의미한 테스트가 될 가능성이 높다.
인수 테스트
-
실제 사용자들이 사용하는 서비스의 기능이 정상적으로 작동을 하는지 검증 하는 테스트이다.
-
앞선 두 테스트들과는 달리 비즈니스 쪽에 초점을 둔다.
-
프로젝트에 참여하는 사람들(ex. 기획자, 클라이언트 대표, 개발자등)이 토의해서 시나리오를 만들고, 개발자는 이에 의거해서 코드를 작성하는 구조이다.
-
시나리오에서 요구하는 것은 누가, 어떤목적으로, 무엇을 하는가이다.
-
내부코드에는 관심을 가지지 않는 블랙박스 테스트이다.