현재 제품에 대해 점점 더 많은 통합 테스트를 확장하여 (인간적으로) 개발 및 CI 프로세스의 일부로 유지 될 수 있는 기술과 전략을 조사하고 있습니다 .
약 200 개 이상의 통합 테스트에서 우리는 이미 전체 테스트 실행 (데스크톱 개발 시스템에서)을 완료하기 위해 1 시간 안에 도달했으며, 이는 개발자가 일상적인 푸시 프로세스의 일부로 전체 제품군 실행을 허용하는 개발자의 능력에 부정적인 영향을 미칩니다. 그것들을 잘 만드는 것에 대한 훈련을받는 동기에 영향을 미칩니다. 우리는 핵심 시나리오 만 앞뒤로 통합 테스트하고 각 테스트 실행에서 처음부터 빌드되는 프로덕션을 미러링하는 환경을 사용합니다.
실행하는 데 시간이 걸리기 때문에 테스트 실행이 아무리 집중되어 있더라도 끔찍한 피드백 루프와 테스트 실행을 마치기 위해 기계를 기다리는 많은 낭비되는주기가 있습니다. 흐름과 진행, 건강 및 지속 가능성에 더 비싼 부정적인 영향을주지 마십시오.
이 제품의 속도가 느려지기 전에 10 배나 더 많은 통합 테스트가 필요할 것으로 예상됩니다 (실제로 생각하지는 않지만 아직 기능 측면에서 시작된 것 같지는 않습니다). 우리는 수백 또는 수천 개의 통합 테스트를 기대할 수 있어야한다고 생각합니다.
분명히, 이것이 단위 테스트와 통합 테스트에 대한 논의가되는 것을 막으려 고 노력하십시오. 이 제품에서 TDD를 사용한 단위 테스트와 통합 테스트를 모두 수행하고 있습니다. 실제로, 우리는 아키텍처 의 패턴을 다른 영역으로 변경할 때 주요 변경 사항을 도입 해야 하는지를 검증 해야하므로 서비스 아키텍처의 다양한 계층에서 통합 테스트를 수행 합니다. 체계.
우리의 기술 스택에 대해 조금. 우리는 현재 (CPU 및 메모리 집약적) 에뮬레이션 환경에서 테스트하여 엔드 투 엔드 테스트를 수행하고 있습니다. noSql 백엔드 (ATS)를 향한 Azure REST 웹 서비스로 구성됩니다. Azure 데스크톱 에뮬레이터 + IISExpress에서 실행하여 프로덕션 환경을 시뮬레이션하고 있습니다. 우리는 dev 머신 당 하나의 에뮬레이터와 하나의 로컬 백엔드 저장소로 제한됩니다.
또한 동일한 에뮬레이션 환경에서 동일한 테스트를 실행하는 클라우드 기반 CI도 있으며 현재 CI 공급 업체와 함께 클라우드에서 테스트 실행 시간이 2 배 이상 (2 시간 이상) 소요됩니다. 하드웨어 성능 측면에서 클라우드 CI 제공 업체 SLA의 한계에 도달했으며 테스트 런타임에 대한 허용치를 초과했습니다. 그들에게 공평하게 말하면, 그들의 사양은 나쁘지 않지만 사내 그런지 데스크톱 컴퓨터의 절반은 명확합니다.
각 논리 테스트 그룹에 대해 데이터 저장소를 재구성하고 테스트 데이터를 사전로드하는 테스트 전략을 사용하고 있습니다. 데이터 무결성을 포괄적으로 보장하면서 각 테스트에 5-15 %의 영향을줍니다. 따라서 우리는 제품 개발에서이 시점에서 테스트 전략을 최적화 할 수있는 방법이 거의 없다고 생각합니다.
우리는 각 테스트의 처리량을 최적화 할 수 있지만 (각각 30 % -50 %까지도) 수백 번의 테스트로 가까운 미래에도 효과적으로 확장 할 수는 없습니다. 1 시간이 지나도 여전히 인간이 견딜 수있는 수준을 넘어서고 있기 때문에 전체 프로세스를 지속 가능하게하려면 상당한 규모의 개선이 필요합니다.
테스트 시간을 대폭 단축하기 위해 사용할 수있는 기술과 전략을 조사하고 있습니다.
- 적은 테스트를 작성하는 것은 옵션이 아닙니다. 이 글에서 그 내용에 대해 토론하지 마십시오.
- 더 빠른 하드웨어를 사용하는 것은 매우 비싸지 만 선택 사항입니다.
- 병렬로 별도의 하드웨어에서 테스트 / 시나리오 그룹을 실행하는 것도 확실히 선호되는 옵션입니다.
- 개발중인 기능 및 시나리오를 중심으로 테스트 그룹을 작성하는 것은 그럴듯하지만 궁극적으로 시스템이 변경의 영향을받지 않는다는 전체 범위 또는 확신을 제공하는 데 신뢰할 수는 없습니다.
- 데스크톱 에뮬레이터에서 실행하는 대신 클라우드 규모의 준비 환경에서 실행하는 것이 기술적으로 가능하지만 테스트 실행에 배포 시간을 추가하기 시작합니다 (테스트 실행 시작시 각각 ~ 20 분).
- 시스템 구성 요소를 독립적 인 로지스틱 조각으로 나누는 것은 어느 정도 그럴듯하지만, 구성 요소 간의 상호 작용이 시간이 지남에 따라 증가 할 것으로 예상되므로 마일리지가 제한적입니다. (즉, 시스템이 점진적으로 개발 될 때 종종 발생하는 것처럼 변경이 예상치 못한 방식으로 다른 사람에게 영향을 줄 수 있음)
나는이 분야에서 다른 사람들이 어떤 전략을 사용하고 있는지보고 싶었습니다.
(다른 사람들이 특정 기술 세트를 사용하면 이런 종류의 어려움을 겪고 있다고 생각해야합니다.)
[업데이트 : 12/16/2016 : 결과에 대한 논의를 위해 CI 병렬 테스트에 더 많은 투자를하게되었습니다. http://www.mindkin.co.nz/blog/2015/12/16/16-jobs]