테스트코드(Test Code)란?
테스트 코드(Test Code)란?
Test는 시험, 검사이라는 의미로 실제 코드를 검사하기 위한 코드입니다.
작성한 프로그램이 문제가 없는지 확인하기 위해서 사용합니다.
많은 개발자분들이 테스트 코드의 중요성을 강조하고 있는데 테스트 코드를 왜 사용할까요?
개발자는 기능을 구현하는 게 중요하지만 이 기능이 잘 동작하는지 검증하기 위해서는 테스트가 필수적입니다.
기존에 테스트를 하는 방식은 다양한 use case에 맞추어 단순노동을 하면서 입력을 하며 콘솔로 찍히는 로그가 정상인지 아닌지 확인하며 진행했습니다.
이러한 방법들은 단점들이 존재합니다.
- 기능을 재 테스트하거나 요구 상황이 변경되면 use case를 다시 작성하고 테스트를 반복해야 합니다.
- 프로그램의 규모가 클 때 어디서 에러가 발생했는지 확인할 수 없습니다.
- 만약 기능 개발을 완료하고 디버깅용 로그나 출력 부분을 제거하였는데 새로운 기능을 추가해야 한다면..
이러한 단점을 극복하기 위해서는 테스트 코드를 작성하면 됩니다.
테스트 코드를 작성하게 되었을 때 과정입니다
- 코드를 수정 한다.
- 테스트 코드를 실행한다. (이미 테스트 코드를 작성했다고 가정합니다)
- 결과를 확인한다.
또한 프로그램의 규모가 클 때 어디서 발생했는지 확인할 수 없는 문제는 단위 테스트를 통해서 해결합니다.
단위 테스트(Unit Test)란?
하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트입니다.
작은 단위를 기준으로 테스트하게 된다면 자연스럽게 디버깅 시간을 단축할 수 있습니다.
좋은 단위 테스트를 하기 위해서는 어떻게 해야 할까요?
"FIRST 법칙을 지켜야 한다" 라고 말하곤 합니다.
F - Fast(빠르게)
테스트는 빨라야 합니다.
테스트에 시간이 오래 소요된다면 테스트를 자주 돌리지 않게 되고 코드 품질이 떨어지게 됩니다.
I - Independent(독립적으로)
테스트는 서로 의존하지 않아야 합니다.
만약 모든 테스트가 서로 의존적이라면 하나의 테스트에서 에러가 나면 모든 테스트에서 에러가 발생합니다.
그렇게 되다면 에러의 원인을 진단하기 어렵습니다.
R - Repetable(반복 가능하게)
테스트는 반복이 가능해야 합니다.
S - Self-Validating(자가 검증하는)
테스트는 boolean 값으로 결과를 반환해야 합니다.
테스트가 스스로 성공과 실패를 제공하지 않는다면 개발자가 지루한 수작업 평가를 해야 합니다.
T - Timely(적시에)
실제 코드가 구현하기 전에 테스트 코드를 구현해야 합니다.
만약 실제 코드가 테스트하기 어렵다면 실제 코드를 다시 작성해야 합니다.
Given - When - Then 패턴
테스트 코드 작성 시 [준비 - 실행 - 검증] 세 부분으로 나누어서 작성하는 것
Given
테스트를 위해 준비하는 과정으로 테스트에 사용하는 변수, 입력 값 등을 정의합니다.
When
실제로 액션을 테스트하는 과정입니다.
Then
마지막 테스트를 검증하는 과정입니다. 예상한 값, 실제 실행을 통하여 나온 값을 검증합니다.
수도코드로 표현해보았을 때 이런식으로 흘러가게 됩니다.
//given
int a = 3;
int b = 4;
//when
int result = a+b;
//then
Assert.mustBeTrue(result == 7) //result가 7이 아니라면 테스트 실패!
TDD(Test-Driven Development)란?
테스트 코드를 먼저 만들고, 실제 코드를 나중에 만드는 개발 기법
프로그램을 작성하기 전에 테스트 먼저 하라 -켄트 벡(Kent Beck)
기존의 개발 프로세스
설계 -> 개발 -> 테스트 -> 수정
TDD의 개발 프로세스
설계 -> 테스트 코드 작성 -> 수정 -> 개발 형식
즉, 실제 작성해야 할 프로그램 코드보다 테스트 코드를 먼저 작성하는 기법입니다.
TDD의 개발 과정
1. 테스트를 먼저 작성합니다.
2. 테스트를 실행합니다. ( 테스트를 먼저 작성하였으므로 당연히 실패합니다.)
3. 실패한 테스트가 성공할 만큼의 코드만 작성한 후 다시 테스트합니다.
4. 테스트가 완료되면 다음 기능으로 넘어갑니다.
TDD의 장점
- 사용자 입장에서 코드 작성
- 모든 요구 사항에 대해 점검
- 시스템 전반적인 설계 향상
참고 자료
테스트 주도 개발 TDD 실천법과 도구 (채수원)
https://repo.yona.io/doortts/blog/issue/1
https://tech.kakao.com/2021/11/08/test-code/
https://galid1.tistory.com/329?category=763585
https://www.youtube.com/watch?v=Npi21gLIEZM
https://www.youtube.com/watch?v=3LMmPXoGI9Q
https://brunch.co.kr/@springboot/292