[Software] TEST 개념, 이유

박재현·2022년 3월 27일
0
post-custom-banner

1. Test가 왜 필요한가?

우리가 개발한 것을 확인하고, 모듈들이 결합해서 상호작용하는 과정에서 동작상에 버그가 없는 것을 확인하기 위해 필요

  • 기능 정상 작동 확인
  • 요구 사항 만족
  • 이슈에 대한 예측
  • 버그를 빠르게 발견
  • 신뢰를 가지고 리팩토리 가능
  • 손쉬운 유지/보수
  • 코드 품질 향상
  • 코드 의존성을 낮춤
  • 좋은 문서화
  • 시간 절약

2. 시스템 테스트 범주(Testing Pyramid)

Google Test Automation Conference 에서 제안된 테스트 피라미드
전체 테스트 비중을 아래와 같은 수치로 구현하는 것이 권장됨

  • End-To-End Testing (UI Testing) - 10%
  • Integrating Testing - 20%
  • Unit Testing - 70%

테스트 단위가 좀 더 쪼개질수록 어느 부분에서 에러가 발행했는지 좀 더 찾기가 쉬워짐

즉, End-To-End Testing 보다는 Integrating Testing 에 테스트 비중을 좀 더 많이 가져가야 하고
Integrating Testing 보다 더 쪼개진 단위인 Unit Testing 에 테스트 비중을 좀 더 많이 가져가야 함

2-1. Unit test

  • code로 code를 테스트
  • Unit Testing이 가장 쉬우며 효과가 좋음
  • 빠르고 비용이 싸므로 개발할 때 필수적으로 작성해야 함

📌 프론트엔드 : jest(가장 많이 사용), enzyme
📌 백엔드 : pytest, unittest(장고에서 기본적으로 사용)

💡 Unit Test 체크사항

(1) 성공해야 할 때 제대로 성공하는가(ex.우리가 원하는 결과가 나오는가) '1'[참]

(2) 실패해야 할 때 제대로 실패하는가(ex.로직상 들어오면 안되는 값이 들어왔을 때 잘 처리가 되는지) '-1'[거짓]

(3) 예외처리 제대로 되어있는가(ex. 로직과 상관없이 key 에러, json 디코더 에러 등에 대해) '0'[예외처리]

💡 Unit test 구현 시 일반 원칙

  • 테스트 유닛은 각 기능의 가장 작은 단위(ex. 함수, 메소드)에 집중
  • 해당 기능이 정확히 동작하는지 증명
  • 각 테스트 유닛은 반드시 독립적이어야 함
  • 각 테스트는 혼자서도 실행 가능해야 하고, 테스트 슈트로도 실행 가능해야 함
  • 테스트가 빠르게 동작할 수 있도록 만들기 위해 노력

2-2. Integrating test

  • 최소 두 개 이상의 클래스 또는 서브 시스템의 결합을 테스트하는 방법

  • Postman 또는 httpie 로 호출해서 Json response가 제대로 출력되는지 확인

  • Integration Testing이 E2E Testing 다음으로 공수가 많이 듬

  • 프론트엔드 및 백엔드 각각 분리된 서버를 통해 각각 테스트 하는 것

  • 프론트엔드 및 백엔드 모두 완성된 상태가 아니어도 각각 따로 테스트할 수 있음

  • 분리되어 테스트 하므로 프론트엔드 또는 백엔드 중 어디에서 에러가 발생했는지 찾기 수월

2-3. End-To-End test

  • 종단(Endpoint) 간 테스트로 사용자의 입장에서 테스트

  • 프론트엔드와 백엔드 모두 코드가 완성된 상태에서 진행하는 test

📌 프론트엔드

  • 원하는 Text가 제대로 나오는지, A를 클릭했을 때 기대하는 동작을 하는지 등을 테스트 합니다. 작은 수정에도 테스트가 깨지기 쉽고 Mock Injection해서 UI만 테스트 하는것도 공수가 많이 들어갑니다.

📌 백엔드

  • API, Function 등에 Mock을 Injection 하고 기대하는 값을 Return 하는지 확인합니다. 난이도와 공수가 낮아서 TDD까지는 아니더라도 일부 Business Logic을 Unit Test 혹은 Scenario Test를 작성해서 관리하시는 분들이 많습니다.

참조

post-custom-banner

0개의 댓글