Your address will show here +12 34 56 78

Bir yazılım uygulaması birçok kişiden oluşan bir ekip tarafından geliştirilir.

Yani bir uygulama geliştirirken farklı modüllere ve bu modüller takımın farklı geliştiricilerine ayrılır.
Tek bir geliştirici kod yazdığında, ortak bir fonksiyon yazmış olduğunu düşünelim ve bu yazmış olduğu fonksiyonu test etmesine Birim Testi (Unit Test) )denir. 

 

Tüm farklı modüller geliştirilip entegre edildiğinde, tüm uygulamanın farklı modülleri entegre edildikten sonra düzgün çalışıp çalışmadığını kontrol etmek için test gereklidir, bu test türüne de Entegrasyon Testi denir.

 

Birim Testi ve Entegrasyon Testi arasındaki fark:

 

Birim Testi

 

 

Birim testi, küçük kod parçasının veya tek bir işlevin beklentiye göre yapılıp yapılmadığını kontrol etmek için kullanılan bir test türüdür.

 

Test Driven Development (Testin yönlendirdiği geliştirme diyebiliriz) Bu iki manaya geliyor. Kod yazarken devamlı test yazmak, diğeri ise kodu yazmadan önce testleri yazmak ve kodu yazma, yazdıkça test etme ve testleri geçiyorsa yazılan kod “güvenilir” demek.

Unit bir parça, bir birim iş demek, Unit testin önemli özelliği SQL, Nwtwork ya da herhangi bir io çağrısı yapmaz. Yaızlan kodun sadece ve saece logic’,i, alogirotması, yani küçük fonksiyonları test edilir.

Bir test class’ından public, internal gibi ulaşılabilen metodları test etmek demektir.Yani mantığı kodun algoritmasını test etmek dolayısıyla unit test küçük ve hızlı olmalıdır. Bu yüzden io test içermez, küçük parçayı test eder, diğer dependency’ler fake edilir.
Küçük ve hızlı olması ve bir pattern’i olması gerekir. Aksi halde büyük karmaşalara sebep olabilir ve yanlış test sonuçları verebilir.

 


Entegrasyon Testi;

 

Unit test’e göre daha yavaş çalışır, SQL’e ya da network’e bağlanabilir, network’den belli bir veri getirebilir, sql’den veri getirebilir, validasyonunu sağlayabilir, her bir entegrasyon test altındaki sınıfları, fonksiyonlar ve 

altındaki network, io işlemlerini yapar ve unit test’e göre daha yavaştır.

 

Tavsiye edilen bu testi development aşamasında değil, bir CI server üzerinde

 

çalıştırmaktır. Günün belirli saatlerinde ya da build sonrası entegrasyon testlerinin çalışması yapılabilir.

 

 

 

Unit testlerin bir pattern’de gayet makul ve düzgün bir şekilde yazılması ancak entegrasyon testlerinin yapılmamasına bir örnek;

 

0

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 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. 

 

 

Robotframework’de basit bir web test uygulaması örneği;

 

 

 

 

Api 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.

 


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-windows

Mac 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 seviyesinde, 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.

 

 

Örnek bir servis testi;

 

 

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 oluşturmak gerekiyor.

 

 

$ docker container run -d -t robotframework/rfdocker

 

İşte ortamımız bir dakikadan az bir sürede hazırlandı ve çalıştı bile.



$ docker ps -a

 

Şimdi yukarıdaki bahsettiğim robotframework api otomasyon projesini (image.5) dockerize etmek için bir Dockerfile yazıyorum.

 

 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ım.

·         İçinde bulunduğumuz klasöreü /app ‘e değiştiridm.

·         Requirements.txt de belirttiğim projemin dependencylerini kurmasını dedim. 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.
Build aşamasında adım adım neler yapıldığı gösteriliyor.



Ekran kaydında da görüleceği üzere artık solutioncenter-entegration-tests isminde bir image’imiz var.

 

 

 

 

Şimdi projeyi docker container’ımızın içinde çalıştırıyoruz. 


$ docker run -rmi -i -t solutioncenter-entegration-tests

 

Ekran görüntüsünde de gördüğünüz üzere robotframework projemiz container üzerinde çalıştı ve koşum raporunu console’da gösterdi.

 

 

 

Bir sonraki yazımda bu yazının devamı olarak Teamcity ile Robotframework CI pipeline oluşturma ve Slack ile entegrasyonunu anlatmaya çalışacağım.

 

 

Vakit ayırdığınız için teşekkürler,

4

If you are trying to remove python from your computer and you get errors related to uninstall, you can easily remove it with the method below.
Python windows 10 can give some errors like below when you wanted to uninstall.
python uninstall problem , can’t uninstall python , how to completely remove python from a windows machine, Python uninstall failed, Python uninstall MSI package problem, how-to-force-uninstall-a-software-that-is-installed-by-msi-package , python failed to uninstall msi package

4

Xpath Following:

Aşağıdaki ekranda gösterildiği gibi, geçerli node’un () [UserID giriş kutusu geçerli node’dur] belgesindeki tüm öğeleri seçer.

Xpath=//*[@type=’text’]//following::input

 

“Following” eksen password,login ve reset butonunu ile eşleşen 3 input node vardır. Belirli bir öğeye odaklanmak istiyorsanız aşağıdaki XPath yöntemini kullanabilirsiniz:

Xpath=//*[@type=’text’]//following::input[1]

 

XPath’ı [1], [2] ………… vb. Koyarak gereksinime göre değiştirebilirsiniz.

Input ‘1’ olarak yazdığınızda aşağıdaki ekran görüntüsü ‘Password’ input elemanı olan node’u bulur.



XPath hakkındaki daha detaylı yazıma aşağıdaki linkten ulaşabilirsiniz.

XPath Kullanımı

0

Text():

Text() ifadesinde, metin işleviyle, tam olarak eşleşen metin öğesini aşağıda gösterildiği gibi buluruz. Bizim örneğimizde, “UserID” metnine sahip öğeyi buluyoruz.

Xpath=//td[text()=’UserID’]




XPath kullanımı hakkındaki daha detaylı yazıma aşağıdaki linkten ulaşabilirsiniz.

XPATH KULLANIMI


0

Starts-with fonksiyonu yenilenen veya web sayfasındaki herhangi bir işlemde öznitelik değeri değişen öğeyi bulur. Bu ifadede, niteliği dinamik olarak değişen öğeyi bulmak için özelliğin başlangıç metniyle eşleşir. Tabi ki nitelik değeri statik olan öğeyi de bulabilirsiniz.


Örneğin: Belirli bir öğenin kimliğinin dinamik olarak şu şekilde değiştiğini varsayalım:

Id=” message12″

Id=” message345″

Id=” message8769″

Gibi… ancak ilk metin (message) aynı. Bu durumda Start-with ifadesini kullanırız.

Aşağıdaki ifade de, “message” id’si ile başlayan iki öğe vardır (i.e., ‘User-ID must not be blank’ & ‘Password must not be blank’).

Aşağıdaki örnekte XPath, ID’si “message” ile başlayan öğeleri bulur.

Xpath=//label[starts-with(@id,’message’)]




Aşağıdaki linkten Xpath kullanımı ile ilgili daha detaylı yazıma ulaşabilirsiniz.

XPATH KULLANIMI


0

OR & AND kullanma:


OR ifadesinde, 1. Koşulun veya 2. koşulun doğru olması durumu için 2 koşul kullanılır. Herhangi bir koşulun doğru veya her iki koşulun doğru olması durumunda da geçerlidir. Öğeyi bulmak için herhangi bir koşulun doğru olması gerektiği anlamına gelir.

Aşağıdaki XPath ifadesinde, tek veya her iki koşulu da geçerli olan öğeleri tanımlar.

Xpath=//*[@type=’submit’ or @name=’btnReset’]

 

Aşağıdaki resimde belirtilen ‘type’ özelliğine sahip “LOGIN” öğesi ve “name” özelliğine sahip “RESET” öğesi or koşulu ile seçildi.





AND ifadesinde, iki koşul kullanılır, öğeyi bulmak için her iki koşul da doğru olmalıdır. Herhangi bir koşul yanlışsa öğe bulunamaz.

Xpath=//input[@type=’submit’ and @name=’btnLogin’]

 

Aşağıdaki ifadede ‘LOGIN’ öğesi hem ‘type’ hem de ‘name’ özniteliğine sahip.




Xpath kullanımı hakkındaki daha detaylı yazımı aşağıdaki linkten okuyabilirsiniz.

XPATH KULLANIMI

0

Xpath Contains ():

Contains (), XPath ifadesinde kullanılan bir yöntemdir. Herhangi bir özelliğin değeri, örneğin oturum açma bilgileri gibi dinamik olarak değiştiğinde kullanılır.

 

Contains özelliği, aşağıdaki örnekte gösterildiği gibi, kısmi metin içeren öğeyi bulma yeteneğine sahiptir.

 

Bu örnekte, niteliğin yalnızca kısmi metin değerini kullanarak öğeyi tanımlamaya çalıştık. Aşağıdaki XPath ifadesinde, gönder düğmesi yerine kısmi değer ‘alt’ kullanılmıştır. Elemanın başarılı bir şekilde bulunduğu görülebilir.

“Tür” ün tam değeri “Submit” dir, ancak yalnızca “sub” kısmi değeri kullanılır.

Xpath=//*[contains(@type,’sub’)] 

 

‘Name’ öğesinin tam değeri ‘btnLogin’, ancak yalnızca ‘btn’ değerini kullanıyor.

Xpath=//*[contains(@name,’btn’)] 

Yukarıdaki ifadede, aşağıdaki ekran görüntüsünde gösterildiği gibi ‘name’ değerini bir nitelik olarak ve ‘btn’ değerini kısmi bir değer olarak aldık.

Ancak ‘Name’ niteliği ‘btn’ ile başladığı için 2 öğe (LOGIN & RESET) bulunuyor.



Benzer şekilde, aşağıdaki ifadede, ‘id’ değerini bir özellik olarak ve ‘message’ değerini Contains bir değer olarak aldık. Bu, ‘name’ niteliği ‘message’ ile başladığı için 2 öğe bulacaktır.

 

Xpath=//*[contains(@id,’message’)]

Aşağıdaki ifade de, bağlantının “metnini” bir öznitelik olarak ve “here” ı aşağıdaki ekran görüntüsünde gösterildiği gibi Contains bir değer olarak aldık. Bu, ‘here’ metnini görüntülediği için bağlantıyı (‘here’) bulur.





XPath hakkında daha detaylı bilgi için aşağıdaki linkten xpath ile ilgili yazımı okuyabilirsiniz.

XPATH KULLANIMI


0

XPath Nedir ve Nasıl Yazılır?

 

Selenium kullanılan otomasyonlarda elementlerin id, sınıf, isim gibi genel konum belirleyiciler ile bulunamadığı durumlarda xpath web sayfalarındaki elementleri bulmak için kullanılır.

 

Xpath Nedir?

Xpath kısaca xml yolu olarak tanımlanır. Web sayfalarındaki herhangi bir öğeyi bulmak için kullanılan syntax ya da dil diyebiliriz. HTML ve DOM yapısını kullanarak bir web sayfasındaki herhangi bir öğenin konumunu bulmak amacıyla kullanılır.

XPath’in temel formatı aşağıdaki ekran görüntüsünde açıklanmaktadır.






Bu konuda daha detaylı bilgi için aşağıdaki yazımı okuyabilirsiniz.

http://www.barisekici.com/2020/01/19/xpath-kullanimi/

0

Python uninstall problemi

 

Eğer bilgisayarınızdan python’I kaldırmayı deniyor ve uninstall ile ilgili hatalar alıyorsanız aşağıdaki metod ile kolaylıkla kaldırabilirsiniz.

 

Python windows 10 da uninstall edilmek istendiğinde aşağıdaki gibi bazı hatalar verebiliyor.   Python uninstall problemi ile ilgili bir çok başlık buldum internette ve anladım ki birçok insan bu problem yaşıyor. Ben de yedek bilgisayarımda Python’ı uninstall etme ihtiyacı duydum ve kaldıramadım. Update etmeyi denedim ancak buna da izin vermedi.

Daha sonra aşağıda bahsedeceğim program sayesinde uninstall etmeyi başardım.


Hata:

Error 0x80070643: Failed to uninstall MSI package.

Error 0x80070643: Failed to execute MSI package.Skipped rollback of package: pip_JustForMe, action: Install, already: PresentApplied rollback package: pip_JustForMe, result: 0x0, restart: None

 


Eğer control panel’den python’I uninstall etmeyi denediyseniz, ya da regedit den python dosyalarını sildiyseniz ve yine de uygulamayı kaldırmanıza sistem izin vermediyse kullanmanız gereken program Your Uninstaller! uygulaması.


Your Uninstaller! Uygulamasını bilgisayarınıza indirin ve kurulumunu yapın. Daha sonra kurulu programlarınızdan python’ın kaldırmak istediğiniz versiyonunu seçin ve onay butonuna basin. Python uninstaller birkaç dakika içinde your uninstaller program ile bilgisayarınızdan tamamen temizlenecektir.

 


Your uninstaller ile Python – Uninstall problemini çözmek için aşağıdaki linkten uygulamayı indirebilirsiniz.

INDIR / DOWNLOAD

 

0