[Spring] 테스트 코드란

WOOK JONG KIM·2022년 10월 29일
0
post-thumbnail
post-custom-banner

테스트 코드

작성한 코드비즈니스 로직 자체를 테스트하기 위해 작성하는 코드

작성 이유

  • 개발 과정에서 문제 미리 발견 가능
  • 리팩토링의 리스크가 줄어듬
  • 애플리케이션을 가동해서 직접 테스트하는 것 보다 테스트 빠르게 수행 가능
  • 하나의 명세 문서로서의 기능을 함(협업 : 코드 합칠때 편리)
  • 몇가지 프레임워크에 맞춰 테스트 코드 작성 시 좋은 코드 생산 가능
  • 코드가 작성된 목적을 명확하게 표현 가능, 불필요한 내용이 추가되는 것 방지

단위 테스트 & 통합 테스트

테스트 대상 범위를 기준으로 분류

단위 테스트 : 애플리케이션의 개별 모듈을 독립적으로 테스트

통합 테스트 : 애플리케이션을 구성하는 다양한 모듈을 결합해 전체적인 로직이 의도하는 대로 동작 하는지 테스트 하는 방식

단위테스트는 메서드 단위로 테스트를 수행하게 되며, 메서드 호출을 통해 의도한 값이 나오는지 확인

통합 테스트는 여러 모듈을 함께 테스트해서 정상적인 로직 수행이 가능한지 확인
단위 테스트는 DB나 Network같은 외부 요인을 제거하고 진행하는 데 반해 통합 테스트는 외부 요인들을 포함하고 테스트를 진행하므로 애플리케이션이 온전히 동작하는지 테스트

테스트 비용이 크다는 단점 존재


테스트 코드를 작성하는 방법

Given-when-Then 패턴

Given : 테스트를 수행하기 전에 필요한 환경을 설정하는 단계
-> 테스트에 필요한 변수 정의, Mock객체를 통해 특정 상황에 대한 행동을 정의

when : 테스트의 목적을 보여주는 단계, 실제 테스트 코드 포함되며, 테스트를 통한 결과값 가져옴

Then : 테스트의 결과를 검증하는 단계, When 단계에서나온 결과값 검증
-> 결과값이 아니더라도 테스트를 통해 나온 결과를 검증해야 하는 부분 또한 포함

BDD(Behavior-Driven-Development)를 통해 탄생한 테스트 접근 방식

좋은 테스트 코드의 5가지 속성(F,I,R,S,T)

보통 단위테스트에 적용할 수 있는 규칙

Fast : 테스트가 느리면 개선 작업이 늦어져 코드 품질 떨어짐
ex) 목적을 단순하게 설정해서 작성, 외부 산경 사용하지 않는 단위 테스트 작성

isolated : 하나의 테스트 코드는 목적으로 여기는 하나의 대상에 대해서만 수행되어야
ex) 다른 테스트코드와 상호작용하거나, 관리할 수 없는 외부 소스 사용 시 테스트 수행 안될수도

Repeatable : 어떤 환경에서도 반복 가능하도록 작성(개발환경, 네트워크 연결 여부)

Self-Validating: 테스트 자체만으로도 테스트 검증이 완료되어 햔다
ex) 테스트가 성공했는지 실패했는지 확인할 수 있는 코드를 함께 작성해야, 개발자가 직접 확인하고 있다면 좋지 못한 테스트 코드

Timely : 테스트하려는 애플리케이션 코드를 구현하기 전에 완성되어야 함, 보통 TDD의 경우


Junit을 활용한 테스트코드 작성

자바에서 사용되는 대표적인 테스트 프레임워크(단웨 테스트 및 통합 테스트 위한 도구 제공)

어노테이션 기반의 테스트 방식 지원

단정문(Assert)를 통해 테스트 케이스의 기대값이 정상적으로 도출되었는지 검토할 수 있다는 장점

세부 모듈

Jupiter, Platfrom, Vintage

JUnit Platform : JVM 테스트를 시작하기 위한 뼈대 역할, 테스트를 계획하고 생성하는 테스트 엔진 인터페이스 가짐

테스트 엔진은 테스트를 발견하고 테스트를 수행하여, 결과를 보고하는 역할

JUnit Jupiter : 테스트 엔진 API의 구현체 포함, Jupiter 기반 테스트를 실행하기 위한 테스트 엔진 가짐

JUnit Vintage : JAVA 3,4에 대한 테스트엔진 API 포함

Platform모듈을 기반으로 Jupiter,Vintage 모듈이 구현체 역할 수행

profile
Journey for Backend Developer
post-custom-banner

0개의 댓글