Test Yönetimi Web Servis

Rest Assured İle Web Servis Testi

name-transparent

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:


    Screen Shot 2016-08-17 at 11.50.39Biz de auth().form(“[email protected]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.

Screen Shot 2016-08-17 at 11.25.57

Konsolda sadece konsola yazdırdığımız Body var. Peki Hemen yanındaki kırmız çarpılı JUnit tabında ne var?

Screen Shot 2016-08-17 at 11.42.18

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.

Screen Shot 2016-08-17 at 11.40.20

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

  • String json = memberRegisterRequestToJson(new MemberRegisterRequest()); yeterli olacaktır, haksız mıyım?

    memberRegisterRequest.json bu dosyaya ve bu dosyanın kullanıldığı methoda neden ihtiyaç var, anlayamadım?

    • İlkay Günel

      Merhaba.
      memberRegisterRequestToJson içine aldığı parametreyi key-value çiftleri halinde JSON formatında bir String’e çeviren metotdur. Sizin verdiğiniz String json = memberRegisterRequestToJson(new MemberRegisterRequest()); örneğinde parametre olarak boş bir MemberRegisterRequest nesnesi geçiriliyor. Bu durum ise bizim bir işimize yaramaz. İşimize yaraması için öncelikle kalıp JSON’dan yani memberRegisterRequest.json’dan okuma yapıp ilgili alanları set edip tekrar JSON’a çevirmemiz lazım. memberRegisterRequest.json dosyası bize kalıp elde etmek ve dolu bir nesne geçirmek için gereklidir.
      Umarım anlatabilmişimdir 🙂

      • Açıkçası anlayamadım..

        Ben şu kodu denedim:

        package biz.tugay.resttest;

        import com.google.gson.Gson;

        /* User: [email protected] Date: 2016/08/19 */
        public class TestClass {

        public static void main(String[] args) {
        String json = memberRegisterRequestToJson(new MemberRegisterRequest());
        System.out.println(json);
        }

        public static String memberRegisterRequestToJson(MemberRegisterRequest request) {
        Gson gson = new Gson();
        request.setName(“Mustafa”);
        request.setSurname(“İçmen”);
        request.setEmailAddress(“[email protected]”);
        request.setBirthDate(“1980-01-01”);
        request.setAddress(“İÜ Avcılar Kampüs”);
        request.setPassword(“12345”);
        request.setTelephoneNumber(“0-212-473-70-70”);

        return gson.toJson(request);
        }
        }

        ve aldığım sonuç:
        {“name”:”Mustafa”,”surname”:”İçmen”,”emailAddress”:”[email protected]”,”birthDate”:”1980-01-01″,”address”:”İÜ Avcılar Kampüs”,”password”:”12345″,”telephoneNumber”:”0-212-473-70-70″}

        Örnekteki

        MemberRegisterRequest memberRegisterRequest = memberRegisterRequestFromJson();

        kısmın bir işe yaradığından şüpheliyim..

        • İlkay Günel

          Tekrardan merhaba.
          Senin yorumundan hareketler yazı içerisinde güncellemeye gittim. Buradan da tekrar söyliyim, bizim örneğimizde yok ama POST edilecek JSON içinde değişmemesi gereken alanlar olabilir. Mesela senin verdiğin örnekte tüm alanları sen set ediyorsun. Eğer boş memberRegisterRequest nesnesi gönderirsen bu değişmemesi gereken alanları JSON’a dönüştürülecek nesne içine koyamamış olursun. Bu nedenle önce kalıp JSON’dan okuma yapıp değişmesi gereken alanları değiştirip tekrar JSON’a dönüştürüp öyle POST etmen gerekir.
          Yazıdaki eksiklikten dolayı özür dilerim.

          • Est, benim amacım yanlış yapmışsın demek değil, bilgi paylaştıkça çoğalır. İyi çalışmalar, paylaşımlar için teşekkürler.

          • İlkay Günel

            Ben de teşekkür ederim.
            Kolay gelsin.

  • Şunla ilgili de bir yorum yapayım:

    “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.”

    POST işlemi uygulamak, teknik olarak doğru değil. Bu URL ‘e bir Request atacağız, ve atacağımız Request ‘in methodu POST.

    İlgili izin veritabanında tanımlanması da şart değil, izinler kodun içinde de bulunabilir..

    • İlkay Günel

      Burada varsayım üzerinden gittik. Web servisleri de ben yazmıştım ve o web servisleri Spring Security ile korumaya almıştım. Bu durumda yetkilendirme kuralları DB içinde tanımlı ve bu yüzden yazıda ilgili durumu anlattım.