Rest Assured İle Web Servis Testi - 1
Geliştirilmiş olan bir yazılımın test edilmesi en az onun geliştirilmesi kadar mühim bir konudur. Java dünyasında da farklı ortamları test etmek için farklı araçlar yer almaktadır. Örneğin ekran testleri Selenium ile, mobil uygulama testleri Appium ile, yük testleri Apache JMeter ile ve web servis testleri de Rest Assured kütüphanesi ile yapılabiliyor. Tabi bunların yanında test deyince akla ilk gelen kütüphane olan JUnit’i de unutmamak lazım.
Ben de bu yazıda Rest Assured kütüphanesi ile basitçe bir web servis testi yapmayı anlatmaya çalışacağım. Rest Assured dediğim gibi yazılmış olan web servisleri test edebilmek amacı ile Java ile testler yazabildiğimiz bir kütüphane.
Web servis testi yapılacağı zaman çok büyük oranda testleri yazan kişiler web servisin yazıldığı ortam, kütüphane, dil vb. şeylerden habersiz olurlar çünkü bunları bilmesine hiç gerek yoktur. Sadece kendisine hangi URL’e hangi şekilde, tipte veri gönderileceğini anlatan bir döküman verilmesi yeterlidir. Bu yazıda elimizde döküman varmış gibi varsayımlarda bulunarak ilerleyeceğiz.
Bize verilen dökümanda web servis üzerinden bir üye kaydı yapılması için yetkilendirilmiş bir istekte bulunulması, bilgilerin JSON formatında gönderilmesi isteniyor ve gönderilebilecek bir örnek şöyle gösteriliyor:
Ben bu JSON’ı src/test/resources altında requests adındaki bir klasör içindeki memberRegisterRequest.json adındaki dosyaya koydum. Test kodu içinde bu dosyayı kullanacağız. Java kodu içinde yapacağımız testte kullanmak üzere bu JSON’ı baz alarak JSON’daki alanları içinde barındıran bir Class oluşturmamız gerekiyor. O sınıfımızın ismi MemberRegisterRequest sınıfıdır ve sınıf şöyledir:
MemberRegisterRequest.java
Bu sınıf sadece ilgili JSON’daki alanlara karşılık gelen değişkenleri ve get-set metotlarını taşımakla yükümlüdür.
Rest Assured kütüphanesi içinde yetkilendirme yapmak için de gerekli metotlar yer alıyor.
Biz localhost:8080/BlogProjectWithSpringMVC/webservice/memberRegister adresine bir POST işlemi uygulayacağız fakat bu URL’e erişim sadece web servis sahibinin veritabanında ilgili iznin tanımlandığı kullanıcıların erişimine açık. Bu nedenle önce bir authentication işlemi uygulamamız akabinde POST işlemi yapmamız lazım. POST işlemi uygularken de yukarıdaki JSON’ı baz alarak bir JSON göndermeliyiz.
Şimdi test işlemini gerçekleştiren Java kodumuza bakalım:
WebServisTest.java
Kod içerisinde 3 metot var. Birisi @Test ile işaretlenmiş test işlemini gerçekleştirecek metot, diğer ikisi ise az önce bahsettiğim memberRegisterRequst.json dosyasından okuma yapıp JSON formatında String veren ve aldığı parametreyi JSON formatında String’e çeviren metotlardır.
- memberRegisterTest içindeki RestAssured.baseURI=“http://localhost:8080/BlogProjectWithSpringMVC”; satırı web servis testinin yapılacağı ana domaini bildirir. Mesela analitics.google.com’daki google.com gibi.
- MemberRegisterRequest memberRegisterRequest = memberRegisterRequestFromJson(); satırı ile JSON formatındaki dosyadan okuma yapıp MemberRegisterRequest sınıfı tipinde bir nesne elde ediyoruz.
- String json = memberRegisterRequestToJson(memberRegisterRequest); satırı ile JSON formatında bir String elde ediyoruz.
Bu kod parçası ile ilgili path’e post isteğinde bulunuyoruz. Öncelikle given() ile başlıyoruz, akabinde yetkilendirme lazımsa auth().form() dememiz lazım. (Bu satır şimdilik kapalı çünkü önce yetkisiz erişim denemesi yapacağız, akabinde bu satırı açıp deneyeceğiz. ) Bana verilen dökümana göre erişimi kısıtlanmış bir yere erişilmeye çalışıldığında şöyle bir login formu geliyor:
Biz de auth().form(“ilkay.gunel@kod5.org“, “12345”,new FormAuthConfig(“/BlogProjectWithSpringMVC/j_spring_security_check”, “j_username”, “j_password”)) diyerek formdaki j_username ve j_password alanlarına verileri koyup /BlogProjectWithSpringMVC/j_spring_security_check adresine POST ediyoruz. Burada Rest Assured ilgili yetkilendirme mekanizmasını otomatik çözümleyip yapıyor. Akabinde POST edeceğimiz ne türde veri bekliyorsa bunu Content-Type’a söylüyoruz. Daha sonra body() metoduna POST edilecek JSON formatındaki String’i geçiriyoruz. .when().post(“/webservice/memberRegister”) ifadesi ile http://localhost:8080/BlogProjectWithSpringMVC/webservice/memberRegister adresine json’ı post et diyoruz. Son aşamada ise then() metodu POST işlemi akabindeki beklentilerimizi söylüyoruz. statusCode(200) ile HTTP 200 OK beklediğimi söylüyorum ve dönen Response’u bana extract etmesini söylüyorum.
- System.out.println(response.getBody().prettyPrint()); satırı ile dönen Response’da ne olduğunu görüyorum.
memberRegisterRequestFromJson() metodu JSON formatındaki bir dosyadan okuma yapıp verilen ilgili sınıf tipinde bir nesneyi bize döndürüyor. Burada MemberRegisterRequest tipinde bir nesne döndürecek. memberRegisterRequestToJson() metodu ise gelen parametreyi JSON formatındaki String’e çevirip döndürüyor. Metot içerisinde String’e çevrilip döndürülmeden önce ilgili parametreye ait alanlara bilgiler set ediliyor. JSON’dan ve JSON’a dönüşüm işlemleri Google’ın JSON işleme kütüphanesi olan Gson ile hallediliyor burada.
21 Ağustos 2016 GÜNCELLEME: Web servis testi yapılırken POST edilen JSON içindeki bazı değerlerin her daim sabit olması istenebilir ve bu sabit değerler kalıp JSON içinde tutulabilir. Bizim elimizdeki memberRegisterRequestFromJson metodu kalıp olarak verilmiş JSON’dan bir memberRegisterRequest nesnesi döndürürken bu sabit değerleri de kalıp JSON’dan okuyarak gelir. Biz memberRegisterRequestToJson metodu içinde değiştirmemiz gereken alanları değiştiriyoruz. Daha ileri durumlarda bizden POST edilen JSON içinde değişmeyecek alanlar gönderilmesi de istenebilir. Bu durumda kalıp JSON’dan okuma yapıp kalıp JSON’daki verileri tutan nesne elde edip o nesne üzerinde güncellemeler yaptıktan sonra JSON’a çevirip POST edebiliriz. Örneğin web servis ile gönderilen her kullanıcı için başlangıçta enabled diye bir kolona false olarak veri gönderilmek isteniyor olabilir. Bu durumda kalıp JSON içinde bu alan false olarak dururken bizim onu değiştirmememiz gerekir.
Şimdi WebServiceTest sınıfına sağ tıklayıp Rus As -> JUnit Test diyelim ve konsol çıktısına bakalım.
Konsolda sadece konsola yazdırdığımız Body var. Peki Hemen yanındaki kırmız çarpılı JUnit tabında ne var?
JUnit tabı ise siz 200 HTTP kodu bekliyordunuz ama 302 döndü diyor. Yani yetkisiz erişim denemesinde bulunulduğu için bağlantı açmaya izin vermedi. Şimdi WebServiceTest içindeki auth().form(…) satırındaki yorumu kaldıralım ve WebServiceTest sınıfını yeniden çalıştıralım.
Yetkilendirme işlemi başarı ile sonuçlanınca POST işlemini de yapabildi.
Bu yazıda anlatacaklarım bu kadar arkadaşlar. Bu konu ile ilgili 1 yazı daha yazıp orada da JSON Schema Validation ve Response’dan dönen alanların alınmasını anlatmaya çalışacağım.
Görüşene kadar sağlıcakla kalın.
Selam ve Sevgilerimle