Windows Browsers: how to run them in Docker containers

서문

정원덕
selenium-korea
7 min readMay 20, 2019

--

테스트 비용이 높은 IE, Edge를 Dcoker container에 넣어서 구동할 수 있다면, 테스트비용을 획기적으로 낮출 수 있을 것입니다. 이것을 가능하게 한 방법을 소개합니다. 이 발표는 Aerokube의 다른 글인 “Selenium on Windows: Docker Revolution”을 참조했습니다.

연설자 소개

Ivan Krutov는 10년 이상의 Java와 Golang 프로그래밍 경력을 가지고 있습니다. 지난 5년간은 병렬로 수천개의 브라우저들을 실행시킬 수 있는 인프라스트럭쳐를 운영해왔습니다. 2019년 현재 Aerokube에 재직중입니다.

왜 IE, Edge 브라우저가 중요한거죠?

  1. Windows OS는 75–80%의 시장 점유율 (2019.3)
  2. 약 10–12%의 유저들이 IE나 Edge로 웹페이지를 방문 (2019.3)
  3. 일부 오래된 App들은 IE에서만 동작
  4. 큰 규모의 회사들(특히 은행이나 정부기관)은 IE를 정책적으로 사용
  5. Windows OS와 Linux OS는 다른 랜더링 방식을 가짐

위 이유들을 살펴보니 IE, Edge의 테스트가 의미있다는 것을 이해할 수 있습니다. 그렇다면 IE와 Edge의 테스트 진행에서 나타나는 문제점은 무엇일까요?

IE, Edge를 테스트할 때의 문제점

  1. IE, Edge는 Windows 위에서만 실행
  2. 장시간 실행되는 Virtual machine에 배치되므로 메모리부족(out of memory) 발생가능
  3. Edge 모두 병렬수행이 불가능 — 1개의 테스트만 수행
  4. IE는 병렬수행이 가능하나 별도의 작업이 필요

그러므로 현재 상황에서는 IE와 Edge의 테스트 비용이 높습니다.

Big Selenium Cluster

Ivan이 다루어야 했던 Cluster 환경은 다음과 같은 조건을 가지고 있었습니다.

  1. 5000개 이상의 브라우저
  2. 하루의 250만개의 세션
  3. 5개의 데이터 센터
  4. 4000 RPS(Requests per seconds)
  5. 2 Gbit/s 의 트래픽

그리고 대상 브라우저는 다음과 같았습니다.

  1. Firefox
  2. Chrome
  3. Edge
  4. Opera
  5. IE
  6. Android mobile web
  7. Apple mobile web

이 조건 위에서 Ivan은 다음과 같은 Selenium Tool 조합을 사용했습니다.

  1. Selenoid — Docker를 사용한 Selenium 프로토콜입니다. 이것으로 브라우저를 Docker 안에서 실행시킬 수 있습니다.
  2. Moon — Selenium이 Kubernetes 환경 위의 브라우저를 제어할 수 있도록 해줍니다
  3. Browsers — Selenium이 제어할 대상 브라우저들

하지만 전형적인 Selenium 테스트 과정에서는 IE와 Edge는 여전히 테스트 비용이 높습니다. 위와 같은 테스트 클러스터 환경이라면 IE와 Edge가 다른 브라우저들처럼 병렬 수행이 가능하며 확장가능성이 높은 테스트가 가능해야 가치가 있을 것입니다. 이 문제를 어떻게 해결할 수 있을까요?

Traditional Selenium Testing

기존의 Selenium testing은 다음과 같은 단계를 거쳐 실행되었습니다.

  1. Selenium API
  2. Web Drvier
  3. Browser

이렇게 실행되는 IE, Edge 테스트는 여러가지 문제점을 가지고 있습니다. 윈도우즈 브라우저들은 오랫동안 실행되는 가상 머신 위에서 실행됩니다. 그러므로 임시 인터넷 파일들로 인해 out of memory가 발생할 수 있습니다. 혹은 memory leak이 일어날 수도 있습니다. 그리고 같은 머신 위에서 다른 이전 버전의 IE, Edge 브라우저를 띄우는 것은 불가능합니다. 자동 업데이트시, 이전 버전을 강제적으로 삭제하기 때문이죠. 안타깝게도 2019년 현재, Edge는 하나의 Window os에서는 하나의 테스트 밖에 돌릴 수 없습니다. IE는 우회적인 방법이 있지만 매우 까다롭습니다.

게다가 불행히도 Microsoft의 IE의 WebDriver 업데이트는 속도가 매우 늦습니다. 어떤 이슈는 3년이 지나서야 이슈가 등록되고, 1년반 동안 아무런 대응이 없는 경우도 있습니다.

IE 브라우저는 이슈 업데이트가 매우 늦습니다

이것은 Windows의 Selenium testing 비용을 높이는 또다른 이유가 됩니다. 하지만 만약에 변경이 불가능한 짧은 주기의 container에 IE, Edge를 넣어서 테스트를 돌릴 수 있고 확장가능하다면 획기적으로 효율적인 테스트가 가능하지 않을까요? Windows가 포함된 Docker Image를 이용한다면 어떨까요?

Browser in containers

IE도 Firefox처럼 Container안에 넣어서 Sacalable하게 만들면 어떨까요?

Windows를 Docker Image로 만들려면 어떻게 해야할까요? Docker로는 command line으로 실행할 수 있는 Windows application만 실행가능합니다. 다시 말해 Docker를 이용해 직접 브라우저를 실행할 수는 없습니다. 하지만 Docker container안에서 가상머신을 돌리는 것은 가능하죠.

게다가 병렬 테스트 실행을 위해서 Kubernetes에서 Selenium cluster를 실행한다면, aerokube에서 제공하는 오픈소스 Selenoid로 간단히 제어할 수 있습니다. JSON 설정파일로 제어가 가능하죠.

Selenoid를 통해 이제 다양한 버전의 IE, Edge 브라우저로 병렬 테스트를 해볼 수 있습니다.

Docker container안에 가상머신을 실행, 다시 그 안에서 Windows를 구동합니다
디버깅도 가능합니다!
테스트 상황을 비디오로 캡쳐할 수도 있습니다

마지막으로 Windows의 라이센스를 고려하지 않을 수 없는데요, 가상 머신에서 구동하는 경우, 총 4개의 이미지까지 실행할 수 있습니다. IE, Edge에서 많은 테스트를 돌려야 한다면 Selenoid + Moon + Windows image 툴 조합은 좋은 선택이 될 수 있을 것으로생각되네요.

References

  1. https://github.com/aerokube/selenoid
  2. https://github.com/aerokube/windows-images
  3. https://aerokube.com/
  4. https://www.youtube.com/channel/UC9HvE3FNfTvftzpvXi9c69g
  5. https://medium.com/@aandryashin/selenium-on-windows-docker-revolution-f5a7eab205ad
  6. https://medium.com/@aandryashin/selenium-on-windows-revisited-1ab8d51ccc06

--

--

정원덕
selenium-korea

자비스앤빌런즈 프론트엔드 챕터장