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

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

Otomasyon, Teknoloji

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.



XPath yazımı için ön bilgi:

  • //: Kullanılan node’u seçmek için
  • Tagname: Belirli bir node’un etiket ismi.
  • @ : nitelik seçimi. (class, id gibi )
  • Attribute: Node’un özelliğinin ismi.
  • Value : Özelliğin değeri.



Web sayfasındaki öğeyi doğru bir şekilde bulmak için birçok konum belirleyici türleri vardır:

 

XPath KonumlandırıcılarıWeb Sayfalarındaki Farklı Öğeleri Bulma
IDÖğenin ID’sine göre bulmak için
ClassnameÖğeyi sınıf ismine göre bulmak için
NameÖğeyi öğenin adına göre bulmak için
Link textÖğeyi öğenin bağlantısının metnine göre bulmak için
XPathDinamik öğeyi bulmak için
CSS path

CSS yolu adı, sınıfı veya kimliği olmayan öğeleri de bulabilmek için.


XPath Türleri


İki farklı XPath türü vardır.

Absolute XPath ve Relative XPath




1) Absolute XPath

Öğeyi bulmanın doğrudan yoludur, ancak Absolute XPath’ın dezavantajı, öğenin yolunda herhangi bir değişiklik yapılması durumunda XPath’ın başarısız olmasıdır.

Bu aslında tavsiye edilmeyen bir yoldur. Web üzerinde F12 tuşu ile inspect mode açılır. Elements bölümüne tıklanır. Öğe bulunduktan sonra yine sağ click ile Copy – Copy XPath seçilir.

Aşağıda Absolute XPath örneğini görebilirsiniz.


Absolute xpath:

html/body/div[1]/section/div[1]/div/div/div/div[1]/div/div/div/div/div[3]/div[1]/div/h4[1]/b




Relative xpath:



Relative Xpath  için path (öğe yolu), HTML DOM yapısının ortasından başlar. Çift eğik çizgi (//) ile başlar, yani öğeyi web sayfasının herhangi bir yerinde arayabilir.

HTML DOM yapısının ortasından başlayabilirsiniz ve uzun xpath yazmanıza gerek yoktur.

Aşağıdaki ekranda gösterilen aynı öğenin göreli bir XPath ifadesi örneği verilmiştir.

Bu, Relative XPath aracılığıyla öğeyi bulmak için kullanılan yaygın biçimdir. Relative XPath’in faydası daha çok kullanılabilir olması ve daha az bakım/maliyet gerektirmesidir.


Relative xpath: //*[@class=’featured-box’]//*[text()=’Testing’]

 

 

 

 

XPath Eksenleri Nelerdir?

 

XPath eksenleri, XML belgesindeki farklı node’ları geçerli bağlam node’undan itibaren arar. XPath Eksenleri, kimliği, Sınıf Adı, Adı vb. Olmayan normal XPath yöntemiyle mümkün olmayan dinamik öğeleri bulmak için kullanılan yöntemlerdir.

 


Selenium’da XPath İle Karmaşık ve Dinamik Öğelerini Kullanma



1) Temel XPath:

XPath ifadesi aşağıda gösterildiği gibi XML belgesinden ID, Name, Classname vb. Nitelikler temelinde node veya node listesi seçer.

Xpath=//input[@name=’uid’] ​


Aşağıdaki sayfaya erişim linki :

http://demo.guru99.com/v1/​

 



Bazı temel XPath ifadeleri:


Xpath=//input[@type=’text’]

Xpath= //label[@id=’message23′]

Xpath= //input[@value=’RESET’]

Xpath=//*[@class=’barone’]

Xpath=//a[@href=’http://demo.guru99.com/’]

Xpath= //img[@src=’//cdn.guru99.com/images/home/java.png’]


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

 

 

 



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


4) Starts-with Fonksiyonu:


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’)]

5) 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’]




6) XPath Eksen Yöntemleri:


Bu XPath eksen yöntemleri, karmaşık veya dinamik öğeleri bulmak için kullanılır.

Aşağıda bu yöntemlerden bazılarını göreceğiz.

Bu XPath eksenleri yöntemini göstermek için Guru99 banka demo sitesini kullanacağız.



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



b) Ancestor:


Ancestor ekseni, aşağıdaki ekranda gösterildiği gibi geçerli node’un tüm ata elemanlarını  (grandparent, parent, gibi) seçer.

 

Aşağıdaki ifadede, geçerli node’un (“ENTERPRISE TESTING” node’u) parent’ını buluyoruz.

Xpath=//*[text()=’Enterprise Testing’]//ancestor::div 

 

“Ancestor” ekseni kullanılarak eşleşen 13 “div” node’ u vardır. Belirli bir öğeye odaklanmak istiyorsanız, gereksiniminize göre 1, 2 sayısını değiştirdiğiniz aşağıdaki XPath’i kullanabilirsiniz:

Xpath=//*[text()=’Enterprise Testing’]//ancestor::div[1]



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



c) Child:


Aşağıdaki ekranda gösterildiği gibi geçerli düğümün (Java) tüm alt öğelerini seçer.

Xpath=//*[@id=’java_technologies’]/child::li 

………… vb. Koyarak gereksinime göre değiştirebilirsiniz.

“Child” ekseni kullanılarak eşleşen 71 “li” node var. Belirli bir öğeye odaklanmak istiyorsanız, aşağıdaki xpath’i kullanabilirsiniz:

Xpath=//*[@id=’java_technologies’]/child::li[1]

Xpath değerini [1], [2]

d) Preceding:

Aşağıdaki ekranda gösterildiği gibi geçerli node’dan önce gelen tüm node’lar seçilir.

Xpath=//*[@type=’submit’]//preceding::input

Xpath değerini [1], [2] ………… vb. Koyarak gereksinime göre değiştirebilirsiniz.

 

 

e) Following-sibling:

 

Context node’un aşağıdaki Child’larının seçilmesi. Child’lar aşağıdaki ekranda gösterilen geçerli node ile aynı seviyededir. Geçerli node’dan sonra öğeyi bulur.

 

xpath=//*[@type='submit']//following-sibling::input



f) Parent:

Geçerli node’un üst öğesini aşağıdaki ekranda gösterildiği gibi seçer.

Xpath=//*[@id=’rt-feature’]//parent::div


“Parent” eksen kullanılarak eşleşen 65 “div” düğümü var. Belirli bir öğeye odaklanmak istiyorsanız, aşağıdaki XPath’i kullanabilirsiniz:

Xpath=//*[@id=’rt-feature’]//parent::div[1]

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

 

g) Self:

Geçerli node’u seçer veya “self”, aşağıdaki ekranda gösterildiği gibi node’un kendisini gösterdiği anlamına gelir.

“Self” ekseni kullanılarak eşleşen bir node self-element temsil ettiği için daima sadece bir node bulur.

Xpath =//*[@type=’password’]//self::input




h) Descendant:

Aşağıdaki node’da gösterildiği gibi geçerli node’ un Descendant’ını seçer.

Aşağıdaki ifadede, node altında (alt node, child node vb.) Anlamına gelen tüm öğe child’ları geçerli öğeye (‘child node , grandchild node, vb.) tanımlar.

Xpath=//*[@id=’rt-feature’]//descendant::a

 

Descendant” ekseni kullanılarak eşleşen 12 “bağlantı” node’u vardır. Belirli bir öğeye odaklanmak istiyorsanız, aşağıdaki XPath’i kullanabilirsiniz:


Xpath=//*[@id=’rt-feature’]//descendant::a[1]

 

Özet:

XPath, belirli bir öğe üzerinde işlem yapmak için, web sayfasında bir öğe bulmak için gereklidir.

İki tür XPath vardır:

Absolute XPath

Relative XPath


XPath Eksenleri, normal XPath yöntemiyle bulmanın mümkün olmadığı dinamik öğeleri bulmak için kullanılan yöntemlerdir.

 

Teşekkürler,






Kaynaklar:


https://www.guru99.com/
https://www.tutorialandexample.com/
https://www.educba.com/

1

Otomasyon, Teknoloji

Robot Framework ve Custom Library


Aslında robotframework bir çok harici ve dahili kütüphane desteğini hali hazırda sağlıyor.

BuiltIn, Collections, Screenshot, XML gibi kullanılşlı dahili kütüphaneleri ya da Appium, Selenium, Database, FTP, Faker gibi onlarca ve çok kullanışlı kütüphaneleri mevcut.

Ancak yine de bunların bile yetmediği durumlar oluşabiliyor. Bu durumda Python ile kendi kütüphanelerimizi (Custom Library) oluşturabiliyoruz.

Benim kendi işim için yapmış olduğum basit bir projem var. Bu proje sistemde tanımlı olan onlarca mevcut kullanıcının saklandığı yerden isim ve password bilgisini alıyor ve 5 farklı ortamda kullanıcı ismi ve şifresi ile giriş yapmayı ve kullanıcı veya şifresi hatalı olanları bir dosyaya yazdırıyor.

Dosyaya yazdırma kısmı için bir python function (custom library) yazdım.  

Öncelikle ilk test case’de Kullanıcı bilgilerini gidip kaynak sayfasından alacak ve istediğimiz sunucu için sayfayı açıp login olmayı deneyecek.

 

Test Cases:

 

*** Settings ***

Resource  ../Facilities/CsrUsersValidationApp.robot
Resource  ../Facilities/Test1Enviroment.robot
Resource  ../Facilities/Test2Enviroment.robot
Resource  ../Facilities/WikiPageFacilities.robot
Resource  ../Facilities/Common.robot
Resource  ../Resources/WikiVariables.robot
Resource  ../Resources/Test1Variables.robot



Test Setup    Begin Web Test
Test Teardown  End Web Test
#Test Teardown     When Test Fail Take Screenshot
#  robot -d Results Tests/CsrUsersValidation.robot

*** Test Cases ***

Read And Validate CSR Users For Test1
   
Go And See All CSR Users On Wiki Page
    Get User And Log In For All CSR Users For Test 1

 

 

Eğer login işlemi fail olursa aşağıdaki path’e fail olan kullanıcının bilgilerini yazacak.

C:\CsrUsers\FailedCsrUsers

 

 

*** Settings ***
Library  Selenium2Library
Library     PythonFunctions2.py
Resource  ../Facilities/Test1Enviroment.robot
Resource  ../Facilities/WikiPageFacilities.robot
Resource  ../Facilities/WikiLoginFacilities.robot
Resource  ../Resources/Test1Variables.robot

*** Keywords *** Admin01 On Test 1
[Arguments]
   
${UserName} =    Get Text    ${Admin01Path}
  
${Password} =    Get Text    ${Admin01PasswordPath}     Execute Javascript    window.open()
   
Switch Window    NEW
  
Go To    ${Test1_URL}
   
Wait Until Page Contains    ${ValidateTest1Loaded}    ${TimeOut}
   
Input Text    ${InputUserName}    ${UserName}     Input Text    ${InputPassword}    ${Password}     Click Element    ${Test1Login}     Sleep   3s
   
${status}  ${value}=  Run Keyword And Ignore Error    Element Should Be Visible    ${ChainIcon}
   
Run Keyword If  '${status}' == 'PASS'    HamburgerMenuOpen
   
...   ELSE    csv_append_userFail    ${UserName} C:\\CsrUsers\\FailedCsrUsers.csv

 

 

Python Fonksiyonu Resources klasörünün içinde ve robot dosyasında bunu resource olarak belirtmeniz gerekiyor.

 

Sağdaki resmi büyütmek için üzerine tıklayın.

 

 

 

PythonFunctions2.py dosyamızın içi ise aşağıdaki gibi.

import csv

def csv_append_userFail(UserName, location):
   
# Append CSV For User Function
   
fields = [UserName]
   
with open(location, 'a', newline='') as f:
        writer = csv.writer(f)
        writer.writerow(fields)

 

 

Eğer aşağıdaki koşul sağlanırsa HamburgerMenuOpen senaryosuna devam edilecek, ancak sağlanmazsa Custom Library’ye yazdığım csv_append_userFail senaryosuna gidecek ve bu 

library’deki ilgili def’i çağıracak.

 

 

Run Keyword If  '${status}' == 'PASS'    HamburgerMenuOpen
...   ELSE    csv_append_userFail    ${UserName}    C:\\CsrUsers\\FailedCsrUsers.csv

 

 

robotframework Custom library
0

Teknoloji

Kanban Methodu Nedir?


Kanban tekniği 1940’larda Toyota fabrikasında bir mühendis tarafından fabrikadaki işleri daha iyi bir hale getirmek için geliştirilmiştir. Yani temelde Japon disiplinini ve kültürü ile ortaya çıktğını söyleyebiliriz.

 

Japonca’da Kanban kelimesi Tahta, Tabela gibi anlamlara gelmektedir. Bu disiplinin temelinde iki prensip var. Görselleştirmek ve sınırlandırmak tıpkı yazı tahtalarında olduğu gibi.

 

 

En temelde biriken, yapılacak tüm işleri yazmaya ve görselleştirmeye dayanır. Yani daha açık bir tabirle Kanban methodu iş yerinizdeki problemleri ortaya çıkarmaya ve Lean (yalın) yaklaşımı ile onları çözümlemenize yardımcı olur.

 

Kanban’ın 3 Temel Presipleri

 

Kanban yöntemini yazılım projelerinde artan, evrimsel süreç ve sistem değişikliklerine bir yaklaşım olarak görülür. Yaklaşımın odak noktası ise işleri halletmektir

1. Prensip: Şimdi ne yaptığınızla başlayın.

Kanban belirli bir yapılandırma gerektirmez ve sorunları tanımlamak için mevcut bir iş akışı veya işlemin üzerine yerleştirilebilir. Bu, Kanban’ın herhangi bir şirkete veya kuruluşa kolayca tanıtılabileceği anlamına gelir, çünkü başlamak için kapsamlı bir değişiklik gerekli değildir.

 

2. Prensip: Artımlı, evrimsel değişiklikleri izleyin

Kanban yöntemi, mevcut süreçte minimum dirençle sürekli, artımlı ve evrimsel değişikliklere katkıda bulunmak için geliştirilmiştir. 

 

3. Prensip: Mevcut süreçleri, rolleri ve sorumlulukları göz önünde bulundurun

Kanban, mevcut süreçlerin, rollerin, sorumlulukların ve olası korunmalarının olası değerini dikkate alır. Kanban yöntemi değişiklikleri yasaklamaz, ancak reçete etmez. Artan değişimi teşvik eder, çünkü ilerlemeyi engelleyen bir tür korkuyu tetiklemez.

 

KANBAN uygulamasında 7. husus!

 

1. Öncelikli hedefleri formüle edin!

 

Kanban metodunu yürürlüğe koymadan önce, iş paketlerinin üste çıkan hedefini açıkça belirlemek önemlidir. Proje atamaları (Project Charter), kendi hedef formülasyonları (Feature/Epic/User Story) veya sorunları (Incident/Problem) gibi Proje hedefini bulmaya yardımcı olan bilgileri mümkün olduğunca açık ve net olarak tanımlamaya yardımcı olur.

 

Hedef, Kanban metodunu kullanarak, size ve ilgili tüm kişilere yol gösterir. Yanlış veya belirsiz bir hedefleme ise, zor bir başlangıça sebep olur.

 

2. Kanban tahtasının düzenini tanımlayın!

 

Kanban panosunda ihtiyaç duyduğunuz kategorileri belirleyin. Farklı Kanban kategorilerini seçerken etkinliğinizin bağlamını göz önünde bulundurun.

 

• Varsayılan düzen ( “Backlog”, “Açık”, “Devam Ediyor”, “Tamamlandı”) yeterlimidir?

• Örn. haftalık durum raporları vermek için gerekli mi?

 

• Gerekli başlıklar belirgin bir şekilde ayırt edilebilinir mi?

 

 

 

3. Uygun bir yer seçin!


Proje süresinde Kanban panosu, belirgin bir yerde kurulması gerekiyor. Kanban panosunu toplantı odasına gösterebilecek şekilde kurmanız gerekiyor. Sanal ortamda kanban panosu kurduysanız, ekran ve projektör üzerinden kolayca gösterebilirsiniz. Ya da JIRA uygulamasında bunu sürekli görünür kılabilirsiniz.

 

4. Kanban listelerini çizin!


Tanımladığınız kanban panosunu kurum (çizin). Kategori başlıklarını yüzeye eşit şekilde dağıttığınızdan emin olun. Dijital bir kanban yazılımı kullanıyorsanız kanban panosu için düzen fikirlerinizi ilgili giriş maskeleri aracılığıyla kullanılan yazılımın olanaklarına aktarın.

 

6. İlk Kanban kartlarını düzenleyin!


Kısmi görevi takıma atamak istiyorsanız, sorumlu kişinin bulunduğu alanı boş düzen fikirlerinizi ilgili giriş maskeleri aracılığıyla kullanılan yazılımın olanaklarına aktarın.. Kişisel görevleri kendiniz üstlenirseniz, adınızı doğrudan karta yazabilirsiniz. Bir kartı üzerinize geçirmek istiyorsanız “en” leri almamanaya dikkat edin. Bu, ortak toplantıda daha sonra kızgınlığa yol açabilir.

 

 

7. Haftalık değerlendirme toplantı tarihini düzenleyin!

Proje ile alakalı tüm kişilerin zamanının olduğu gün ve zaman seçin. Yapılacak toplantının gündemi:

• Tüm alt görevlerin işlenme durumu

• Tespit edilen sorunlar
• mevcut görevlerin yeni alt görevleri veya alt bölümleri

Haftada en az bir kez değerlendirme yapılmalıdır. İlk haftalarda iki kez randevu almanız önerilir. Takibin ilk başlangıcında genellikle hatalar yapılır, proje hedefinin yanlış yorumlanması veya ekip üyeleri arasındaki basit anlaşma problemleri söz konusudur.

Her randevu katılımcı başına yaklaşık 5-7 dakika zaman ayırın. Ayrıca, yöntemi öğretmek için yaklaşık 30 dakika gereklidir. Bundan dolayı iletişim engelleri de daha düşük olacaktır. Bununla birlikte, yeni ekip üyeleri veya paydaşlar tarafından yapılan ziyaretler için her zaman 5-7 dakika daha ayırın.

Kanban incelemesinin çok az zamana tabi tutulduğu nedeniyle, daha yüksek bir hız ile de mümkündür. Bu nedenle Kanban genellikle sabah toplantılarında veya “Daily Scrum” a dahil edilir. Bundan kaynaklanan yüksek istişare sıklığı, zayıf noktaların hızlı tespit edilmesini ve böylece acil müdahale önlemlerinin alınmasını sağlar. Bununla birlikte, buna karşılık gelen küçük kısmi görevler veya iş paketleri varsayılmaktadır.



Toplantılarınızda aşağıdaki bilgileri içermelidir:

• Projeye veya çalışmaya gerekli olan personel (aktif katılımcılar)

• Organizasyonel veriler: alan (dijital çözümler için geçerli değildir), zaman, planlanan süre, tarih serisinin uzunluğu
• Proje hedefi, muhtemelen açıklama ve daha fazla bilgiye atıfta bulunma
• Yöntemin açıklamalarına ya da yöntemin doğrudan açıklamalarına kısaca değinilmesi
• 5. adımda geliştirilen kabul / kalite kriterlerine atıfta bulunma
• Dijital çözümler, yazılım ve ilgili lisanslar hakkında bilgi gerektirir. IT organizasyonu ile önceden istediğiniz çözüme oy verin.
• Planlanan alan, son başvuru öncesi ve sonrasındaki diğer takımlar tarafından isteniyorsa, taşınabilir kanban tahtasını kurmak ve çıkarmak için bir tampon oluşturmalısınız. Randevunun daima aynı yerde aynı saatte gerçekleştiğinden emin olun. Bu, sıkı bir şekilde hızlandırılmış yürütmenin tahrişini ve gecikmelerini azaltır.
 

Sonuç

Kanban, duvardaki yapışkan notlardan daha fazlasıdır. Kanban’ı anlamanın en kolay yolu, arkasındaki felsefeyi incelemek ve günlük çalışmalarınıza uygulamaktır. Üç temel ilkeyi okur, anlar ve uzlaştırırsanız, pratik uygulama mantıklı sonuç olarak ortaya çıkar.

İş akışlarını görselleştirmek, işleminizi düşündüğünüzden daha iyi hale getirir. Daha sonra düzenli geri bildirim döngülerine sahip olursanız, bu puzzle parçalarının hepsi birlikte Kanban’ın gerçek gücünü ortaya koyacaktır.
 
Yardımcı Kaynaklar:

https://scientu.net/
0