Docker Container’da RobotFramework İle Çalışma
Merhabalar,
Bu yazımda iki hafta önce CST takımı olarak devreye aldığımız çözüm merkezi projesinin entegrasyon testlerini, robotframework ile otomatize hale getirme ve bu testlerin koşumlarının docker containerlar üzerinde yapılması ile ilgili çalışmamızdan ve bu yönde attığımız adımlardan bahsedeceğim.
Sonraki yazımda (Teamcity ile Robotframework CI/CD pipeline oluşturma ve Slack Entegrasyonu), bu yazı ile ilişkili olarak oluşturduğumuz docker image’in TeamCity üzerinde kurgulanacak senaryolar ile çalışması ve koşum raporlarının/notifikasyonlarının slack kanallarına iletilmesi ile ilgili olacak.
Konuya öncelikle robotframework ve docker’dan çok kısa bahsederek başlamak istiyorum.
Robotframework Nedir?
Robotframework, Keyword Driven Testing ve Data Driven Testing yaklaşımlarıyla pratik test senaryoları yazmamızı sağlayan python tabanlı bir framework’dür.
Robotframework’de basit bir web test uygulaması örneği;
Servis test örneği;
Docker Nedir?
Docker kendi sitesinde ürününü şu şekilde açıklıyor; Docker, uygulama geliştirmek, dağıtmak ve çalıştırmak için oluşturulan açık bir platformdur. Docker uygulamalarınızı altyapınızdan bağımsız kılmanızı sağlar, böylece yazılım üretim ve dağıtım sürecinizi hızlandırabilirsiniz. Docker ile altyapınızı uygulamalarınızı yönettiğiniz gibi yönetebilirsiniz.
Docker Container Nedir?
Bir konteyner, imajı çalıştırmak için gereken her şeyi içeren bir yazılım parçasının hafif, bağımsız, yürütülebilir bir paketidir. Kod, çalışma zamanı, sistem araçları, sistem kütüphaneleri, konfigurasyonlar bulundurur. Hem Linux hem de Windows tabanlı uygulamalar için mevcut olan konteynerli yazılımlar, ortama bakılmaksızın her zaman aynı şekilde çalışır ve bu sayede “lokalimde çalışıyor.” sorunlarına çözüm olur.
Robotframework’ü neden docker ile kullanmalıyız?
Docker kullanmanın sağladığı avantajları şu şekilde sıralayabilirim.
- Hiç vakit kaybetmeden official olarak sunulmuş hazır bir robot docker image’i (ortam) edinilebilir.
- Kurulum için birden fazla araç yerine sadece bir araç (DOCKER) gerekir (Python, pip, robotframework, test libs).
- Kurulum tüm ekip üyeleri ve CI ortamı üzerinde tek bir merkezi yerde uyumlu hale getirilir.
- Kullanılan container teknolojisi sayesinde çok az bir kaynakla çok büyük işler yapılabilir.
- Docker compose sayesinde zaman alan, uzun testler container’lara bölünebilir ve birden fazla container ayağa kaldırılıp paralel koşumlar sağlanabilir.
Yani genel olarak hızlı, güvenilir, esnek, bağımsız ve anında hazır oluşu sebebi ve kendi mottolarıya “Build And Ship Any App Anywhere” yaklaşımının sunduğu rahatlık sebebiyle tercih etmeliyiz.
Docker Kurulumu işin aşağıdaki linkler takip edilebilir.
Windows Installer :
https://hub.docker.com/editions/community/docker-ce-desktop-windowsMac Installer :
https://hub.docker.com/editions/community/docker-ce-desktop-mac
Şimdi konumuza tekrar dönelim.
Yeni projemizin (çözüm merkezi) geliştirme sürecine, test otomasyon sürecini aktif ve etkili bir şekilde kullanmak üzere dahil etmek istedik. Bu düşünce ile birlikte öncelikle yeni projemizin entegrasyon testlerini manuel test etme eforundan kurtarıp python tabanlı bir framework olan robotframework’de yazdık ve geliştirmeye, genişletmeye devam ediyoruz.
Bu testler kapsamında database ve network seviyesinde servislerimizin çalışabilirliği, stabiliziasyonu, gönderdiğimiz isteklere uygun response body ve response status code gibi bilgilerin validasyonunu sağlayıp teyit edebiliyoruz.
Ancak bu testlerin sadece günün/haftanın belirli saatlerinde koşması ya da bir kişinin manuel şekilde trigger etmesi ve raporlaması bizi tatmin etmeyecekti. Bu yüzden testing best practice’lerini uygulayarak ikinci yazıda anlatacağım QA, Preprod veya Production ortamına yapılan her deployment ya da code push sonrası testlerin build edilmesi, ilgili docker image’inin ayağa kaldırılması, testlerin koşulması, fail alan servislerinin test case numarası ve ismi ile bilgiyi slack kanalına raporlaması, herhangi bir hata yok ise test koşumlarının başarılı şekilde notifikasyon üretmesi ve takıma bilgi vermesi sağlandı.
Yani kısaca ilgili git repo’larına yeni kod push’landığında, ya da qa,preprod,production ortamlarına build alındığında robotframework CI pipeline’ımız trigger edilir ve koşum biter bitmez tüm takım bilgilendirilir.
Şimdilik bu yazının dışına çok çıkmadan bir servis test örneği ve projeyi dockerize etme işlemi ile devam edelim.
Proje dosyası aşağıdaki gibi;
Ve şimdi gelelim docker kısmına, şu an bilgisayarımda herhangi bir image yok.
$ docker images
Ancak projeyi çalıştırabileceğim bir ortam (images&container) oluşturmam gerekiyor. Bunun için robotframework’ün sunduğu official image’i kullanacağım.
$ docker container run -d -t robotframework/rfdocker
İşte ortamımız bir dakikadan az bir sürede hazırlandı ve çalıştı bile. Artık projemizi geliştirebileceğimiz, test execution’ları çalıştırabileceğimiz bir ortamımız var diyebiliriz. :)
Aşağıdaki komut ile lokalimizde oluşturduğumuz image’i görelim.
$ docker ps -a
Şimdi yukarıdaki bahsettiğim robotframework test otomasyon projesini (image.4) dockerize etmek için bir Dockerfile yazmamız gerekiyor.
Dockerfile dosyamız aşağıdaki gibi;
FROM robotframework/rfdocker
MAINTAINER Baris EKICI <baris.ekici@hepsiburada.com>
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
ENTRYPOINT robot -d results Tests/Facade/SolutionCenterApi.robot
- Bu dockerfile ile birlikte öncelikle kendimize bir roborframework ortamı edinmiş olduk.
- Projeyi container’ın içine kopyaladık.
- İçinde bulunduğumuz klasörü /app ‘e değiştirdik.
- Requirements.txt de belirttiğim projemin dependencylerini kurmasını istedim. Bu pip komutu container’ımın içinde çalışacak, ortamımızın hazır olduğundan bahsetmiştim, pip de ortamımızda kurulu olduğu için çalışmasında herhangi bir problem yaşanmayacak, container build edilirken bu komutta çalışıyor olacak.
- Son olarak Container ayağa kalktığında başlamasını istediğimiz uygulamamın ENTRYPOINT’ini belirtiyoruz.
Ve projemizi build ediyoruz.
$ docker build –tag solutioncenter-integration-tests
Build aşamasında docker adım adım neler yaptığını, image’i hangi adımlardan geçirdiğini gösteriliyor.
Aşağıdaki ekran kaydında da görüleceği üzere artık solutioncenter-integration-tests isminde bir image’imiz var.
Şimdi projeyi oluşturduğumuz image ile bir container ayağa kaldırıyoruz.
$ docker run -rmi -i -t solutioncenter-entegration-tests
Ekran görüntüsünde de gördüğünüz üzere robotframework de oluşturulmuş projemiz docker container üzerinde çalıştı ve koşum raporunu console’da gösterdi.
Bir sonraki yazıda bu yazının devamı olarak;
- Burada oluşturduğumuz robotframework docker image’ini private registery’e push edeceğiz,
- Bu image’i bu registry’den alıp çalıştıracağız,
- Teamcity de bir CI/CD pipeline oluşturacağız,
- Oluşturduğumuz bu pipeline, testlerimiz ile ilişkili herhangi bir repo’ya code push edildiğinde ya da yine testlerimiz ile ilişkili herhangi bir projeye herhangi birisi build/deployment yaptığında, otomatik olarak robotframework docker image’ini ayağa kaldıracak, testleri koşacak ve testlerin tamamlanmasının ardından takım üyelerinin bulunduğu slack kanalına koşum raporunu iletecek ve sonlanacak.
Teşekkürler,