E2E 테스트, 통합 테스트 - E2E teseuteu, tonghab teseuteu

이 글은 학습한 내용을 본인의 생각을 통해 해석하고 정리한 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를 더욱 파고파서 테스트 코드를 열심히 짜봐야겠다.

참고

  • [Test] 유닛 테스트(Unit Test), 통합 테스트(Integration Test), 기능 테스트(Functional Test)란?
  • 단위 테스트 vs 통합 테스트 vs 인수 테스트
  • TDD소개
  • react-testing-library 를 사용하여 TDD 개발 흐름으로 투두리스트 만들기

테스트의 종류

End-To-End Testing / UI Testing

  • 크롬 브라우저를 띄운다음에 내가 만든 페이지로 들어가서 의도한 대로 기능이 동작하는지 테스트하는 방법
  • Manual Testing은 실행하기 쉽다는 장점이 있지만 비용이 많이 들고 부정확하며 실행 시간이 오래 걸린다. 자동화 할 수 있지만 UI Testing은 자동화 하기가 가장 까다롭고 또 실행하기도 까다롭다.
  • 즉, UI Testing이 가장 어렵고 까다롭다.

Integration Testing

  • 백엔드 기준으로 httpie 또는 postman을 사용해서 Json response가 제대로 출력되는지 테스트하는 방법이다.
  • integration testing(통합 테스트)인 이유는 두 개 이상의 클래스 또는 시스템을 결합을 테스트하기 때문이다.
  • 예를 들면, 장고로 서버를 띄우고 모델 클래스와 결합하여 데이터베이스 시스템과 연동한 테스트이다.
  • Integration Testing이 E2E Testing 다음으로 공수가 많이 든다.

Unit Testing

  • Unit Testing는 함수와 같이 테스트 할 수 있는 가장 작은 단위를 테스트 하는 코드를 작성해서 테스트하는 방법이다.
  • Unit Testing이 가장 쉬우며 효과가 좋다.

Testing Pyramid, 어떤 테스트를 해야할까

E2E 테스트, 통합 테스트 - E2E teseuteu, tonghab teseuteu

  • Google Test Automation Conference에서 제안된 테스트 피라미드
  • 시스템을 테스트 할때 크게 3가지 방법으로 나눌 수 있다.
  • 전체 테스트 비중을 아래와 같은 수치로 구현하는 것이 권장된다.
    • E2E(UI) Testing - 10%
    • Integrating Testing - 20%
    • Unit Testing - 70%

Unit test의 장점

  • 테스트케이스가 꼼꼼하게 작성되어 있다면, 개발과정 중에 미리 문제를 파악할 수 있다.
  • 코드변경시, 변경한 부분으로 인한 영향도를 쉽게 파악할 수 있다.
  • 코드 리팩토링을 안심하고 할 수 있다. 테스트케이스들은 내가 가입한 보험들 같다.
  • 테스트 자동화를 통해서 항상 딜리버리 가능한 제품을 만들 수 있다.
  • 새로운 입력이 팀에 합류했을때, 개발 스타일, 표준, 컨벤션등을 공유하기에 좋다.
  • 페어 프로그래밍을 할때, 테스트케이스 작성하고 개발하는 역할 핑퐁을 통해서 개발을 페어로 집중해서 진행할 수 있다.
    • TDD + Pair Programming을 한다면, 테스트케이스 작성한 사람의 설계를 공유하면서 소스 개발까지 이어질 수 있으므로 집중력있게 개발할 수 있다.

참고사이트

E2E Test 알아보기
TestPyramid
설마 아직도 테스트 코드를 작성 안 하시나요?
Unit Test (단위 테스트) 도입하기 - 1편
유닛테스트에 대한 생각