테스트코드(Test Code)

테스트코드(Test Code)란?

Junuuu 2022. 1. 10. 00:01

테스트 코드(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