✅ Software Testing
- 제대로 된 소프트웨어를 개발했는가?
- 소프트웨어를 제대로 개발했는가?
✔ why?
- 결함 확인
- 사전 방지
- 시간 절약
- 구조 개선
- 품질 개선
- 확장성
✅ Unit Test
유닛 테스트란, 내가 작성한 코드의 가장 작은 단위인 함수를 테스트하는 메소드다. 그래서 내가 작성한 로직을 테스트하는 유닛테스트 코드를 짜서 테스트하게 된다.
✔ 지금까지는,
- 백엔드는 장고 서버를 동작시켜서 Httpie 나 포스트맨으로 Integration 테스트 수행.
- 테스트할 엔드포인트가 10개라면 최소 수분은 걸릴 것.
- Integration 테스트는 데이터베이스 서버를 돌려야 하고, 메모리가 유닛테스트보다 더 많이 사용하게 되므로 비용도 비쌈.
✔ 유닛테스트를 돌린다면,
- 엔드포인트 10개는 수초만에 테스트가 끝나게 됨.
- 빠르고 비용이 싸므로 개발할 때 필수적으로 작성해야 함.
✅ Testing Pyramid
- Google Test Automation Conference에서 제안된 테스트 피라미드
- 시스템을 테스트 전략 3가지
- 전체 테스트 비중을 아래와 같은 수치로 구현하는 것이 권장됨
E2E(UI) Testing
- 10%
Integrating Testing
- 20%
Unit Testing
- 70%
1. End-To-End(UI) Testing
- 프론트와 백의 통신으로 하는 테스트.
- 전체전인 Flow 확인 → 직접 브라우저 상에서 값을 입력해서 테스트.
- 가장 어렵고 까다로운 방법.
- 실행하기 쉽다는 장점이 있지만 비용이 많이 들고 부정확 하며 실행 시간이 오래 걸림.
- 자동화 및 실행이 까다로움.
- 불안정성↑ 인력소모↑ 비용↑ 테스트속도↓
2. Integration Testing(통합 테스트)
- 모듈 간의 호환성 검증.
- 최소 두개이상의 클래스 또는 서브 시스템의 결합을 테스트하는 방법.
- ex)장고로 서버를 띄우고 모델 클래스와 결합하여 데이터베이스 시스템과 연동한 테스트.
- Postman 또는 httpie로 호출해서 Json response가 제대로 출력되는지 확인.
- E2E Testing 다음으로 공수가 많이 든다.
- 안정성↑ 인력소모↓ 비용↓ 테스트속도↑ 확장성↑
3. Unit Tests(단위 테스트)
- 독립적으로 진행되는 가장 작은 단위의 테스트
- 가장 쉽고 효과 좋은 방법.
- 빠른 문제 파악 가능.
- 시간과 비용 절감.
- 리팩토링 시 안정성 확보.
- 코드에 대한 문서로 활용.
✅ Test의 일반 원칙
- 테스트 유닛은 각 기능의 가장 작은 단위에 집중하여, 정확히 동작하는지 증명해야 한다.
- 각 테스트 유닛은 반드시 독립적이어야 한다.
- 테스트가 빠르게 돌 수 있도록 만들기 위해 노력해야 한다.
- 코딩을 시작하기 전에 항상 풀 테스트 슈트를 돌려야 한다.
- 공용 저장소에 저장하기 전에 자동으로 모든 테스트를 수행하도록 하는 훅을 구현하는 것이 좋다.
- 코드를 디버깅할 때 가장 먼저 버그를 찝어내는 새로운 테스트를 작성한다.
- 테스트 함수에는 길고 서술적인 이름을 사용한다.
square()
, sqr()
→ test_square_of_number_2()