specflow selenium webdriver end end example
Specflow ve Selenium Webdriver Kullanımına İlişkin Uçtan Uca Örnek:
Bunda Ücretsiz Specflow Eğitim Serisi , için Specflow'a kısa giriş önceki eğitimimizde verildi.
Bu makalede, Specflow tabanlı BDD spesifikasyonlarının kullanımının uçtan uca bir örneğini göreceğiz ve testler Selenium Webdriver aracılığıyla yürütülecektir.
Testler, bir uygulamanın oturum açma işlevini test etmek kadar basit olabilir. Sadece bu testleri Specflow kullanarak açıklayacağız ve Step uygulamaları Selenium sürücüsünü, komutları ve NUnit'i ispat çerçevesi olarak kullanacaktır.
Ayrıca, NUnit tabanlı Specflow çalıştırıcısını da kullanacağız (açık kaynak olmayan ve ücretsiz sürümde rastgele bir gecikme getiren Specrun'un aksine).
Ne öğreneceksin:
Eğitim Videosu: Specflow ve Selenium
Specflow ve Selenium ile ilgili eğitim videosunu izleyin:
gereksinimlerden test senaryoları nasıl yazılır
Başlayalım.
Başlamak için, Visual Studio'da bir Birim test Projesi oluşturalım ve aşağıdaki ön koşulları yükleyelim:
# 1) Bir birim test projesi oluşturun
Nunit ve Specflow için Nuget paketini kurun.
Install-Package Specflow.NUnit
# 2) Selenium’un Chrome tarayıcısı için Webdriver'ı yükleyin.
Bu, aşağıdaki komutla Nuget Paket Yöneticisi konsolu aracılığıyla da kurulabilir.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) Selenium Webdriver kitaplıklarını ve Selenium Wait Helpers'ı ExpectedCondition waitits eklemek için kurun.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) Şimdi otomatik olarak oluşturulan projeden test.cs dosyasını kaldırın.
Specflow için özellik dosyalarını ve adım tanımlama dosyalarını kullanacağımızdan herhangi bir karışıklığı önlemek için bu adımı yapıyoruz.
# 5) Özellik ve Adım tanımı uygulama dosyalarını depolamak için Özellikler ve Adım Tanımları için klasörler oluşturun.
Bu zorunlu bir adım değildir, ancak özellikleri ve adım uygulamalarını ayrı klasörlerde düzenlemek için kullanışlıdır.
# 6) Yukarıdaki adımların sonunda, çözüm yapısı ve packages.config aşağıda gösterildiği gibi görünmelidir.
Özellik ve Adım Uygulama
Şimdi özellik dosyası ve gerçek adım uygulamasına başlayalım.
Özellik hakkında - Örnek özellik, Youtube Web Sitesinin arama işlevini test etme / doğrulama olacaktır. Bir anahtar kelime arayacağız ve kullanıcının arama sonuçları sayfasına yönlendirildiğini iddia edeceğiz.
Yeni bir özellik dosyası ekleyin ve dosyayı şu şekilde adlandırın: YoutubeSearchFeature.feature
Aşağıda gösterildiği gibi bir arama işlevi senaryosu ve özellik açıklaması ekleyin:
Feature: YoutubeSearchFeature In order to test search functionality on youtube As a developer I want to ensure functionality is working end to end @mytag Scenario: Youtube should search for the given keyword and should navigate to search results page Given I have navigated to youtube website And I have entered India as search keyword When I press the search button Then I should be navigate to search results page
Yukarıdaki senaryo, testin şunları yapmasını beklemektedir:
- Youtube Web Sitesine gidin: Bu, bir tarayıcıdaki bir web sayfasına gitmek için bir Webdriver kullanacak olan Selenium gibi bir Web otomasyon çerçevesi gerektirecektir.
- Bir anahtar kelime arayın: Bu adım, sırasıyla anahtar kelimeyi girmek ve aramayı yürütmek için uygun giriş öğelerini ve düğmeleri aramayı içerecektir.
- Arama sonuçlarının görüntülendiğini ve kullanıcının sonuçlar sayfasında olduğunu iddia edin: Bu adım, kullanıcının doğru sayfaya gelip gelmediğini doğrulamaya yönelik iddiaları içerecektir.
Şimdi adımların her birinin Adım uygulamalarına bakalım.
Bundan önce, Selenium mantığını / kodunu mevcut Specflow tanımına nasıl entegre edeceğimizi anlayalım.
Selenyum veya başka herhangi bir araç (veya Birim test taslakları / taklitleri / sürücüler vb.) esasen Adım Yürütmenin ara bir parçasıdır, ancak anlaşılması gereken en önemli şey, bu Çerçeveleri entegre etmenin yoludur.
Specflow, kullanıcıların test özelliklerini yazmasına olanak tanır. Kullanılması gereken aracı dikte etmez. Bu nedenle, test geliştiricisi, çözülmekte olan kullanım durumuna bağlı olarak istediği kadar test aracı seçmekte özgürdür.
Bu senaryoda Selenium'u kullanmak için aşağıdakilere ihtiyacımız var:
- Kullanıcının Sürücü uygulamasına göre bir tarayıcı kullanarak web sayfasına fiilen gitmesini sağlayacak bir WebDriver örneği (basitlik için ChromeDriver'ı kullanacağız).
- Kullanıcıyla etkileşimde bulunmak, girdileri geçmek ve eylemleri gerçekleştirmek vb. İçin gereken birkaç WebElement bildirimi (ve yalnızca Step uygulamalarının bir parçası olarak yapılabilir).
- Sürücü örneğinde yürütülebilecek Pencere başlığı, url'ler vb. Hakkında birkaç iddia.
Step Implementations dosyasında bir ChromeWebdriver örneği oluşturacağız.
Bu nedenle, Adım Tanımlama dosyasını oluşturalım. Son makalede gördüğümüz gibi, Specflow, Adım tanımlarını otomatik olarak oluşturmak için bir mekanizma sağlar (daha sonra gerektiğinde özelleştirilebilir / değiştirilebilir).
- Özellik dosyasına gidin, Sağ tıklayın ve 'Adım Tanımları Oluştur' u seçin.
- Daha önce oluşturduğumuz gibi StepDefinitions klasöründe yeni bir dosya oluşturun ve dosyayı YoutubeSearchFeatureSteps.cs olarak adlandırın.
- Senaryonun tüm Adımlarının Adım tanımlarına uygun şekilde bağlandığından emin olun.
İpucu - Otomatik olarak oluşturulan Adım tanımlarını değiştirme:
Şimdi dikkatlice gözlemlerseniz, anahtar kelime arama adımımız için oluşturulan Adım tanımı, yani otomatik olarak oluşturulan kod olan 'Arama anahtar kelimesi olarak Hindistan'ı girdim', arama anahtar kelimesini tanımlamaz / ayırmaz ve dolayısıyla onu parametreleştirmez.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
Ama istediğimiz bu değil. Arama anahtar kelimesinin parametreleştirilmesine ihtiyacımız var, aksi takdirde her anahtar kelime araması için özel bir Adım tanımı oluşturmamız gerekecek.
Öyleyse, bu Adım tanımının daha genel bir tanımla nasıl değiştirileceğini görelim, bu da Arama Anahtar Kelimesini parametrelendirmeyi mümkün kılacaktır. Bu, basit bir normal ifade eşleştirici aracılığıyla yapılabilir.
Aşağıdaki kod örneğine bakın. Arama anahtar kelimesini bir normal ifade eşleştirici ile değiştirdik, ör. ' (. *) Bunun yapacağı şey, Senaryodan geçireceğiniz herhangi bir anahtar kelimenin değerini değiştirecek ve aşağıdaki kod örneğinde 'searchString' adlı giriş parametresinde aranan anahtar kelimenin değerini ayarlayacaktır.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
Bu şekilde, kodu modüler tutar ve her bir Adım uygulaması için tekrarlanan standart kodlardan kaçınır.
Selenyum Entegrasyonu ve Adım Tanımlama Mantığı
Şimdi Selenium'un Specflow ile gerçek entegrasyonunu görelim. Adım tanımları oluşturulduktan sonra, gerçek test Senaryosunu yürütmek için şimdi onlara kod ekleyeceğiz.
Selenium Web sürücü örneğini Senaryo yürütmesi boyunca kullanılabilir olması için nereye yerleştirebileceğimizi ve başlatabileceğimizi görelim. Sürücüyü, oluşturulan Bağlama Sınıfının özel bir alanı olarak yerleştireceğiz. Sürücü, Oluşturucu sınıfının bir parçası olarak başlatılacaktır.
Bu şekilde, tüm Adımlar için tek bir Bağlama dosyamız olduğundan (ve test yürütme başlamadan önce başlatıldığından), sürücü test süresi boyunca başlatılmış olarak kalır.
Ayrıca şunu da uygulayacağımızı unutmayın: Tek kullanımlık arabirim, artık gerekli olmayan sürücü örneğini elden çıkarmak için. Dispose () Yöntemine yerleştirmek, sınıfın Object'i elden çıkarıldıktan sonra sürücü örneğinin de elden çıkarılabileceğini garanti eder.
WebDriver örneğinin bildirimi ve başlatılması için kod şu şekilde görünür:
(Binding) public class YoutubeSearchFeatureSteps : IDisposable { private String searchKeyword; private ChromeDriver chromeDriver; public YoutubeSearchFeatureSteps() => chromeDriver = new ChromeDriver(); //... other Step defintion implementations public void Dispose() { if(chromeDriver != null) { chromeDriver.Dispose(); chromeDriver = null; } } }
Yukarıdakilerle, sürücü örneği, senaryo yürütmenin bir parçası olan herhangi bir Adım uygulamasının parçası olarak kullanılabilir.
Şimdi her bir senaryonun Adım Uygulamasına bakalım.
# 1) Adımları Düzenleyin:
Given I have navigated to youtube website And I have entered India as search keyword
Bu adımların her ikisi de sürücü örneğiyle etkileşim kurmayı içerir. Açılan ilk adım, tarayıcı penceresidir ve youtube web sitesine gider
İkinci adım, arama giriş düğmesini arar ve arama anahtar sözcüğü olarak 'Hindistan' ı girer.
Bu adımların her ikisi için uygulama aşağıda verilmiştir:
((Given(@'I have navigated to youtube website')) public void GivenIHaveNavigatedToYoutubeWebsite() { chromeDriver.Navigate().GoToUrl('https://www.youtube.com'); Assert.IsTrue(chromeDriver.Title.ToLower().Contains('youtube')); } 7. (Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { this.searchKeyword = searchString.ToLower(); var searchInputBox = chromeDriver.FindElementById('search'); var wait = new WebDriverWait(chromeDriver, TimeSpan.FromSeconds(2)); wait.Until(ExpectedConditions.ElementIsVisible(By.Id('search'))); searchInputBox.SendKeys(searchKeyword); }
İlk Adım için, pencere başlığını kontrol ederek youtube'da gezinmenin başarılı olmasını sağladığına dair İddiaya dikkat edin.
Not: Onayları farklı web öğelerine veya sürücü özelliklerine yerleştirmenin çeşitli yolları olabilir, ancak bu öğreticinin nihai amacı, yalnızca en basit yolla göstermektir.
İkinci adımda, kullanarak bir Dinamik bekleme ekledik. Beklenen Koşullar bu, kod arama anahtar kelimesini girmeye çalışmadan önce arama kutusunun görünür olmasını sağlar.
Ayrıca searchString'i bir özel alan searchKeyword. Bu, searchKeyword'ün diğer Adım uygulamalarında da kullanılabilmesi için yapılır.
İpucu - Verileri Adımlar arasında iletme
Verilerin bu yaklaşımla (yani sınıf değişkenleri aracılığıyla) geçirilmesi / depolanması, verilerin Adım bağlamaları arasında paylaşılabildiği araçlardan biridir.
Specflow'un kendisinin ScenarioContext adlı Dinamik Sözlük Nesnesi sağlaması gibi, bunu yapmanın başka yolları da vardır. Gelecek makalelerde bununla ilgili daha fazla ayrıntı göreceğiz.
# 2) Hareket Adımı
When I press the search button
Şimdi, Ara düğmesini tıklamak olan gerçek eyleme bakalım. Adım uygulama dosyası, senaryo adımını yürütmek için arama düğmesini arayacak ve tıklatacaktır.
Bu adımın kodu aşağıda gösterildiği gibi görünür:
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) Nihayet İddia Adımı:
Then I should navigate to search results page
Bu adımda, URL ve sayfa başlığının arama anahtar kelimesini içerip içermediğini Sürücü özelliklerinden doğruluyoruz.
Bu adımın kodu aşağıda gösterilmiştir:
(Then(@'I should be navigate to search results page')) public void ThenIShouldBeNavigateToSearchResultsPage() { // After search is complete the keyword should be present in url as well as page title` Assert.IsTrue(chromeDriver.Url.ToLower().Contains(searchKeyword)); Assert.IsTrue(chromeDriver.Title.ToLower().Contains(searchKeyword)); }
Yürütme
Şimdi Senaryoyu çalıştırmayı deneyelim ve sonuçları görelim. Senaryo yürütüldüğünde, tüm Senaryo Adımları Sırayla yürütülecektir. Test, bir tarayıcı açacak, bir web sitesine gidecek ve ardından bazı işlemler gerçekleştirecektir.
Testin çıktısı, her bir adımın başarısını / başarısızlığını gösteren test özetinden 'Çıktı' düğmesine tıklanarak görülebilir.
İpuçları
Ara başarısız Adımlar
Başarısız ara adımlara sahip bir Senaryo durumunda, lütfen bu senaryolarda Specflow'un o Senaryodaki kalan Adımları yürütmeyeceğini ve testin sonucunu başarısız olarak işaretleyeceğini unutmayın.
Windows 7 için ücretsiz sistem iyileştirici
NUnit Adapter ile test çalıştırma
Bu Örnek için, Specflow.NUnit test çalıştırıcısını (Nuget Paket Yöneticisi aracılığıyla kurduğumuz) kullanarak testlerimizi gerçekleştirdik.
Bu, daha önceki makalede kullandığımız Specrun koşucusundan aşağıda gösterildiği gibi birkaç yönden farklıdır.
- Specflow.NUnit runner açık kaynak kodludur.
- Testler yapılırken herhangi bir gecikme yaratmaz.
Sonuç
Bu makalede, Youtube uygulamasında bir video aramasının basit bir test senaryosu aracılığıyla Selenium'u Specflow çerçevesiyle entegre etmenin uçtan uca bir örneğini gördük.
Selenium'u entegre ederken, özel sınıf alanları aracılığıyla farklı bağlamalarda verilerin nasıl paylaşılacağını da inceledik. Ayrıca, testi NUnit runner Vs Specrun koşucusu üzerinde çalıştırmayı da ele aldık ve her ikisini ayrıntılı olarak karşılaştırdık.
Kod Dosyaları
YoutubeSearchFeature.feature
Feature: YoutubeSearchFeature In order to test search functionality on youtube As a developer I want to ensure functionality is working end to end @mytag Scenario: Youtube should search for the given keyword and should navigate to search results page Given I have navigated to youtube website And I have entered India as search keyword When I press the search button Then I should be navigate to search results page
YoutubeSearchFeatureSteps.cs
using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; using SeleniumExtras.WaitHelpers; using System; using System.Collections.Generic; using System.Linq; using TechTalk.SpecFlow; namespace SepcflowSelenium.StepDefinitions { (Binding) public class YoutubeSearchFeatureSteps : IDisposable { private String searchKeyword; private ChromeDriver chromeDriver; public YoutubeSearchFeatureSteps() => chromeDriver = new ChromeDriver(); (Given(@'I have navigated to youtube website')) public void GivenIHaveNavigatedToYoutubeWebsite() { chromeDriver.Navigate().GoToUrl('https://www.youtube.com'); Assert.IsTrue(chromeDriver.Title.ToLower().Contains('youtube')); } (Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { this.searchKeyword = searchString.ToLower(); var searchInputBox = chromeDriver.FindElementById('search'); var wait = new WebDriverWait(chromeDriver, TimeSpan.FromSeconds(2)); wait.Until(ExpectedConditions.ElementIsVisible(By.Id('search'))); searchInputBox.SendKeys(searchKeyword); } (When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); } (Then(@'I should be navigate to search results page')) public void ThenIShouldBeNavigateToSearchResultsPage() { System.Threading.Thread.Sleep(2000); // After search is complete the keyword should be present in url as well as page title` Assert.IsTrue(chromeDriver.Url.ToLower().Contains(searchKeyword)); Assert.IsTrue(chromeDriver.Title.ToLower().Contains(searchKeyword)); } public void Dispose() { if(chromeDriver != null) { chromeDriver.Dispose(); chromeDriver = null; } } } }
Specflow'da Paylaşılan ve Kapsamlı Bağlamalar, Kancalar ve Adım Yeniden Kullanım hakkında daha fazla bilgi edinmek için yaklaşan öğreticimizi izleyin!
PREV Eğitimi | SONRAKİ Eğitici
Önerilen Kaynaklar
- Salatalık Selenium Eğitimi: Salatalık Java Selenium WebDriver Entegrasyonu
- Selenium WebDriver'a Giriş - Selenium Eğitimi # 8
- Jenkins'in Selenium WebDriver ile Entegrasyonu: Adım Adım Eğitim
- İlk WebDriver Komut Dosyamızın Uygulanması - Selenium WebDriver Eğitimi # 10
- Selenium WebDriver'da Uyarılar / Açılır Pencereler Nasıl İşlenir - Selenium Eğitimi # 16
- Eclipse ile WebDriver Tam Kurulum ve Kurulum - Selenium Eğitimi # 9
- Çeşitli Türlerde WebDriver Komutlarını Kullanarak Web Öğelerinin Görünürlüğünü Kontrol Edin - Selenium Eğitimi # 14
- GeckoDriver Selenium Eğitimi: Selenium Projelerinde GeckoDriver Nasıl Kullanılır