[TIL] Unit test, Integration test, e2e test 그리고 TDD

swing·2021년 8월 4일
8

[TIL]

목록 보기
7/10

이 글은 학습한 내용을 본인의 생각을 통해 해석하고 정리한 TIL 입니다.
부족한 내용이나 틀린 사항은 언제든 댓글로 남겨주세요 !! 🙋‍♂️

📌 개요

개발을 함에 있어서, 항상 다양한 에러와 마주하게 된다. 우리는 이 에러를 컨트롤 할 필요가 있다.
그래서 실제 리얼월드에 서비스를 배포하기전 다양한 검증이 필요하다. 이에 실제 코드가 잘 돌아가는지 테스트 해 볼 필요가 있다. 그래서 TDD라는 방법이 등장했고, 상황에 따라 적합한 테스트 방식이 등장했다.
테스트를 알아보고 사전에 에러를 박살내보자 🔥


👉 요약

Unit test (단위테스트) : 함수 하나하나와 같이 코드의 작은 부분을 테스트 하는 것
Integration test (통합테스트) : 서로 다른 시스템들의 상호작용이 잘 이뤄지는지 테스트하는 것
e2e test (종단 간 테스트) : 사용자와 어플리케이션의 상호작용이 잘 이뤄지는지 테스트하는 것
TDD (Test-driven development) : 테스트가 주가 되어 개발하는 방법

예를 들자면 한 게임에서 유저가 몬스터를 때려잡는 상황을 가정하자. 그럼 함수는

  • 유저가 몬스터에게 달려가는 Move 함수
  • 유저가 몬스터를 때리는 Attack 함수
  • 몬스터를 잡고 난 후 전리품을 수집하는 Gather 함수

이런 식으로 생길 것이다.
유닛테스트는 각 함수에 이런저런 입력 값을 줘봐서 잘 되는지 테스트하는 것이고,
통합테스트는 유저가 몬스터를 잡고 전리품을 수집할 때 실제로 DB에 잘 저장됬는지 테스트하는 것,
종단 간 테스트는 실제 유저가 되어 이 모든 일련의 과정이 정상적으로 돌아가는지 테스트해 보는 것이다.


👉 Unit test (단위테스트)

Unit test는 실행가능한 가장 작은 소프트웨어를 테스트하는 것이다.
일반적으로는 Class나 Method를 테스트하는 범위로 정해지며, 가장 핵심적인 테스트라 볼 수 있다.
그 이유는 매우 간단하고 명확하게 작성이 되기 때문에, 빈번히 일어나는 개발 단계에서의 버그를 잡아주고, 설계 단계에서 더욱 명확하게 메서드를 나눌 수 있게 된다.
이로 인해 Unit test가 사실상 척추이며, TDD의 중심이고, 아마 test code를 짠다 라고 한다면 바로 Unit test를 위한 코드를 짜는 것이라 볼 수 있다.

코드 예시

// react-testing-library를 이용함
const sum = (a, b) => a + b;

test('add 1 + 2 = 3', () => {
	expect(sum(1, 2)).toBe(3);
})

여기서 sum은 a,b라는 인자를 받아 더해주는 간단한 함수이다.
이제 테스트 코드에 1,2를 준다면 expect => toBe 3이라는 결과가 나올 것으로 예측할 수 있다.
이렇게 다양한 입력 값을 주어 테스트 코드를 짜놓는다면, 예측가능한 버그를 잡아낼 수 있을 것이다.


👉 Integration test (통합 테스트)

Integration test는 Unit test와 달리 개발자가 변경할 수 없는 부분 (ex. 외부 라이브러리, db)까지 묶어서 검증할 때 사용되는 테스트이다.
Unit을 넘어서 각기 다른 시스템이 잘 상호작용 하는지 (ex. 내 앱이 db와 잘 연동되는지)를 확인하는 작업이기 때문에, Unit test code를 작성할 때보다 더욱 복잡하게 만들어지며, 더 많은 코드를 테스트하기 때문에 에러 검출이 명확하지는 않다. 그래서 실제로는 Unit test에 더욱 초점을 두는 것이 좋다.

코드 예시

import sum from "./sum";

test('add 1 + 2 = 3', () => {
	expect(sum(1, 2)).toBe(3);
})

위의 코드 예시와 별반 다르지 않지만, 중요한 것은 import를 통해 다른 모듈 즉 다른 시스템과 잘 상호작용이 되는지 확인해보는 매우 축약된 코드이다. 통합 테스트 또한 시스템 간의 통신에 있어서 에러 검출을 할 수 있기 때문에 상황에 맞춰 잘 사용하자.


👉 e2e test (종단 간 테스트)

e2e test는 End To End test의 약자이다. 말 그대로 Endpoint, 즉 사용자가 실제 프로그램을 사용하는 상황을 테스트하는 것이다. 그래서 소프트웨어의 내부 구조 보다는 비즈니스 쪽에 초점을 두어 실제 시나리오대로 잘 동작하는지 테스트 하는 것이다.
그래서 Acceptance test(인수테스트)와 같은 의미로 사용되며, 이 또한 소프트웨어 인수를 위해 사용자 시나리오대로 테스트를 해보는 의미로 직결된다.


👨🏻‍💻 끝으로,,

이렇게 Unit test, Integration test, e2e test에 관해 알아보았다.
결국 테스트라는 큰 범주안에서 어떤 초점으로 사용할 것인지에 따라 나눠짐을 볼 수 있고, 실제 리월 월드에서는 어떤 식으로 사용되는 지 이해할 수 있었다.
아마 나에게 있어선 TDD를 위해 Unit test를 위한 test code를 짜게 될 것 같다.
앞으로 Jest와 react-testing-library를 더욱 파고파서 테스트 코드를 열심히 짜봐야겠다.

참고

profile
if(기록📝) 성장🌱

0개의 댓글