Specflow ve Selenium İle UI Testi Yazımı

Merhaba, bugün size C# dilinde SpecFlow ve Selenium kullanarak UI testi yazımı hakkında bilgi vermeye çalışacağım.

Specflow bir BDD(Behavior Driven Development — Davranışa Dayalı Geliştirme) frameworküdür. Senaryoları Gherkin diliyle yazmamızı sağlar. BDD somut örneklerle bir uygulamanın nasıl davranması gerektiği hakkında bilgi sahibi olmamızı sağlar. BDD ile tüm ekibin aynı dili konuşması sağlanır. Yazdığımız testlerin bakımını ve okunmasını kolaylaştırır. Raporlamayı kolaylaştırır. BDD ile yazmış olduğumuz senaryolar yaşayan dökümanlar haline gelecektir.

Selenium web tarayıcılarını kontrol etmemizi sağlayan bir tarayıcı otomasyon aracıdır. Son kullanıcılar tarafında gerçekleştirilen faaliyetleri simüle etmemizi sağlar. Ayrıca javascript çalıştırma gibi özellikleri de bulunmaktadır. Frontend testleri için kullanılabilir. Selenium Grid sayesinde testlerimizi birden çok makinede paralel olarak çalıştırabiliriz.

Projeyi Github’da incelemek isterseniz aşağıdaki adresten inceleyebilirsiniz.

.Net Framework sürümü 4.7.2 olan bir Class Library projesi oluşturdum. Ve Solution’a aşağıdaki dosyaları ekledim.

1_2DCYhGTn3yd6550_ZDqXWQ.webp

Projeden kısaca bahsetmek gerekirse Utilities klasörünün altındaki BrowserUtility classında ChromeDriver methodunda yeni bir ChromeDriver oluşturuyorum. GoToUrl methodunda WebDriver ile istenilen url’e gidiyorum. DriverClose methodunda driver’ı kapatıyorum.

Features klasörünün altında 2 adet feature dosyamız var. Senaryolarımız Trendyol.feature dosyasında ürün eklemek için bir senaryo ve sepetten ürün çıkarmak için bir senaryo şeklinde. Specflow Feature dosyasını aşağıdaki şekilde oluşturuyorum. Diğer feature dosyasına daha sonra değineceğim.

Test klasöründe Trendyol.cs var bu class için feature dosyalarıyla binding yaptığımız ve step definitionları tanımlayıp feature dosyasındaki steplerle bağladığımız class diyebiliriz. StepDefinition’da yazılan methodlarda PageModel’den ilgili methodu çağırarak istenilen işlemi yaptırıyoruz.

Feature ile class’ı bind etme işlemini class’ın üstüne alttaki annotation’u ekleyerek yapıyoruz.

[Binding, Scope(Feature = “Trendyol”)]

Senaryomuzun ilk stepinde tarayıcımızı ayağa kaldırıyoruz ve istenilen url adresine gitmesini sağlıyoruz.

Bir step içerisinde bir değişken göndermek istiyorsak ‘’ içerisine yazmamız gerekir. Örneğin “\ Arama alanına ‘bilgisayar’ yazılır” şeklinde bir stepimiz varsa step definition’ımızı da alttaki gibi yazdığımızı düşünürsek string search değeri bilgisayar olacaktır. Step Definitiondaki (.\) değeri değişken demektir.

PageModels klasöründe BasePage.cs ve Trendyol.cs adında 2 class var. BasePage.cs’te sık kullanacağımız methodları yazıyorum. Trendyol.cs dosyası ise BasePage’ten kalıtım alıyor ve selenium kodlarımı bu 2 classa yazıyorum.

UI testi yazarken öncelikle elementleri yakalamak gerekir bunu yapmak için farklı yöntemler vardır. Ben genellikler id, class ve xpath kullanıyorum. Id sadece bir tane olabileceği için id varsa onu kullanmak en mantıklıdır daha sonra class ve xpath gelir.

Bunun dışında By ile de WebElementlerimizi yakalayabiliriz.

Bu elementleri yakaladıktan sonra ilgili methodda bu element’e istediğimiz işi yaptırabiliriz.

Mesela alttaki methodda txtSearch elementine BaseModel’da yazmış olduğumuz EnterSearch methodunu kullanarak search değerini yazdırıyoruz.

Bu şekilde senaryomuzu oluşturup elementlerimizi bulduk ve methodları istediğimiz şekilde doldurduktan sonra Test Explorerdan ilgili feature’a tıklayıp run dedikten sonra testlerimizin çalıştığını görürüz.

Farkettiyseniz 2 senaryomuzda da aşağıdaki adımlar ortak, eğer birden fazla senaryoda ortak adımlar varsa SpecFlow’un Background özelliğini kullanabiliriz. Background sayesinde ortak stepleri bir sefer yazmamız yeterli olacaktır.

Bunun dışında SepeteUrunEkle senaryomuzda sadece bilgisayar aratmıştık fakat başka kategorilerden de ürünü sepete eklediğimiz bir senaryo yazmamız gerekebilir. Bunu da Examples özelliği ile sağlıyoruz. Örneğin aşağıdaki örnekte Sepete Ürün Ekle senaryomuzda bilgisayar ve telefon kategorilerinden ürünler ekliyoruz.

Bu yaptığım değişiklikleri Trendyol2 adında bir Feature ekleyip oraya ekliyorum. Feature’ın son hali aşağıdaki şekilde.

Daha sonra Tests klasörü altındaki Trendyol classına gidip binding’i aşağıdaki şekilde değiştiriyorum.

[Binding, Scope(Feature = “Trendyol2”)]

Bu şekilde Test Explorerdan Trendyol2Feature’ı run ettiğimde aşağıdaki şekilde testlerin başarıyla çalıştığını görüyoruz.

Bir sonraki yazımda görüşmek üzere hoşçakalın.

Not: Testlerin çalışabilmesi için Google Chrome ve Chrome Driver versiyonlarının aynı olması gerekmektedir. Eğer test çalışmazsa Google Chrome’u açtıktan sonra Ayarlar -> Chrome Hakkında adımlarını izleyerek Google Chrome versiyonunuzu öğrenip projede Solution’a sağ tıklayıp Manage Nuget For Solution diyerek Selenium.WebDriver.ChromeDriver paketi için uygun versiyonu seçip install ederseniz testlerin çalışacağını düşünüyorum.

Kaynaklar

[specflow.org]