LINE Corporation이 2023년 10월 1일부로 LY Corporation이 되었습니다. LY Corporation의 새로운 기술 블로그를 소개합니다. LY Corporation Tech Blog

Blog


ELK와 Grafana를 이용해 테스트 자동화 시각화하기

Tech-Verse 2022에서 이준수 님이 발표한 ELK와 Grafana를 이용해 테스트 자동화 시각화하기 세션 내용을 옮긴 글입니다.

안녕하세요. LINE Plus QA 엔지니어 이준수입니다. LINE Desktop 서비스를 담당하고 있으며, 팀 내에서 자동화 테스트 환경 구축과 개발 등 기술 영역을 담당하고 있습니다. 이번 글에서는 자동화 테스트의 한계였던 테스트 모니터링을 시각화로 개선하고 더 나아가 테스트 전처리 자동화를 통해 자동화 테스트로 발전시킨 사례를 소개하겠습니다.

이 글은 테스트 자동화에 관심이 있거나 테스트 자동화를 운영하고 있는 조직에서 많이 읽으실 것 같은데요. 혹시 현재 조직에서 테스트 결과 리포트는 어떻게 보고 계신가요? 테스트 솔루션에서 제공하는 단순한 리포트 페이지를 보시나요? 많은 분들이 테스트 자동화를 개발하는 데 급급한 나머지 테스트 솔루션에 의지하거나 아예 테스트 결과에는 큰 의미를 두지 않는 것 같습니다. 분명 많은 리소스를 투입해서 테스트 자동화를 멋지게 구현했는데 결과를 공유할 때는 아래와 같이 표가 나열된 심심한 결과 페이지를 만드는 경우를 많이 접했기 때문입니다.

우리는 테스트 진행 상황을 알지 못합니다. 테스트가 얼마나 진행됐고 언제 끝날지 알 수 없습니다. 테스트를 운영하면서 나름대로 경험을 축적해 이를 바탕으로 대략 가늠할 수는 있겠지만, 어찌 됐든 한 번 시작되면 그저 하염없이 기다려야 합니다. 기다리는 게 싫다면 테스트 솔루션 페이지를 새로고침하면서 어떤 테스트 케이스를 완료했는지 볼 수도 있는데요. 테스트 솔루션에 의지한 채 결과를 받아보기만 하는 상황은 테스트 자동화를 개발하고 운영하는 저조차도 굉장히 답답했습니다.

그래서 간단하지만 꼭 필요할 것 같은 과제 하나를 시작했습니다. 바로 테스트 자동화 시각화입니다.

테스트 자동화 시각화 결과

본격적으로 들어가기에 앞서 이번 글에서 소개하려는 프로젝트의 결과물을 보여드리겠습니다. 전체 아키텍처는 아래와 같습니다. 다양한 오픈소스 툴을 사용해 전체 파이프라인을 디자인했습니다. 

진행하고 있는 테스트 상태 전반은 Slack 알림으로 전달받을 수 있고, 아래와 같이 Grafana 대시보드를 활용해서 데이터를 시각화해 가독성을 높였으며, 실시간으로 모니터링할 수 있습니다.

또한 Grafana와 Jenkins를 이용해서 테스트 전반에서 발생한 이벤트를 Slack으로 전송해서 아래와 같이 누구나 Slack 메시지로 테스트 진행 상황을 공유 받을 수 있게 만들었습니다.

테스트 자동화를 시각화한 이유

저는 2021년에 LINE에 합류했습니다. 현재도 그렇지만 당시에도 저희 조직은 LINE 데스크톱은 물론이고 대만에서 운영하는 글로벌 LINE 플랫폼과 LINE 애플리케이션 내 갤러리 영역 등 팀 규모에 비해 굉장히 많은 서비스를 담당하고 있었습니다.

저희는 담당하는 서비스가 사용자에게 좋지 않은 경험을 주지 않도록 일당백으로 노력하면서 더 좋은 서비스를 만들기 위해 테스트 자동화를 운영하고 있었습니다. 각 서비스마다 여러 개의 테스트 자동화 잡을 구성해 운영하고 있었는데요. 예를 들어 회귀 테스트 잡과 짧은 시간 주요 기본 기능을 테스트하도록 구성한 퀵 테스트 잡, 앱 스킴만을 테스트하기 위해 개발한 브로드캐스트 테스트 잡 등의 테스트 자동화 잡을 운영하고 있었습니다. 서비스별로 필요하면 더 많은 테스트 잡을 개발해 운영하기도 했습니다.

이처럼 한 서비스에서 여러 개의 테스트 자동화를 개발해 운영했기 때문에 매일매일 관련 메일을 몇 통씩 받아야 했는데요. 어느 날 읽지 않은 채 쌓여만 가고 있는 테스트 자동화 리포트 메일을 발견하게 됐습니다.

읽지 않고 쌓아 놓은 메일을 보니 테스트 자동화를 개발하는 개발자에게 굉장히 미안해졌습니다. 이런 리포트 메일을 작성하기 위해서 개발자는 정말 많은 수고를 해야 합니다. 매일 아침 새로 빌드된 테스트 애플리케이션이 있는지 확인하고, 테스트 잡 유지 보수를 진행하며, 테스트 애플리케이션이 안정적으로 실행되도록 테스트 코드를 개발하고 운영해야 합니다.

또한 그렇게 운영하는 테스트 자동화의 결과를 분석해서 매일매일 결과 메일을 작성해 공유해야 했는데요. 아무도 반응하지 않고 심지어 메일도 열어보지 않는다면 의미 없는 일을 하고 있다고 생각할 수도 있고 굉장히 따분한 일로 느낄 수도 있습니다.

상황이 이렇다 보니 수많은 서비스의 품질을 책임지는 입장에서 테스트 진행 상황이나 결과를 한눈에 보고 싶다는 니즈가 생겼습니다. 여러 서비스의 테스트 자동화 결과와 진행 상황을 보기 쉽게 모니터링하고 싶다는 간단하고 명료한 니즈였는데요. 기존에 운영하고 있던 테스트 자동화는 이런 부분에서 전혀 준비가 돼 있지 않았습니다. 그래서 프로젝트를 시작했습니다.

테스트 자동화 시각화 프로젝트 시작

LINE에서는 다양한 테스트 솔루션을 이용해 테스트 코드를 개발하고 운영하고 있기 때문에 각 솔루션에서 여러 형태로 출력되는 로그를 적은 리소스로 손쉽게 처리할 수 있어야 했습니다. 또한 새로운 서비스에서 테스트 자동화를 구현할 때 쉽고 빠르게 확장할 수 있어야 했습니다.

이런 니즈를 충족시키기 위해 믿을 수 있고 유연한 오픈소스 툴 체인으로 로깅 플랫폼을 구성하고 싶었습니다. 많은 개발자의 검증을 거쳐 신뢰를 확보했고, 많은 개발자의 다양한 요구 사항을 수용할 수 있도록 유연한 구조로 설계된 오픈소스를 도입하고 싶었습니다. 이를 통해 다양한 형태의 테스트 자동화와 시너지를 내기를 기대했습니다.

이런 목표를 달성하기 위해 아래와 같이 네 개의 액션 아이템을 선정해 진행했습니다.

먼저 ELK 스택으로 파이프라인을 구축했습니다. ELK 스택은 로그를 수집하고 분석하는 오픈소스 툴로, 수많은 서비스에서 로그를 수집하고 분석하는 데 활용하고 있는 대표적인 툴 체인입니다. 다음으로 로깅 플랫폼에서 어떤 로그 필드를 정의하고 사용할지 결정했습니다. 로그 필드는 이후 대시보드를 구성할 때 보다 유의미한 결과를 볼 수 있도록 선택한 데이터 집합체입니다. 이어서 이 로그 필드를 기록하는 역할을 담당할 로거를 개발했습니다. 로거는 테스트 자동화를 구동할 때 필요한 정보를 출력하는 기능을 담당합니다. 마지막으로 테스트 진행 상황과 결과를 한눈에 볼 수 있도록 시각화한 대시보드를 만들었습니다. 대시보드에서는 방대한 테스트 데이터를 차트나 그래프를 활용해 보기 쉽게 정리해 줍니다.

테스트 자동화 시각화 구축 과정

테스트 자동화를 시각화한 과정을 구축한 순서대로 하나씩 살펴보겠습니다.

ELK 스택으로 파이프라인 Heimdall 구축

ELK는 현재 많은 서비스나 프로젝트에서 원하는 메시지를 실시간으로 수집하기 위해 사용하고 있는 툴입니다. 검색과 분석에 활용하는 엔진인 Elasticsearch와 여러 소스에서 데이터를 수집하고 정제한 뒤 Elasticsearch와 같은 저장소로 전송하는 Logstash, Elasticsearch에서 조회한 데이터를 차트나 그래프를 이용해서 시각화하는 Kibana로 구성돼 있습니다. 이 앞 글자를 따서 ELK라고 부릅니다.

이 ELK 스택을 이용해 테스트 자동화에서 산출된 정보를 Elasticsearch에 적재하는 파이프라인을 구축했는데요. 생성된 로그를 조금 더 쉽게 수집할 수 있도록 아래와 같이 Logstash 앞에 Filebeat를 배치하고, Heimdall이라는 이름을 붙였습니다.

Heimdall은 북유럽 신화에 등장하는 신 이름입니다. 중간계 미드가르드와 신계 아스가르드를 연결하는 불타는 무지개다리인 비프로스트를 소환하는 역할을 담당하는 신인데요. 여러 곳에 흩어져 있는 로그를 한곳으로 모아 연결하는 역할을 담당하겠다는 의미로 Heimdall이라고 이름 지었습니다.

Heimdall의 전체 구조를 조금 더 자세히 살펴보겠습니다. 테스트 자동화를 구동하고 있는 여러 노드에서 생성되는 로그를 Filebeat를 통해 Logstash로 전달합니다.

Logstash에서는 데이터를 정제해서 꼭 필요한 로그만 남긴 뒤 Elasticsearch에 적재합니다.

로그 필드 정의

다음으로 로깅 플랫폼으로 서빙할 로그에 어떤 정보를 정의해서 전달할지 결정했습니다. 이후 대시보드에서 활용할 정보인데요. 아래와 같이 테스트에 사용하는 애플리케이션 정보와 테스트 케이스 정보, 기기 정보 등 테스트 진행 상황과 결과를 쉽게 알 수 있는 상세한 정보로 약 20개 정도 로그 필드를 정의했습니다.

ActionLog.Script 로거 개발 후 Elasticsearch에 로그 적재

다음으로 로그를 출력하는 로거를 개발했습니다. 로거는 코드를 실행할 때 발생하는 이벤트나 메시지를 기록하는 도구입니다.

보통 문제가 발생했을 때 로그를 보고 원인을 파악하는데요. 당시 운영하던 테스트 솔루션은 로그 관련 기능이 좋지 않아서 기본으로 제공되는 로거를 활용할 수 없었습니다. 이에 테스트 솔루션에 적합한 로거를 직접 개발해서 ActionLog.Script라는 이름을 붙였습니다.

ActionLog.Script는 테스트 솔루션에서 실행할 수 있는 여러 이벤트, 예를 들어 애플리케이션 실행 및 종료나 특정 엘리먼트를 찾거나 클릭하는 행위 등 모든 이벤트가 발생했을 때 관련 정보를 ActionLog.Script 파일로 남기도록 개발했습니다.

ActionLog.Script로 남긴 로그는 Elasticsearch에 적재합니다.

Grafana로 대시보드 생성

마지막으로 Grafana라는 오픈소스 툴을 사용해 대시보드를 만들었습니다. Grafana는 Elasticsearch와 MySQL 등에 연동해서 데이터를 시각화할 수 있는 오픈소스 툴입니다. 데이터를 연동해서 쿼리를 입력하면 원하는 형태로 데이터를 시각화할 수 있고, 어떤 데이터와도 연동 가능하며, 쉽게 대시보드를 만들고 수정할 수 있습니다.

앞서 만든 파이프라인을 통해 자동화 테스트에서 생성된 로그가 Elasticsearch에 적재되면, Grafana에서 Elasticsearch로 질의해 원하는 데이터를 가져올 수 있습니다. 가져온 데이터를 차트나 그래프와 같은 다양한 형태로 시각화해서 조합하면 대시보드 하나가 생성됩니다.

아래는 취합한 로그 데이터로 생성한 각종 패널입니다. 테스트를 진행한 기기의 이름과 앱 버전 등을 확인할 수 있고, 각 테스트 케이스가 성공했는지 볼 수 있습니다.

아래는 이런 패널을 하나로 모아 대시보드를 구성한 모습입니다. 실제로 운영하고 있는 대시보드 화면을 캡처한 것인데요. 테스트 진행 상황과 결과를 누구나 직관적으로 확인할 수 있습니다.

테스트 자동화 시각화 시범 운영 결과

이와 같이 구축한 테스트 자동화 시각화를 시범적으로 운영하면서 놀라운 결과를 얻을 수 있었습니다. 먼저 테스트 진행 상황과 결과를 누구나 실시간으로 확인할 수 있게 됐습니다. 이것만으로도 상당한 진전이었습니다. 두 번째로 텍스트로만 구성돼 있던 리포트를 Grafana 대시보드를 통해 시각화한 덕분에 누구나 쉽게 상황을 파악할 수 있게 됐습니다. 마지막으로 테스트 자동화를 개발하는 개발자가 오롯이 개발에만 집중할 수 있게 됐습니다. 테스트 결과를 매일매일 여러 사람에게 메일로 공유해야 했던 귀찮고 따분한 일을 내려놓고 오롯이 자동화 테스트 개발에만 집중할 수 있게 됐습니다. 불필요한 비용을 줄인 것입니다.

시각화 후 자동화 전처리 과정도 자동화

결과를 보니 더 욕심이 났습니다. 테스트의 시작과 끝도 모두 자동화로 전환하면 테스트 자동화에 한정돼 있던 기존 테스트 환경을 한층 더 업그레이드해서 자동화 테스트로 확장시킬 수 있을 것 같았습니다. 바로 행동으로 옮겨 Jenkins를 설치해서 테스트 자동화 전처리 과정을 맡겼습니다.

Jenkins는 빌드와 배포에 필요한 수많은 과정을 쉽게 관리할 수 있는 CI/CD 도구입니다. 이를 이용해 테스트 자동화를 시작할 수 있는 트리거를 만들었습니다.

Jenkins는 매일 아침 사내 빌드 배포 시스템에 새로운 버전이 있는지 체크하고, 새로운 버전이 배포됐다면 해당 애플리케이션의 회귀 테스트를 진행할 수 있도록 애플리케이션을 다운로드하고 설치한 뒤 테스트 자동화를 운영하고 있는 테스트 솔루션의 회귀 테스트 작업을 실행합니다. 이 모든 과정은 테스트 완료 후 결과까지 Slack으로 공유합니다.

테스트 자동화에서 자동화 테스트로

전처리 과정까지 자동화하면서 테스트 자동화에 그쳤던 기존 운영 방식을 자동화 테스트라고 하는 확장된 형태로 발전시킬 수 있었습니다.

전체 흐름을 간략히 살펴보겠습니다. 먼저 QA 엔지니어가 테스트 코드를 개발하고 GitHub에 푸시하면 Jenkins는 테스트 잡을 실행합니다. 테스트 잡이 실행되면 자연스럽게 데이터가 로깅 플랫폼 파이프라인을 따라 Elasticsearch로 서빙되고, 서빙된 데이터를 기초로 Grafana 대시보드가 완성됩니다.

테스트 진행 상황과 결과는 Slack을 통해 개발자나 QA 엔지니어를 포함해 공유 받기를 원하는 모두에게 공유되며, 직접 Grafana 대시보드로 들어가 보기 좋게 시각화한 결과를 볼 수도 있습니다.

마치며

이번 글에서는 어떻게 테스트 자동화를 시각화하고 더욱 효율적으로 개선했는지 말씀드렸습니다. 테스트 자동화는 의외로 참고할 만한 자료가 많이 없는 영역이며, 프로젝트 초기에는 많은 분들의 높은 관심을 받다가 시간이 지날수록 열기가 사그라드는 게 현실인 영역이기도 한데요. 이번 글을 통해서 한 분이라도 더 테스트 자동화에 관심을 갖고 '이거 해볼 만한 것 같은데?'라고 생각하셨다면 굉장히 기쁠 것 같습니다.

오늘도 많은 고생을 하고 계시는 QA 엔지니어 분께 응원의 말씀을 드리며 이만 마치겠습니다. 긴 글 읽어주셔서 감사합니다.