Docker Selenium ile Paralel Test Koşumu

Kaan Sarıveli
Kariyer.net Tech
Published in
6 min readMay 31, 2018

Selam, selenium testlerinizi parallel koşabilmek için docker-seleniumu nasıl kullanabileceğinizden bahsetmeye çalışacağım.

Selenium Grid Nedir?

Grid testleri farklı browser ve işletim sistemlerinde çalıştırmamızı sağlayan açık kaynak bir projedir. Basit bir yapıya sahiptir. Hub ve node lardan oluşur. Testlerinizi hub a karşı koşarsınız ve hub sizin için testleri gerekli node a yönlendirir.

selenium grid yapısı

Selenium Grid Avantajları:

  • Dağıtık test koşum ile koşum süresini azaltır.
  • Browserlar arası ve işletim sistemler arası teste olanak tanır.

Selenium Grid Dezavantajları:

  • Konfigüre etmesi zordur (Javanın yüklenmesi, selenium standalone server kurulumu, ilgili browser ve driver larının yüklenmesi vb.)
  • Yönetmesi zordur (Farklı browserların farklı versiyonlarını test etme)
  • Kaynak kullanımı konusunda cimri değildir.

Docker Selenium Nedir?

Aynı yapıyı kullanır fakat hub ve node lar birer docker container dır.

Docker Seleniumun Avantajları Nelerdir?

  • Yukarıda bahsettiğim tüm bağımlılıklardan kurtulmuş oluruz.
  • Sistem kaynaklarını bir sanal makine kadar harcamaz.
  • Tüm versiyon karmaşıklığını docker registry sayesinde kolayca yönetebiliriz.

Docker Selenium Konfigürasyonu

Docker-Selenium u kullanabilmek için ilk olarak docker kurulumunu yapmamız gerekiyor. 🙂 Eğer docker sisteminizde halihazırda kurulu değilse, kurulum adımları nı takip edebilirsiniz.

Docker seleniumu konfigüre etmenin birden fazla yolu var. Bu yazıda docker network ve docker compose kullanacağım.

Docker Network

docker network create <NETWORK_NAME> ile bir network oluşturalım. Böylece containerlar birbirleri ile iletişim kurabilecekler.

network yaratma
networkleri listeleme

Diğer network ler docker kurulumu ile birlikte geldi.

Farkettiyseniz, networkü yaratırken herhange bir parametre vermedim, bu nedenle varsayılan olarak “bridge” kullanıldı. Farklı kullanım senaryoları için Host, Overlay ve Macvlan gibi farklı network tipleri var. Örneğin, eğer containerlarınız farklı docker hostları üzerinde ise Overlay network e ihtiyacınız olacaktır.

Neden varolan “bridge” networkü kullanmıyoruz da ayrı bir bridge network oluşturuyoruz diye sorabilirsiniz. Nedeni kendi tanımladığımız networkün varsayılan network üzerinde otomatik DNS çözümleme vb. gibi avantajlarının olmasıdır. Eğer varsayılan networkü kullanıyorsak containerları birbirine –link parametresi ile bağlamalıyız, ki bu artık eski bir kullanım şekli ve tavsiye edilmiyor.

Şuan için networkümüzde herhangi bir container yok.

Docker hub yaratma

$ docker run -d -p 4444:4444 —net grid — name selenium-hub selenium/hub:3.11.0-dysprosium

d: detached(bağımsız) mod. Bu komut ile container arka planda başlar ve konsolda herhangi bir çıktı görmezsiniz.

p: publish port (containerın 4444 numaralı portunu hostun 4444 numaralı portuna bağlıyoruz.)

net: containerın hangi networkü kullanacağını belirtiyoruz.

name: container ismini tanımlıyoruz.

hub yaratma

Peki arka planda ne oldu?

Docker Yapısı

Adım-1: Docker istemcisi docker daemona bağlandı.

Adım-2: Docker daemon “hub” imajını Docker Hub dan çekti.

Adım-3: Docker daemon bu imajdan yeni bir container yarattı.

Eğer container loglarını görmek istiyorsanız aşağıdaki komutu kullanabilirsiniz.

docker logs <CONTAINER_ID>

docker-selenium için oluşturulmuş ve Docker Hub da bulunan imajlar:

  • base
  • hub
  • node-base
  • node-chrome
  • node-firefox
  • node-chrome-debug
  • node-firefox-debug
  • standalone-chrome
  • standalone-firefox
  • standalone-chrome-debug
  • standalone-firefox-debug

node-{browser adı} ve node-{browser adı}-debug tek başına kullanılamaz; bir huba bağlanmalıdır. Debug verisyonlar ise VNC server barındırır. Bu sayede test sırasında görsel olarak debug edebiliriz.

docker images ile varolan imajları listeleyelim.

imajlar

İmajları isimlendirme kuralı şöyle;

<Major>.<Minor>.<Patch>-<alfabetik sırada kimyasal element>

Bu yazıyı yazdığımda son versiyon “dysprosium” du. Eğer hangi imajı indirmek isteiğinizi etiketi ile belirtmezseniz son versiyonu indirecektir.

Şimdi docker ps ile containerların durumuna bakalım.

Hub ayakta görünüyor. Bir de konsolundan kontrol edelim.

http://localhost:4444/grid/console

selenium hub arayüzü

Docker Node Yaratma

Chrome node yaratma:

$ docker run -d —net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-chrome:3.11.0-dysprosium

e: ortam değişkenleri. NODE_MAX_SESSION, NODE_MAX_INSTANCE vb. bu kısımda tanımlanır. Diğer ortam değişkenlerini docker inspect <IMAGE_ID> komutu ile görebilirsiniz.

v: Bu parametre resmi dökümantasyonda hostun paylaşılan belleğini kullanmak için tavsiye edilmiş.

Benzer şekilde, docker daemon chrome imajını bulamadı, indirdi, containerı başlattı ve id sini ekrana bastı.

Bir tane de Firefox node ekleyelim:

$ docker run -d —net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-firefox:3.11.0-dysprosium

Aynı şey. Tek fark imaj ismi. Chrome u firefox ile değiştirdim. 🙂

Bir hub ımız, bir chrome ve bir firefox nodeumuz var. docker images komutu ile kontrol edelim.

docker ps ile durumlarına bakalım.

Eğer networkümüze tekrar bakarsak, eklediğimiz containerları görebiliriz.

networkümüz

Herşey hazır. Şimdi bir test çalıştırmayı deneyelim.

Testin Çalıştırılması

Test için kullandığım selenium projesini burada baştan yazmayacağım. Bunun için aşağıdaki projeyi kullanabilirsiniz.

https://www.swtestacademy.com/selenium-parallel-tests-grid-testng/

Kodda sadece iki şeyi değiştirmeniz gerekiyor. TLDriverFactory classında RemoteWebdriver kısmını aktif etmeniz ve testng.xml i aşağıdaki şekilde editlemeniz gerekiyor;

<?xml version=”1.0" encoding=”UTF-8"?>
<!DOCTYPE suite SYSTEM “http://testng.org/testng-1.0.dtd">
<suite name=”Suite” parallel=”tests” >
<listeners>
<listener class-name=”com.InvokedMethodListener”></listener>
</listeners>
<test name=”com.FirstTest”>
<parameter name=”browser” value=”chrome”/>
<classes>
<class name=”com.FirstTest”>
<methods>
<include name=”GOOGLE0" />
<include name=”GOOGLE2" />
<include name=”GOOGLE3" />
<include name=”GOOGLE4" />
</methods>
</class>
</classes>
</test>
<test name=”com.SecondTest”>
<parameter name=”browser” value=”firefox”/>
<classes>
<class name=”com.SecondTest”>
<methods>
<include name=”GOOGLE1" />
<include name=”YANDEX” />
</methods>
</class>
</classes>
</test>
</suite>

Böylece, FirstTest ve SecondTest paralel çalışacak. FirstTest chrome kullanırken SecondTest firefox kullanacak.

Testleri görsel olarak nasıl debug ederim?

docker stop <CONTAINER_ID> ile containerları durduralım.

Containerları bu sefer node-{browser adı}-debug imajları ile çalıştıralım.

$ docker run -d -P -p 5900:5900 — net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-chrome-debug:3.11.0-dysprosium$ docker run -d -P -p 5901:5900 —net grid -e HUB_HOST=selenium-hub -v /dev/shm:/dev/shm selenium/node-firefox-debug:3.11.0-dysprosium

Debug için kullandığımız portları da açalım. Herhangi bir VNC istemcisi ile seçilen porta bağlanmayı deneyelim. Şifre soracak, şifre secret

Şimdi aynı konfigürayonu docker-compose kullanarak yapacağım.

Docker Compose

Docker compose nedir?

Compose, multi-container Docker uygulamalarını tanımlamak ve çalıştırmak için kullanılan bir araçtır. Compose ile, uygulamanızın servislerini yapılandırmak için bir YAML dosyası kullanılır ve tek bir komutla tüm servisler başlatılır. docker compose kurulumu.

Şimdi docker-compose.yaml adında bir dosya oluşturun ve aşağıdaki şekilde düzenleyin.

version: “3”
services:
selenium-hub
image: selenium/hub
container_name: selenium-hub
ports:
- “4444:4444”
chrome:
image: selenium/node-chrome
volumes:
- /dev/shm:/dev/shm
depends_on:
- selenium-hub
environment:
- HUB_HOST=selenium-hub
- HUB_PORT=4444

firefox:
image: selenium/node-firefox
volumes:
- /dev/shm:/dev/shm
depends_on:
- selenium-hub
environment:
- HUB_HOST=selenium-hub
-HUB_PORT=4444

version: Compose dosyasının farklı versiyonları var. (1, 2, 2.x 3.x) uygunluk matriksi

image: containerı başlatmak için hangi imajın kullanılacağını belirler.

container_name: container ismini tanımlar.

ports: portları <HOST:CONTAINER> formatında açar.

volumes: host pathini servise <HOST:CONTAINER> formatı ile mount eder.

depends_on: Containerlar bağımlılık sırasına göre başlar. Bizim örneğimizde chrome ve firefox, hub başladıktan sonra başlayacak.

environment: ortam değişkenlerini balirtir.

Docker Compose ile başlatma

compose ile başlatma

Ölçeklendirme

ölçeklendirme

CPU ve bellek kullanımını docker stats ile gözlemleyebilirsiniz.

Containerları durdurma

docker-compose down

Hepsi bu🙂, umarım işinize yarar.

-Kaan

--

--