Soap UI
Merhabalar,
Bu yazımda Soap UI’dan bahsedeceğim.
Soap(Simple object access protocol) web servis oluşturmak için kullanılan yöntemlerden birisidir. Web servis, HTTP protokolü üzerinden diğer sistemlere XML , JSON , CSV gibi ortak biçimlerle veri alışverişini sağlar.
Soap programlama dilinden bağımsız olarak web servis oluşturur. Envelope-Header-Body-Fault kısmından oluşur. Siz bir istek gönderirsiniz ve size karşılığında bir cevap döner. Tıpkı mektuplaşmak gibi, Bir mektup yazarsınız ve karşınızdakinden cevap alırsınız.
Fotoğrafta bir Soap yapısını görüyorsunuz. Yukarıda <TcKimlikDogrula şeklinde bir istek atıyoruz ve etiketler içinde bilgileri girip yolluyoruz. Response olarak <TCKimlikNoDogrulaResponse şeklinde bir response ile bize dönüş yapıyor. ve Result tag’i içinde gördüğünüz gibi Boolean yani true veya false ifade dönüyor. Yani siz benim Tc kimlik no , adım, soyadım ve doğum yılım budur acaba Tc kimlik numaram doğru mu ? diyorsunuz üstteki yapıyla. Aşağıda ki yapı ise size cevap olarak doğru veya yanlış şeklinde cevap veriyor. Gördüğünüz gibi web servis ile diğer sistemler ile konuşabilmiş olduk.
SOAP tabanlı bir web servisinin, gönderilen XML verisini nasıl yorumlayacağının tanımlanması gerekir. Bu web servis tanımlaması WSDL standartı ile yapılır. REST için ise WSDL gibi bir tanımlama diline ihtiyaç kalmaz işlemler HTTP metodları üzerinden yapılır. Örneğin bir web servisinin metodunu SOAP ile “getCurrentWeather” şeklinde çağırırken REST ile “/current.json? key=<ApiKey>&q=Elazig” URI’si ile çağırabiliriz.
Biraz kafamızda bir şeyler oluştuysa şimdi Soap UI’den bahsetmeye başlayalım. Soap UI ile web servislerini kontrol edebiliriz, herhangi bir web servisini çağırabiliriz, web servisini simüle edebiliriz ve fonksiyonel test yapabiliriz. Java ile geliştirildiği için her platform için bir pakete sahiptir.
Öncelikle Soap UI’ in open-source version’unu linkten indirelim.
Küçük bir örnekle başlayalım ve olayı anlamaya çalışalım.
İndirdikten sonra sizi bu şeklide bir ekran karşılayacaktır.
Sol üst kısmı incelediğinizde SOAP ve REST kısmını görebilirsiniz. Yani Soap UI’nın adına aldanarak sadece SOAP çalıştırdığı yanılgısına kapılmayınız, aynı zamanda REST ile de işlemler yapabiliyorsunuz.
Ardından Adım 1' de gördüğünüz SOAP kısmına tıklayalım. Yeni bir SOAP projesi açmamızı sağlayacaktır. Adım 2'de açılan ekranda Initial WSDL ile bizden bir WSDL istiyor. Project name kısmına istediğiniz proje ismini yazabilirsiniz. Initial WSDL’ i girdiğiniz takdirde size otomatik bir project name atar , isterseniz onu da kullanabilirsiniz.
Bu örnek için http://www.dneonline.com/calculator.asmx?WSDL bu adresi kullanacağız. Şimdi öncelikle bu adreste dikkat etmeniz gereken şey sonunun ?WSDL ile bitiyor olması. Verdiğim linkten ?WSDL ifadesini sildiğinizde size methodları isimleriyle gösteriyor olacaktır. Methodlara tıklayarak içeriğine gidebilirsiniz. http://www.dneonline.com/calculator.asmx? tıkladığınızda aşağıdaki gibi methodları görüyor olmalısınız :
Şimdi sonuna ?WSDL ekli halini Adım 2 ‘deki Initial WSDL kısmına yapıştıralım ve OK ‘a basarak projemizi oluşturalım. Ben proje ismini HesapMakinesi olarak verdim.
Projemiz oluştuktan sonra bu şekilde görünecektir.
Adım 1 olarak CalculatorSoap’a tıklayalım ve Adım 2 deki kısmı inceleyelim. Burada bir işlem yapmayacağız sadece olayı anlamamız için. Daha iyi görünmesi için adım 2 ‘yi yaklaştırıp tekrar ekliyorum :
Evet burada name =”Add” adında bir yapımız var. Burada dikkatinizi çekmek istediğim şey type kısmı. Gördüğünüz gibi type olarak int vermiş. Şimdi bir request gönderip response çekmeden önce çoğunuzun bildiği method mantığı üzerinden buradaki olayı anlatmak isterim.
Şimdi buradaki olay myMethod adında bir method tanımlıyoruz ve bu method’a initial değer olarak integer x ve y (değişkenler )veriyoruz. Yani siz bu fonksiyonu bir yerde çağırdığınızda o değişkenlere değer vererek çalıştırmanız gerekiyor. Aşağıda myMethod(5,3) diyerek x =5 ve y= 3 değerlerini vermiş oluyor. static int myMethod tanımlamasında int diyerek bu method bana integer bir değer döndürmek zorunda diyoruz.
Zaten bildiğiniz bu olayı anlattım çünkü şimdi yapacağımız olayları aynı buna benzeteceğim. Öncelikle yukarıda fotoğrafta type =int olmasına dikkat etmenizi istemiştim. Buradaki int type ‘ı yukarıdaki fonksiyonda (int x, int y) ‘ ye benzer. Siz request’i atarken integer vermelisiniz yoksa response olarak hata dönecektir. static int ve return kısmını ise response’a benzetebiliriz. Fonksiyon çağırıyorsunuz ve bir yanıt bekliyorsunuz yanıtı size return ile veriyor.
Yukarıdaki fonksiyon bir toplama işlemi yapıyor. Fonksiyon benzetmeme devam edebilmek için biz de bir toplama işlemi yapıyor olacağız. Bu yüzden hesap makinesi için bir SOAP çektim.
Toplama işlemini yapacağım için Add kısmının altındaki Request 1 ‘e tıklıyoruz. Gelen ekranda 2 ‘ile işaretlenen kısma dikkat etmeliyiz. Gördüğünüz gibi burası (int x, int y) kısmımızdır. Biz buraya verdiğimiz x ve y değerine göre x + y işlemi yapılacak ve bize bir return yani web servis diliyle response dönecektir.
Evet şimdi çalıştırıyoruz. Çalıştırma işini de fonksiyonu çağırmak olarak düşünebilirsiniz. Adım 1'deki run butonu ile çalıştırıyoruz. Ardından fonksiyon inital değerlerini(int x, int y) 8 ve 2 veriyorum(Adım 2). Ve return olarak yani response olarak bize Adım 3 ‘ te gördüğünüz 10 cevabını veriyor. Yani biz bir web service ile bir iletişim kurduk. Request olarak 8 ve 2 ‘yi verdik ve bize response olarak 10 ‘u döndü. Burada yaptığınız şeye bir unit test diyebiliriz, yazdığınız değerlere karşılık doğru veriyi dönüp dönmediğini kontrol etmiş olduk. URL’nin çalıştığını gördük bu da yaptığımız bir kontrol olarak gösterilebilir.
Şimdi biraz vites yükseltiyoruz ve test suite konusuna giriyoruz. Test suite kısmını ise yine fonksiyonlara benzetirsek, bu sefer ki olay fonksiyonları art arda çağırmak. Mesela diyelim ki (8+2)-5 işlemini yapmak istiyorum. Bunu fonksiyonlarla yapacaksam ya direkt tek fonksiyon içerisinde yaparım bu olayı ya da iki fonksiyon kullanırım ve x = 8+2 olarak ilk fonksiyon çıktısını alırım. Ardından ikinci fonksiyonum çıkarma işlemi yapan bir fonksiyon olur , x -5 işlemini yaptırırım. Burada dikkat etmeniz gereken olay ikinci fonksiyonun x değeri ilk fonksiyonun çıktısı olduğudur.
Yani yukarıdaki paragraftan anladığımız gibi test suite’deki olay fonksiyonları belirli bir sıraya göre çağırmaktır. İşte bu belirli sıraya test dünyasında Senaryo diyoruz. Bir senaryoya göre işlem yapıyoruz. Page object Pattern yazımı okursanız orada LoginPageTest kısmında art arda fonksiyon çağırarak bir senaryoyu gerçekleştirmiştik. Burada da aslında senaryo oluşturmayı art arda fonksiyon çağırma ile yapacağız.
Burada Add ‘ i bir fonksiyona benzetmiştik. Ardından Subtract’ı çağıracağız mesela. Böylece toplama sonrası çıkarma işlemini yapıyor olacağız. Bunları bir senaryo içine almamız işlemine ise test suite diyeceğiz. Hadi test suite oluşturalım :)
CalculatorSoap ‘a tıkladıktan sonra Generate TestSuite seçeneğine tıklayalım.
Ardından gelen kısımda Operations kısmında çağıracağım fonksiyonları ekliyorum. Burada toplama ve çıkarma fonksiyonlarını çağırıyor olacağım. Style kısmını Single olarak seçtiğimde tek testCase’i içinde toplama ve çıkarma işlemi oluşturacaktır. Tüm fonksiyonlarımı deneyeceğim kalabalık projelerde One testCase seçilir ve tüm fonksiyonlar’ı bir case içinden çalıştırırsın. Biz şuan 2 fonksiyon çalıştıracağız tek test case’i ile çalışmamız yeterlidir o yüzden single’ı seçmemiz yeterlidir. OK diyoruz ve bize TestSuite için isim istiyor. Ben aşağıdaki gibi bir isim verdim fakat istediğiniz gibi verebilirsiniz.
OK dedikten sonra bizim için bir Test Suite oluşturacaktır.
Ve bu şekilde görünecektir.
CalculatorSoap TestSuite’ine buradan start veririz. Burayı Topla_ve_Cıkar ‘ın üzerine tıklayarak açabilirsiniz. Run’a tıkladığınız anda Test step’lerini sırasıyla çalıştıracaktır. Şimdi fonksiyonların içine girmeden direkt buradan Run ‘ ettiğimizde önce Add ardından Substract fonksiyonlarını çalıştıracaktır. Aşağıdaki GIF’te görebilirsiniz :
GIF’i göremeyenler için; Öncelikle Add içeriğine giriyorum ve yeni initial değerler veriyorum fakat çalıştırmadan direkt çıkıyorum çünkü çalıştırmayı test suite’imiz sırayla(senaryoya göre) yapacak. Ardından Subtract kısmına girip yeni değerler yazıyorum yine çalıştırmadan çıkıyorum. Son olarak çalıştırma işini test Suite üzerinden yapıyorum. Ardından Add’e ve Substract’a girdiğimde işlemlerin çalıştığını ve bana response döndüğünü görebiliyorum. Böylelikle test suite görevini yapmış oluyor ve Suite içindeki fonksiyonları sırasıyla çalıştırdı.
Fakat burada 4+5 ve 7–2 olaylarını ayrı ayrı yapıyoruz. Ve çıktılarına bakıyoruz. Eğer (8+2)-5 olayını yapmak istersek ? Burada matematikten bildiğiniz gibi önce parantez içi yapılacak yani önce Add fonksiyonu çalışacak. Parantez içinden çıkan değer çıkarma işleminin giriş değeri olacaktır. 10–5 yapabilmek için Add’in çıktısı olan 10 ‘u alabilmemiz gerekiyor. Yani Add’in çıktısını Substract’ın girdisi olarak verebilmemiz gerekiyor. Peki bunu nasıl yaparız ? Burada işin içine Property Transfer’i sokacağız. Add’den çıkan değeri Substract için giriş değeri olarak alacağız.
Öncelikle bir Property Transfer ekliyoruz.
Add → Insert Step → Property Transfer’e tıkladıktan sonra yeni bir Property Transfer’i bizim için ekleyecek. Amacımızı tekrar anlatayım. Add bir request gönderecek toplama için response olarak toplamanın cevabı gelecek. Ben o cevabı alıp çıkarma işleminin girdisi yapacağım.
Bir isim verdikten sonra size bu ekranı açacaktır. Sol üstteki (+) butotuna tıkladıktan sonra Transfer için bir isim veriniz. Ben Transfer diyeceğim.
Burada Source ve target kısımlarımızı inceleyelim. Öncelikle Bizim amacımız Add’in çıktısını Substract’ın girdisi yapmak. O yüzden Add source olacaktır , target ise substract olacaktır. Çünkü değerimiz Add’den substract’a gidecek. Ardından Property kısmına bakalım. Burada Add için Response dedik, çünkü dediğim gibi Add’in çıktısını alacağız yani add’in response’unu alacağız. Ve subtract’ın girdisi olacağı için Subtract kısmına ise request diyoruz. Görselleştirmek gerekirse :
Request ve Response’u neye göre seçtiğimi anlamışsınızdır umarım. Şimdi işlemimize devam edelim.
Run sembollerinin sağındaki sembole tıkladığınızda Add ve Subtract için envelope değerlerini bildirecektir. Bunu kesinlikle yapıyor olmalıyız.
Ardından GIF’teki gördüğünüz işlemleri yapıyoruz ve başarıyla transfer etmiş oluyoruz. GIF’i göremeyenler için; öncelikle Add kısmında //:*AddResult yazıyor olmanızı bekliyorum. Bu bir Xpath yazım şeklidir bununla ilgili daha çok bilgiye buradan ulaşabilirsiniz. Ardından Subtract kısmına //:*intA yazmanızı bekliyorum. Buradaki // olayı Xpath’in syntax’ından geliyor. AddResult ve intA ise bizim istediğimiz bölgelerin tag(etiket)leri. Add kısmı için response’da bulunan bu tag’i :
Subtract kısmı için request’te bulunan bu tag’i :
aldık. tem: kısmını alırsanız hata verebiliyor. Bu yüzden *: ile tümünü al diyoruz. Evet property’imizi aktardık. Add’e gelip 5 + 5 yaptığımda 10 değerini response edicektir. Bu 10 değeri çıkarma işlemimize transfer olacaktır. Transfer olduysa [10] şeklinde transfer olan değer gözükecektir. Eğer Add içinde 5 + 6 şeklinde işlemi değiştirip tekrar çalıştırırsanız, test suite içine property transferi yerleştirdiğimiz için o da çalışacaktır ve aktarılan değeri [11] olarak değiştirecektir. Test suite’yi çalıştırdıysanız ve aktarımı doğru yaptıysanız çıkarma işleminin request’ine girdiğinizde işlemin 10–2 olarak değiştiğini göreceksiniz.
evet 5+5 işlemini yaptık, Ardından 5+5 ile 7–2 işlemini ve son olarak (5+5)-2 işlemini yapabildik. Yani request attık, Test suite ile çoklu request attık. Son olarak ise bir response’dan veri alıp başka bir fonksiyonun request’ine enjekte ettik.
Assertion konularına da değinmeyi istiyordum fakat yazı çok uzadığı için bunu başka bir yazının konusu yapalım.
Uzun bir yazı oldu, okuduğunuz için teşekkürler. Yapılan proje dosyası için bana Linkedin üzerinden ulaşabilirsiniz.
Mutlu günler dilerim :)