DevOps 텍스트 교육
DevOps 조직에 왜 테스트 자동화가 필요한가요?
소프트웨어 제공 부서에 아직 제대로 된 테스트 자동화가 없다면 개발과 테스트 사이에 뚜렷한 단절이 있을 것입니다. 개발자는 이미 다른 일로 바쁠 때 업무 품질에 관한 뒤늦은 피드백을 받습니다. 자신이 작성한 코드나 작성하지 않은 코드와 결함 사이의 인과관계를 놓치기 쉽습니다. 결함을 만들던 당시 상황으로 돌아가려 작업 맥락을 바꾸는 데 드는 노력은 생산성을 떨어뜨립니다. 뒤늦게 피드백이 오면 시스템과 결함의 관계가 복잡하고 모호해져, 임시방편을 쓰지 않는 양질의 수정을 기대하기 어렵습니다.
테스트 자동화가 없으면 DevOps 조직이 양질의 제품과 서비스를 제공하는 데 더 많은 시간과 비용이 듭니다. 사업 분야에 관계없이 21세기의 어떤 기술 조직도 이런 방식으로 사업을 확장할 수 없습니다.
테스트는 자동화할 수 있지만,
품질을 만드는 일은 자동화할 수 없습니다
DevOps 팀은 가능한 한 많은 테스트 케이스를 자동화해야 합니다. 테스트는 자동화할 수 있지만 품질을 만드는 팀의 사고 능력은 자동화할 수 없으므로, 소프트웨어가 할 수 있는 반복 작업에 인력을 낭비해서는 안 됩니다.
좋은 테스트 자동화를 위한 DevOps 원칙
- 테스트 자동화는 업무 품질에 관해 빠르고 이른 피드백을 제공해야 합니다.
- 서로 다른 테스트 실행에 동일한 조건이 주어지면 결과는 일관되고 결정적이며 반복 가능해야 합니다.
- 테스트에서 오탐이 발생해서는 안 됩니다.
- 적은 수의 신뢰할 수 있는 자동화 테스트 케이스가, 동일한 조건에서 실행해도 결과가 일관되지 않을 수 있는 많은 수의 비자동화 테스트보다 낫습니다.
- 테스트 자동화는 먼저 시스템이 내부 및 외부 고객에게 제공하는 핵심 기능과 혜택의 검증에 집중해야 합니다. 이 정도의 자동화도 전혀 없는 것보다 훨씬 낫습니다.
- 이후 DevOps 팀의 인력을 최대한 활용할 수 있도록 가능한 한 많은 테스트 케이스를 자동화하세요.
- 테스트 자동화에서 느리고 주기적인 피드백은 피해야 합니다. 본인이나 개발자가 트렁크에 코드를 체크인하려고 할 때마다 빠른 피드백이 필요합니다.
- 자동화된 테스트가 충분히 빠르지 않으면 테스트 및/또는 소프트웨어의 속도를 높일 방법을 찾으세요. 이는 지속적 제공 플랫폼과 배포 파이프라인의 신뢰성을 확보하고 고객에게 좋은 서비스를 제공하는 데도 중요합니다. 더 빠르게 하려면 자동화된 테스트를 병렬로 실행하세요.
- 테스트 주도 개발을 고려하세요. 먼저 자동화된 테스트를 작성한 다음 소프트웨어를 구축합니다.
테스트 자동화는 지속적 제공과 배포 파이프라인을 가능하게 하는 핵심입니다
앞에서 다뤘듯이 DevOps 방법론에서는 개발자가 자신의 코드를 프로덕션에 배포할 수 있습니다. 하지만 조직의 초기 DevOps 팀을 관찰한 결과, 개발자는 트렁크에 코드를 체크인하고 작업과 티켓을 빨리 닫는 데 익숙하면서도 프로덕션으로 릴리스하는 버튼을 누르기는 꺼리는 것으로 나타났습니다. 프로덕션을 망가뜨리고 비난받을까 두렵기 때문입니다.
DevOps 팀이 테스트 자동화로 광범위하고 신뢰할 수 있는 테스트 범위를 확보한 뒤에야 개발자는 이런 두려움을 극복할 수 있었습니다.
예를 들어 Google에서 개발자가 트렁크에 코드를 체크인하면 정적 코드 분석, 중복 분석, 테스트 커버리지 분석 등 초기 검사를 하고, 약 100만 개의 자동화된 테스트 케이스로 코드를 검증합니다. 모든 검사와 테스트에 통과하면 트렁크에서 빌드를 생성하고 프로덕션에 배포해 나머지 프로덕션 서버에 복제합니다. Google의 독립적인 소규모 팀 5,000개가 생산성을 유지하고 매일 수만 건의 프로덕션 배포를 수행하는 방식입니다. 테스트 자동화 없이는 불가능합니다.
빠르고 안정적인 피드백이 안전한 배포 파이프라인과 무결성을 확보할 유일한 방법입니다. 자동화된 테스트 케이스 실패로 파이프라인이 중단되면, 다른 작업을 트렁크에 체크인하기 전에 잘못된 코드와 구성을 수정합니다. 또한 자동화된 테스트 케이스로 미리 찾아내 예방할 수 있었던 파이프라인 오류를 발견할 때마다 해당 테스트 케이스를 만들어 테스트 자동화 저장소에 추가합니다.
자동화할 수 있는 테스트 유형
- 단위 테스트: 애플리케이션의 개별 함수, 클래스 또는 모듈을 검증합니다.
- 인수 테스트: 애플리케이션이 고객에게 제공하는 기능과 혜택을 검증합니다.
- 통합(서비스) 테스트: 애플리케이션 간 상호작용과 엔드투엔드 서비스 흐름을 검증합니다.
- 성능 및 스트레스 테스트: 예상하거나 예상치 못한 고객 부하에서 서비스가 확장되는지, 또는 확장되지 않는지 검증합니다. 가장 자주 사용하는 서비스에서 특히 중요합니다.
- 비기능 테스트: 보안, 가용성, 용량, 확장성을 검증합니다.
단위 테스트와 인수 테스트는 자동화하기 어렵고 통합(서비스) 테스트 자동화에 크게 의존한다면 아키텍처가 강하게 결합되어 있을 수 있습니다. 아키텍처 요소를 분리할 방법을 찾으세요.
결론
이 장에서는 DevOps에서 테스트 자동화가 중요한 이유를 살펴봤습니다. 테스트 자동화는 빠르고 안전한 제공에 핵심입니다.
조직의 DevOps 도입 여부와 관계없이, 테스트 자동화 없이는 내부 및 외부 고객을 잘 지원하면서 세계적 수준의 성공, 생산성, 수익성을 갖춘 IT 조직을 만들 수 없습니다.
