2019 için Güçlendirilmiş Test İpuçları: Java Otomasyon Testi Eğitimi
Yayınlanan: 2022-03-11Her yıl dünyanın dört bir yanından test otomasyon mühendisleri, test otomasyon çerçevelerini daha kararlı, daha hızlı ve kullanımı ve bakımı daha kolay hale getirmek için en yeni araçları ve teknikleri araştıracaklar. Bu, çerçevelerinin şirketleri içinde yaygın olarak benimsenmesini sağlamak için hayati önem taşımaktadır. Genel olarak, şişirilmiş, güncelliğini yitirmiş çerçevelerin modası hızla geçer.
Bu yazıda, 2019 için çerçevenizi nasıl güncelleyebileceğinize ve 2020'ye nasıl hazırlanabileceğinize bir göz atacağız. Çerçevemi geliştirmek için her zaman “acı noktalara” odaklanıyorum. Bunlar, kurulumu karmaşık olan veya en çok arızaya neden olan alanlardır. Basitleştirmek veya geliştirmek istediğim üç ana alan belirledim:
- selenyum ızgara
- bekler
- Chrome Geliştirme Araçları
Selenium Grid'in kurulumu çok zor ve uyarı vermeden başarısız olabilir. Burada nelerin geliştiğini görmek istedim. Ayrıca, oluşturduğum herhangi bir testin kararlılığını iyileştirmek için Selenium API'ye yeni waits
eklenip eklenmediğini araştırmak istedim. Son olarak, herhangi bir test cihazının araç setinin önemli bir parçası haline gelen Selenium aracılığıyla Chrome DevTools ile etkileşim kurmaya başlayıp başlayamayacağımı görmek istedim.
1. İpucu: Selenyum Izgaranızı Dockerize Edin
Selenium Grid'in bir CI boru hattında kurulumu çok zor, kararsız ve dağıtılması ya da sürüm kontrolü zor olduğu biliniyor. Çok daha kolay, kararlı ve sürdürülebilir bir yol, önceden oluşturulmuş Selenium Docker görüntülerini kullanmaktır.
Not: Bu yöntemin bir dezavantajı, Windows işletim sistemini kapsayıcı hale getirmek henüz mümkün olmadığından IE'nin (Internet Explorer) desteklenmemesidir.
Kurulum
Kalkmak ve çalıştırmak için önce makinenizde Docker ve Docker Compose kurulu olmalıdır. Windows 10 veya Mac kullanıyorsanız, ikisi de Docker Desktop aracılığıyla yüklenecektir.
Şebekenizi Başlatmak
Docker Hub'daki resmi Selenium deposu, Selenium Hub, Firefox ve Chrome Düğümleriniz için önceden oluşturulmuş Docker görüntüleri içerir.
Bunları yerel bir Selenium Grid'de kullanmanın en kolay yolu, projenizin kök dizininde bir Docker Compose dosyası oluşturmaktır. İşleri basit tutmak için dosyaya docker-compose.yml
.
Aşağıdaki Izgarayı oluşturan bir örneği aşağıya ekledim:
- Tek bir Selenyum Hub
- Bir Chrome düğümü
- Bir Firefox düğümü
#docker-compose.yml version: "3" services: selenium-hub: image: selenium/hub:3.141.59-neon container_name: selenium-hub ports: - "4444:4444" chrome: image: selenium/node-chrome:3.141.59-neon volumes: - /dev/shm:/dev/shm depends_on: - selenium-hub environment: - HUB_HOST=selenium-hub - HUB_PORT=4444 firefox: image: selenium/node-firefox:3.141.59-neon volumes: - /dev/shm:/dev/shm depends_on: - selenium-hub environment: - HUB_HOST=selenium-hub - HUB_PORT=4444
Docker Compose dosyası, Grid'inizin kurulumunu açıklar. Docker Compose dosyaları oluşturma hakkında daha fazla bilgi için lütfen resmi belgelere bakın.
Izgaranızı başlatmak için, projenizin kök dizininden aşağıdaki komutu çalıştırmak için herhangi bir terminal penceresini (Windows'ta bir powershell
veya cmd
penceresi) kullanın:
docker-compose up
Şebekeye Bağlanmak
Hub yerel makinenizin 4444 numaralı bağlantı noktasını dinlerken Selenium Grid'inize normalde yaptığınız gibi tam olarak bağlanabilirsiniz. İşte, Chrome Düğümümüzü kullanmak için Sürücüümüzü ayarladığımız bir örnek.
// Driver.java protected static RemoteWebDriver browser; DesiredCapabilities cap = new DesiredCapabilities(); ChromeOptions chromeOptions = new ChromeOptions(); cap.setCapability(ChromeOptions.CAPABILITY, chromeOptions); cap.setBrowserName("chrome"); driver = new RemoteWebDriver(cap);
Ardından, testlerinizi her zamanki gibi paralel olarak birden çok düğümde çalıştırmak için TestNG kitaplığını kullanabilirsiniz.
Her düğümde birden çok tarayıcının çalışmasının mümkün olduğunu belirtmekte fayda var. Ancak bu önerilmez ve düğüm başına bir tarayıcı kullanmak, optimum performans için en iyi uygulama olarak kabul edilir.
Ek İpuçları ve Püf Noktaları
Testlerinizde hata ayıklayabilmek için tarayıcıda neler olduğunu görmek istiyorsanız, hata debug
tarayıcı düğümlerini docker-compose.yml
dosyanızın debug
sürümüne sahip olmaya değer. Bunlar, test çalışırken tarayıcıyı izleyebilmeniz için bir VNC sunucusu içerir.
Daha yüksek hız için (normal yol) tarayıcıları başsız bir şekilde çalıştırmak da mümkündür ve Selenium ayrıca görüntülerin base
sürümlerini sağlar, böylece ek yazılımların yüklenmesine ihtiyacınız varsa kendi görüntülerinizi oluşturabilirsiniz.
CI işlem hattınız için Grid'in kararlı bir sürümünü oluşturmak için Grid'inizi Kubernetes veya Swarm'a dağıtmak da mümkündür. Bu, herhangi bir Docker'ın başarısız olmaları durumunda hızla geri yüklenmesini veya değiştirilmesini sağlar.
2. İpucu: Akıllı Beklemeler
Herhangi bir test otomasyon mühendisinin bildiği gibi, waits
, test otomasyonu çerçevenizin kararlılığı için çok önemlidir. Ayrıca, sleeps
veya pauses
gereksiz hale getirerek testinizi hızlandırabilir ve yavaş ağ ve tarayıcılar arası sorunların üstesinden gelebilirler. waits
daha da esnek hale getirmek için aşağıda bazı ipuçları verilmiştir.
Java Otomasyon Testi Eğitimi #2: Beklemelerdeki Mantıksal Operatörler: Beklemelerinize Özel Olun
ExpectedConditions
sınıfı zamanla büyüdü ve şimdi akla gelebilecek hemen hemen her durumu kapsıyor. ExpectedConditions.presenceOfElementLocated(locator)
genellikle yeterli olsa da, en iyi uygulama, her kullanıcı eylemini Actions.java
sınıfınıza gömerek kapsamak için ExpectedCondition
sınıfındaki yöntemleri kullanmaktır. Bu, tarayıcılar arası veya yavaş web sitesi sorunlarına karşı testlerinizi kurşun geçirmez hale getirecektir.
Örneğin , bir bağlantıya tıklamak yeni bir sekme açılmasıyla sonuçlanırsa, ExpectedConditions.numberOfWindowsToBe(2)
kullanın. Bu, sekmeye geçmeyi denemeden önce sekmenin orada olmasını sağlayacaktır.
findElements
kullanırken sayfada bulunan tüm öğeleri yakaladığınızdan emin olmak için bir wait
de kullanabilirsiniz. Bu, özellikle bir search
sayfasının sonuçlarını döndürmesi zaman alıyorsa yararlı olabilir. Örneğin, bu satır:
List<WebElement> results = driver.findElements(locators.RESULTS);
Arama sonuçlarınız henüz yüklenmediyse, boş bir List
dizisiyle sonuçlanabilir. Bunun yerine, sonuçların sıfırdan fazla olmasını beklemek için numberOfElementsToBeMoreThan
beklenen koşulunu kullanmak daha iyidir. Örneğin:
WebElement searchButton = driver.findElement(locators.SEARCH_BUTTON); searchButton.click(); new WebDriverWait(driver, 30) .until(ExpectedConditions .numberOfElementsToBeMoreThan(locators.RESULTS, 0)); List<WebElement> results = driver.findElements(locators.RESULTS); results.get(0).click();
Artık findElements
komutunuz yalnızca arama sonuçları döndürüldükten sonra çalışacaktır.
Bu wait
, Selenium ile iyi çalışmayan bir ön uçla (örneğin, Angular web siteleri) uğraşırken tek bir öğe bulmak için de kullanışlıdır. Bunun gibi bir yöntem oluşturmak, testlerinizi koruyacak ve onları çok daha kararlı hale getirecektir.
protected static WebElement waitForElement(By locator){ try { new WebDriverWait(browser, 30) .until(ExpectedConditions .numberOfElementsToBeMoreThan(locator, 0)); } catch (TimeoutException e){ e.printStackTrace(); Assert.fail("Timeout: The element couldn't be found in " + WAIT + " seconds!"); } catch (Exception e){ e.printStackTrace(); Assert.fail("Something went wrong!"); } return browser.findElement(locator); }
Öğelerin artık görünmemesini beklemek bile mümkün. Bu, özellikle, testinize devam etmeden önce OK
veya Save
düğmesini tıkladıktan sonra bir açılır pencerenin kaybolmasını bekliyorsanız kullanışlıdır.
WebElement okButton = driver.findElement(locators.OK_BUTTON); okButton.click(); new WebDriverWait(driver, 30) .until( ExpectedConditions .invisibilityOfElementLocated(locators.POPUP_TITLE) );
Yukarıda açıklanan tüm yöntemler ve daha fazlası resmi belgelerde listelenmiştir. Tüm olasılıkları okumak ve çerçevenizin kararlılığını artırmak için on dakika harcamaya değer.
Java Otomasyon Testi Eğitimi #2: Bekleyen Mantıksal Operatörler
waits
dayanıklılık katmanın iyi bir yolu, mantıksal operatörler kullanmaktır. Örneğin, bir öğenin konumlandırıldığını VE tıklanabilir olduğunu kontrol etmek isterseniz, aşağıdaki kodu kullanırsınız (lütfen bu örneklerin bir boole değeri döndürdüğünü unutmayın):
wait.until(ExpectedConditions.and( ExpectedConditions.presenceOfElementLocated(locator), ExpectedConditions.elementToBeClickable(locator) ) );
Sayfa başlığının değişip değişmeyeceğinden emin değilseniz OR operatörü uygun olacaktır. Ardından, kesinlikle doğru sayfada olduğunuzu doğrulamak için ilk koşul başarısız olursa URL'nin kontrolünü ekleyebilirsiniz.
wait.until(ExpectedConditions.or( ExpectedConditions.titleIs(expectedTitle), ExpectedConditions.urlToBe(expectedUrl) ) );
Veya sayfada bir eylem gerçekleştirildikten sonra bir onay kutusunun artık etkinleştirilmediğinden emin olmak istiyorsanız, NOT operatörü uygundur.

wait.until(ExpectedConditions.not( ExpectedConditions.elementToBeClickable(locator) ) );
Operatörleri kullanmak, waits
daha esnek hale getirebilir ve daha az kırılgan olan testlerle sonuçlanabilir.
3. İpucu: Chrome Geliştirici Araçları: Ağ Koşullarını Simüle Etme
Web uygulamanızı localhost'ta veya yerel bir ağda çalıştırmak, vahşi ortamda çalışırken performansı hakkında yanlış bir izlenim verebilir. Çeşitli yükleme ve indirme hızlarını kısma yeteneği, zaman aşımlarının eylemlerin başarısız olmasına neden olabileceği durumlarda, uygulamanızın internet üzerinden nasıl çalışacağı konusunda size daha iyi bir temsil sağlayacaktır. Chrome'un DevTools'unun gücünü kullanarak bunu simüle etmeye başlayabiliriz.
Aşağıdaki kod, farklı indirme ve yükleme hızlarını kullanarak Toptal ana sayfasını açacaktır. İlk olarak, hızlarımızı aşağıdaki kodu kullanarak bir TestNG veri sağlayıcısında saklayacağız:
import org.testng.annotations.DataProvider; public class ExcelDataProvider { @DataProvider(name = "networkConditions") public static Object[][] networkConditions() throws Exception { return new Object[][] { // Upload Speed, Dowload Speed in kb/s and latency in ms. { 5000 , 5000, 5 }, { 10000, 7000, 5 }, { 15000, 9000, 5 }, { 20000, 10000, 5 }, { 0, 0 }, }; } }
Not: Yükleme ve indirme kısıtlaması kb/s
cinsindendir ve gecikme süresi ms
cinsindendir.
Ardından, testimizi farklı ağ koşullarında çalıştırmak için bu verileri kullanabiliriz. Test içinde, CommandExecutor
komutu tarayıcının mevcut oturumunda yürütecektir. Bu da yavaş ağımızı simüle etmek için Chrome'un Geliştirici Araçları işlevindeki gerekli ayarları etkinleştirecektir. if
ifadesindeki kod, bir dizi test çalıştırılırken @BeforeClass
yöntemine dahil edilebilir.
import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.openqa.selenium.remote.Command; import org.openqa.selenium.remote.CommandExecutor; import org.openqa.selenium.remote.Response; public class TestClass { // load our data provider @Test(dataProvider = "networkConditions") public void test(int download, int upload, int latency) throws IOException { // only run if the network is throttled if (download > 0 && upload > 0) { CommandExecutor executor = driver.getCommandExecutor(); // create a hashmap of the required network conditions Map map = new HashMap(); // you can even test 'offline' behaviour map.put("offline", false); map.put("latency", latency); map.put("download_throughput", downloadThroughput); map.put("upload_throughput", uploadThroughput); // execute our code Response response = executor.execute( new Command(driver.getSessionId(), "setNetworkConditions", ImmutableMap.of("network_conditions", ImmutableMap.copyOf(map)))); } // Open the website driver.get("https://www.toptal.com/"); // You can then check that elements are loaded etc. // Don't forget to use waits! } }
Bonus İpucu: Çerezlerinizi Nasıl Yönetirsiniz
Tarayıcı tanımlama bilgileri, önceki bir oturumdan kaydedilip kaydedilmemelerine bağlı olarak uygulamanızda farklı davranışlara neden olabilir (örneğin, uygulama zaten oturum açmış bir kullanıcıyla yüklenebilir). Sorunlara neden olmamalarını sağlamak için her test çalıştırmasından önce çerezlerinizi temizlemek iyi bir uygulamadır.
Aşağıdaki kod, tüm çerezlerinizi silmenizi sağlar:
driver.manage().deleteAllCookies();
Bir çerezi ada göre de silebilirsiniz:
driver.manage().deleteCookieNamed("CookieName");
Veya bir çerezin içeriğini alın:
String myCookie = driver.manage().getCookieNamed("CookieName").getValue();
Veya tüm çerezleri alın:
List<Cookie> cookies = driver.manage().getCookies();
2020'de Test Otomasyonu: Geleceğe Bakmak
Selenium 4 önümüzdeki birkaç ay içinde piyasaya sürülecek. Hâlâ geliştirme aşamasında, ancak bir alfa sürümü zaten yayınlanmış olduğundan, ne gibi iyileştirmeler sunacağına bir göz atmaya değer.
Not: Yol haritasına bakarak ilerlemelerini takip edebilirsiniz.
W3C Web Sürücüsü Standardizasyonu
Artık Selenium'un tarayıcıyla JSON tel protokolü aracılığıyla iletişim kurmasına gerek kalmayacak; bunun yerine, otomatik testler doğrudan tarayıcıyla iletişim kurar. Bu, tarayıcı yükseltmelerine karşı koruma da dahil olmak üzere Selenyum testlerinin ünlü lapa lapa yapısını ele almalıdır. Umarım test hızı da artar.
Daha Basit Bir Selenyum Izgarası
Selenium Grid, Selenium 4'te daha kararlı ve kurulumu ve yönetimi daha kolay olacak. Izgara birleşik bir düğüm ve hub olarak hareket edeceğinden, kullanıcıların artık hub'ları ve düğümleri ayrı ayrı kurmasına ve başlatmasına gerek kalmayacak. Ayrıca, Docker için daha iyi destek olacak, paralel testler yerel olarak dahil edilecek ve daha bilgilendirici bir kullanıcı arayüzü sağlayacaktır. Hooks ile istek izleme, ızgaranızda hata ayıklamanıza da yardımcı olacaktır.
belgeler
Selenium 2.0'ın piyasaya sürülmesinden bu yana güncellenmemiş olan Selenium belgeleri, çok ihtiyaç duyulan bir elden geçirilecek.
API'deki Değişiklikler
Opera ve PhantomJS tarayıcıları için destek kaldırılacaktır. Başsız çalıştırma Chrome veya Firefox ile yapılabilir ve Opera Chromium üzerine kuruludur ve bu nedenle Chromium testi bu tarayıcı için yeterli görülmektedir.
WebElement.getSize()
ve WebElement.getLocation()
artık tek bir WebElement.getRect()
yöntemiyle değiştirilmiştir. Ancak, bunlar genellikle tek bir öğenin ekran görüntülerini oluşturmak için kullanıldığından, Selenium 4'te bir öğenin ekran görüntüsünü almak için bir API komutunun da bulunacağını bilmeye değer.
WebDriver Window
için, getPosition
ve getSize
yöntemleri getRect
yöntemiyle, setPosition
ve setSize
yöntemleri ise setRect
yöntemiyle değiştirilecektir. fullscreen
ve minimize
durumuna küçült yöntemleri mevcut olacak, böylece bu eylemler testiniz içinde gerçekleştirilebilecek.
Diğer Önemli Değişiklikler:
- Her tarayıcı için
Options
sınıfı artıkCapabilities
sınıfını genişletecek. - Çerçeve gezinmesini kolaylaştırmak için bir
driver.switchTo().parentFrame()
yöntemi eklendi. - Mevcut olanlara göre daha yüksek bir seviyede çalışan
nice
bulucular dahil edilecektir.By
öğesinin bir alt sınıfı olacaklar. - Kullanıcıların Chrome Hata Ayıklama Protokolü (ve diğer tarayıcılardaki eşdeğerleri) kullanılarak sunulan özelliklerden yararlanmalarına olanak tanıyan bir
DevTools
API uygulaması olacaktır. Bunlar şunları içerir:- Tam sayfa ekran görüntüleri (ekran dışı öğeler dahil).
- Akış günlükleri.
- Sayfada mutasyon olayları bekleniyor.
- Kullanımdan kaldırılan birçok yöntem ve sınıf da silinecek.
Not: Selenium 4'ün Alpha sürümünü Maven deposundan edinebilirsiniz. Bunu mevcut çerçevenize (ideal olarak bir sanal alan dalında) karşı denemeniz şiddetle tavsiye edilir, bu nedenle değişikliğe hazırsınız.
Çözüm
Bu makalede, test otomasyon çerçevemi daha iyi hale getirdiğim birkaç alanı ele aldım. Artık eskisinden daha kararlı ve kullanılabilir, bu da yazılım teslim yaşam döngüsüne dahil olan herkes üzerinde olumlu bir etkiye sahip olacak.
Yukarıda ana hatlarıyla belirttiğim değişiklikleri yapmak iyi bir başlangıç, ancak benim değinmediğim iyileştirmeler olabileceğinden, "acı noktalar" için tüm çerçevenizi gözden geçirmenizi şiddetle tavsiye ederim. Örneğin, sürücülerinizi yönetmek için WebDriver Manager'ı mı kullanıyorsunuz yoksa bunları hala manuel olarak mı güncelliyorsunuz?
İdeal olarak altı ayda bir olmasına rağmen, bunu yılda en az bir kez yapmak için bir tarih belirlemenizi de tavsiye ederim. Yazıda Selenium 4.0 ile gelen değişikliklere yer verdim. Lütfen Selenium'un alpha
sürümlerini kendiniz inceleyin. Değişiklikler dramatik olacak ve hazırlıklı olmanız gerekecek. Umarım bunu faydalı bulmuşsunuzdur. Çerçevenizde biraz bahar temizliği yaparken herhangi bir yeni yöntem veya teknik keşfederseniz, lütfen bunları aşağıdaki yorumlar bölümüne ekleyerek bu blogun diğer okuyucularıyla paylaşın.
Ayrıca, Selenium'daki otomatikleştirilmiş testlere ve bakımı yapılabilir ve yeniden kullanılabilir test rutinleri yazmak için Sayfa Nesnesi modellerini nasıl kullanabileceğinize bakmak istiyorsanız, Selenium'da Otomasyon: Sayfa Nesnesi Modeli ve Sayfa Fabrikası'na bakın .