뛰어난 고객 경험 제공 위한 셔터스톡 ‘디지털 트랜스포메이션’ (5)
상태바
뛰어난 고객 경험 제공 위한 셔터스톡 ‘디지털 트랜스포메이션’ (5)
  • 데이터넷
  • 승인 2020.04.19 07:00
  • 댓글 0
이 기사를 공유합니다

품질 저하 없이 빠른 개발 속도 유지 위해 견고한 통합 테스트 툴킷 활용

[데이터넷] 2014년부터 디지털 트랜스포메이션을 추진한 셔터스톡은 현재 클라우드, 쿠버네티스 및 컨테이너 기술 등을 활용해 새로운 서비스들을 선보이고 뛰어난 고객 경험을 제공하고 있다. 그 외에도 독보적인 이미지 검색 기능, 컴퓨터 비전, API 등을 통해 전 세계 고객이 언제 어디서나 필요한 콘텐츠를 얻을 수 있도록 지원하고 있다. 본지에서는 6회에 걸쳐 셔터스톡의 IT 개발자들이 셔터스톡의 기술과 개발 과정을 추진한 과정을 연재한다. <편집자>

<연재 순서>

1. 셔터스톡의 디지털 트랜스포메이션 추진 이유 및 과정
2. 컴퓨터 비전과 딥러닝 기술 활용
3. 기술을 통해 인기 콘텐츠와 신규 콘텐츠 사이에 적절한 밸런스를 찾아 고객에게 제안하는 법
4. 어느 기업이나 API를 통해 셔터스톡과 콘텐츠 연계 가능
5. 프런트엔드 애플리케이션 통합 테스팅
6. 자체 이미지 편집 도구인 셔터스톡 에디터의 다중언어 지원 및 이미지 필터링 기능 개발 과정

스웨타 사브네(Shweta Sabne) 셔터스톡 수석 엔지니어
스웨타 사브네(Shweta Sabne) 셔터스톡 수석 엔지니어

셔터스톡은 지속적으로 새로운 기능을 추가하고 사용자들을 위해 웹사이트의 기능을 개선하고자 노력하고 있다. 품질 저하 없이 빠른 개발 속도를 따라가기 위해서는, 개발자가 프런트엔드 애플리케이션을 격리된 상태에서 테스트하면서 코드에 대한 빠른 피드백을 수집할 수 있는 견고한 테스트 툴킷이 필요하다. 통합 테스트 툴킷과 이점에 대해 자세히 알아보도록 하자.

통합 테스트가 필요한 이유

셔터스톡 프런트엔드 애플리케이션은 마이크로서비스 배열에 기반한다. 만약 프런트엔드에 대한 엔드투엔드 테스트에만 의존한다면, 추가 추적을 해야 하기 때문에 테스트 실패를 디버깅하는 것은 훨씬 어려워지고 시간이 많이 걸릴 것이다. 또한, 엔드투엔드 테스트는 테스트 환경에 특정한 애플리케이션과 그 기반 서비스 의존성을 배치해야 하기 때문에 장시간 동안 실행된다. 결과적으로, 개발자의 코드 품질에 대한 피드백 루프는 지연되기 마련이다.

통합 테스트는 개발자들이 로컬에서 애플리케이션을 시작하고 목(mock) 객체를 활용해 모든 의존성을 없애고 개발/테스트하는 기능에 집중할 수 있도록 한다. 통합 테스트의 주요 이점은 다음과 같다.

- 신뢰성
- 격리된 프런트엔드, 기능 중심 테스트 가능
- 업스트림 행동을 시뮬레이션하고 탐색 테스트를 수행하는 기능
- 애플리케이션 성능에 대한 조기 통찰력 제공

프런트엔드 애플리케이션 위한 통합 테스트 툴킷

셔터스톡의 통합 테스트 툴킷은 ‘노크(Nock)’, ‘모카(Mocha)’, ‘차이(Chai)’, 그리고 ‘퍼펫티어(Puppeteer)’로 구성된다.

셔터스톡 통합 테스팅 툴킷 구성도
[그림 1] 셔터스톡 통합 테스팅 툴킷 구성도

● 노크
노크를 활용해 서버에서 외부 서비스로의 HTTP 호출을 가로채서 오버라이드(override, 영향력을 행사해 결정 바꾸기)한다. 이를 통해 테스트에 대한 입력을 제어할 수 있어 동일한 입력에 동일한 출력이 나오는 결정성과 신뢰성을 가져온다. 또한 개발자가 코드를 개별적으로 테스트할 수 있게 해준다. 테스트는 외부 서비스를 호출할 필요가 없으므로 더 우수한 성능을 보인다.

● 퍼펫티어
퍼펫티어를 사용해 클라이언트 애플리케이션을 테스트한다. 퍼펫티어는 셔터스톡 웹사이트에서 사용자 상호작용을 모방하게 하는 기능을 많이 가진 문서화된 라이브러리이다. 그 외에도, 퍼펫티어를 사용해 클라이언트에 의한 외부 호출을 가로채고 오버라이드한다. 또한 디버깅을 쉽게 하기 위해 콘솔 로그, 요청 실패 로그, 스크린샷을 비롯한 아티팩트(artifact)를 캡처할 수 있는 기능도 활용하고 있다.

● 모카&차이
모카를 테스트 러너, 차이를 툴 킷의 어서션(assertion) 라이브러리로 활용하고 있다. 둘 다 다른 테스트러너 또는 어서션 라이브러리로 대체할 수 있지만, 문서화되고 직관적이며 사용하기 쉽기 때문에 모카를 선택했다.

통합 테스트 수명 주기

통합 테스트 수명주기
[그림 2] 통합 테스트 수명주기

[그림 2]는 셔터스톡이 활용하는 툴킷을 사용한 통합 테스트의 수명주기를 보여준다. 테스트는 모카를 사용해 실행된다. 모카의 비포어 후크(before hook) 기능을 이용해 애플리케이션을 로컬에서 시작하고 테스트 모드를 정한다. 테스트 모드는 환경 변수에 의해 정의된다. 테스트 모드에 따라 통합 테스트는 기록, 재생 또는 실행된다.

각 모드에 대한 세부 사항은 다음과 같다.

● RECORD
이 모드에서 테스트는 노크를 사용하는 동안 서비스에 실제 호출을 하고 퍼펫티어의 기록 및 가로채기 기능을 사용해 이러한 호출을 기록한다. 일반적으로 테스트를 처음 작성할 때, 모든 외부 요청/반응을 포착하기 위해 RECORD 모드로 실행된다. 우리는 중복되는 부분을 없애고 타임스탬프를 비롯한 기록의 일시적인 부분에 대한 정규표현식(regex) 언어와의 일치하는 부분을 추가하기 위해 기록을 사후 처리한다.

● Play
이 모드에서 테스트는 RECORD 모드에서 생성된 기록을 사용한다. 노크와 퍼펫티어의 가로채기 기능을 사용해 테스트는 호출에 대해 일치하는 레코딩이 있는지 여부를 탐지하고, 만약 있다면 호출은 일치하는 기록에 의해 오버라이드된다. 이 모드를 사용해 CI/CD 파이프라인에서 테스트를 실행한다. 지정된 호출에 대해 일치하는 기록을 찾을 수 없으면 테스트가 실패해 개발자에게 테스트를 다시 RECORD해야 할지 표시한다.

● NO_MOCK_NO_PLAY
이 모드를 통해 기록이 오래되지 않았는지 확인할 수 있다. NO_MOCK_NO_PLAY 모드를 사용할 때는 발신 호출을 기록하지 않으며, 오버라이드를 시도하지 않는다. 테스트가 실제 서비스 호출을 하도록 놔둔다. 불량한 기록으로 인해 고장이 발생하지 않도록 테스트 출력이 자동으로 감시된다. 이 모드에서 테스트는 업스트림 서비스가 인터페이스를 변경하지 않고 잘못된 입력에 따라 테스트가 작동하지 않는지 확인하기 위해 정기적으로 실행된다.

툴킷을 구현한 후 다음과 같은 긍정적인 결과를 확인했다.

● 향상된 테스트 실행 시간:
기존 셀레늄(Selenium) 기반 엔드투엔드 테스트 제품군보다 72% 뛰어난 성능
통합 테스트는 CI/CD 파이프라인의 단위 테스트와 함께 실행되며 8분간의 풀 리퀘스트(pull request) 생성으로 개발자에게 피드백을 제공

● 향상된 범위 확인:
JS 및 CSS 코드 적용범위에 대한 데이터를 수집해 테스트의 완성도와 효율성을 보다 쉽게 측정

● 성능에 대한 초기 통찰력:
개발자가 외부 호출을 기록 형태로 시각화할 수 있게 돼 애플리케이션 성능을 개선하기 위한 전략 구현 가능

노크, 모카 및 퍼펫티어의 기능을 사용해 프런트엔드 애플리케이션을 위한 강력한 통합 테스트 툴킷을 구현할 수 있게 됐다. 엔드투엔드 테스트와 함께 사용하는 통합 테스트를 통해 고품질의 넓은 범위의 테스트 전략을 실행할 수 있게 돼 고객에게 최상의 경험을 제공할 수 있다.



댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글 0
댓글쓰기
계정을 선택하시면 로그인·계정인증을 통해
댓글을 남기실 수 있습니다.