글의 목적
- SW 테스트에 대한 전반적인 과정을 이해하고 정리하는것이 목적
- V 모델을 이해하며 서비스 고도화에 따른 TDD의 중요성에 대해서 파악하려고 함.
본론
1. SW 테스트
모든 것은 항상 실패한다. -Werner Vogels, AWS CTO
- AWS CTO의 말처럼 버그가 없는 Software는 존재하지 않고 모든것은 실패하게 되어있다.
- 그만큼 장애대응이 중요하다라는 말을 하고 싶다고 생각된다.
- 모든 service는 릴리스 전에 테스트를 통과하고 소비자에게 제공되는것이 맞음.
- SW 테스트는 버그가 없다고 확신하는 과정이 아니라 service품질이 소비자에게 제공될 만큼의 수준을 보장한다는 의미이다. QA의 A는 Assurance임!
- 그렇기 때문에 테스트에 너무 목숨걸필요도 없고 그럴수도 없고 완벽하게 버그를 잡고 출시할 수도 없다고 생각한다.
- 주객이 전도되면 안된다는말! 항상 소비자의 입장에서 가능한 일정내에 최고의 서비스를 제공하려는 수준의 목적을 달성해야한다고 생각한다.
2. V 모델
출처 https://ko.wikipedia.org/wiki/V_%EB%AA%A8%EB%8D%B8
- 이 과정은 애자일하게 수행되고 사진의 수행과정을 정리하려고 아래처럼 기술했는데 사진을 보고 이해하는것이 더 정확하다.
- 요구 사항 분석은 다음의 두가지로 뻗어 나간다.
- 시스템 설계는 다음의 두가지로 뻗어 나간다.
- 아키텍처 설계는 다음으로 이어진다.
- 모듈 설계는 다음의 세가지로 뻗어 나간다.
- 코딩을 제일 마지막으로 수행한다.
- 하나하나 자세하게 정리해보자.
2.1. 요구사항분석(requirements analysis)
- 해당 단계에서는 인수 테스트(acceptance testing)를 설계하고 테스트한다.
- 이 테스트의 목적은 시스템을 운영 환경에 배포할 준비가 되었는지를 확인하는것임.
- 클라이언트는 어떻게 구현되었는가보다 기능이 잘 돌아가는지가 더 중요하기 때문에 수행한다고 생각해도 좋다.
2.2. 시스템 설계(system design)
- 해당 단계에서는 시스템 테스트(system testing)를 설계하고 테스트한다.
- 이 테스트의 목적은 SW가 구동되는 환경의 제약 사항으로 인해 발생하는 문제를 찾기 위한 테스트이다.
- 시스템 테스트의 종류
- 회복 테스트(recovery test) : 정전과 같은 재해상황에서의 자동 초기화, 데이터 회복이 제대로 되는 확인.
- 보안 테스트(security test): 해킹 공격으로부터 안전한지.
- 강도 테스트(stress test): 갑작스럼 트레픽 증가와 같은 큰 부하에 대해서 안전한지 파악.
- 민감도 테스트(sensitivity test): 데이터 타입에 맞게 데이터가 들어오는지, 경곗값이 제대로 동작하는지 확인.
- 성능 테스트(performance test): 응답시간, 처리량등등 시스템자원이 효율적으로 사용되고 있는지 확인.
2.3. 아키텍처 설계(architecture design)
- 해당 단계에서는 통합 테스트를 설계하고 테스트한다.
- 이 테스트의 목적은 각각의 모듈들이 함께 동작했을때 이상이 없는지를 확인하는 것.
- 코드 레벨에서 코드를 파악하지 않고 수행됨.
2.4. 모듈 설계(module design)
- 해당 단계에서는 단위 테스트를 설계하고 테스트한다.
- 테스트 작성은 개발자가 직접하는것이 좋고 다양한 시나리오와 예상하지 못한 테스트케이스를 추가하는것이 중요함.
2.5. 코딩(coding)
- 해당 단계에서는 디버깅을 통한 로직의 검증이 이루어집니다.
- 테스트라기 보다는 개발과정의 한 요소라고 생각합니다.
결론
- 좋은 개발자는 빠르지만 느리다고 한다.
- 풀어서 말하자면 프로젝트는 빠르게 완성시키지만 코드는 느리게 작성한다는 내용인데 이제 조금 무슨말인지 이해가 된다.
- TDD란 서비스 고도화가 예상된다면 아무리 작은 프로젝트라도 TDD로 작성을 하는것이 중요하다고 생각한다.
- 사실 사이드 프로젝트로 간단한 프로젝트를 하면서 리팩토링도 염두해두지 않고있다면 TDD가 무슨의미가 있을까?
- 결국 TDD의 핵심은 서비스 고도화에 따른 확장성있는 코드로 트레픽을 대비해야할 경우 리팩토링과정에서 얼마나 안심하고 동료 개발자들과의 신뢰속에서 리팩토링을 할 수 있는지 없는지라고 생각한다.
- 결국 미뤄두면 언젠가는 손을 대야한다는 의미.