Arquillian Test Sistemi

Hakan Uygun (hakan.uygun@ozguryazilim.com.tr)

Merhaba Dünyalı! Biz Dostuz.

Arquillian Java sunucu uygulamaları bütünleştirme ve fonksiyon testleri için yepyeni bir yol sunuyor. Artık mock nesnelere, sunucu hayat döngüsü yönetim derdine son, doğrudan doğruya gerçek kod üzerinden test yazıyoruz.

Gerçek Test

Klasik test sistemlerinde test kodlarımızı, mock nesnelerle yazmak ve sunucu dışında çalıştırmak gerekiyordu. Arquillian ile kodlarımız doğrudan çalışması gereken sunucu içerisinde gerçek kodlarımızla çalışıyor. Dolayısı ile yapılan testler daha güvenilir oluyorlar.

IDE Dostu

Arquillian kullanmaya başlamak çok kolay. Hali hazırda JUnit ya da TestNG kullanıyorsanız daha da kolay. JUnit ya da TestNG için kullandığınız IDE desteği doğrudan Arquillian için de geçerli olacak.

Test Yazmak Çok Kolay

Yadığınız test kodları doğrudan uygulama kodlarını kullanabiliyor. Arquillian uygulamanız içinde bulunan kaynakları ( CDI Bean, EJB, Seam v.b. ) test kodunuza enjekte edecek. Mock objeler yazmakla uğraşmayacaksınız.

Classpath Kontrolü

Çoğu test sisteminde kullanacağınız sınıfları ve diğer kaynakları seçmek büyük problemdir. Test sayınız arttıkça bunları yönetmek kendi başına bir problem haline gelmeye başlar. Arquillian ile bu problem de kalkıyor. Sadece test senaryonuzun gerektirdiği sınıfları içeren mikro paketler hazırlıyoruz. Bu da test uygulamalarının daha hızlı yüklenmesini ve test ortamının izolasyonnu kolaylaştırıyor.

Arayüz Testi

Arquillian sadece uygulama içindeki iş kodlarını değil, uygulama arayüzünü test olabağı da sağlıyor. Arquillian Drone ile Selenium sunucusuna ulaşmak ve JSFUnit kodlarını çalıştırmak çok kolay.

Hata Ayıklama

Mevcut yöntemlerle, hata ayıklamak için uygulamanın tamamını sunucuya yüklüyor ve o şekilde hata ayıklama yapıyorduk. Arquillian test kodlarımızı doğrudan sunucu içinde çalıştırdığı için artık uygulamanın tamamını yüklemeye gerek kalmadan hata ayıklayabiliriz.

Çok irileşmiş bir kod üzerinde uygulamanının tamamının yüklenmesi için 15dk. dan fazla beklediğimi, bilirim. O arada da çoğu zaman ne yapacağımı unuturum :)

Sunucu Seçimi Size Kalmış

Hangi uygulama sunucuyu kullanıyorsunuz? Uygulamanız hangilerinde koşsun istiyorsunuz? Bu tamamen size kalmış.

Seçtiğiniz sunucu için halki hazırda desteklenmiyor mu? Hadi desteğini siz yazın?

Genişleyebilir Altyapı

Arquillian genişleyebilir bir altyapıya sahip. Kullandığınız fakat hali hazırda desteklenmeyen bir sistem mi var? Hadi kolları sıvayın ve siz yazmaya başlayın!

Hadi Kodlara Bakalım

Arquillian bir arquillian testinde bulunması gereken 3 şey :

Greeter Sınıfı


		 
package org.arquillian.example;

import java.io.PrintStream;

/**
 * A component for creating personal greetings.
 */
public class Greeter {
    public void greet(PrintStream to, String name) {
        to.println(createGreeting(name));
    }

    public String createGreeting(String name) {
        return "Hello, " + name + "!";
    }
}

Greeter Test Sınıfı - JUnit


		 
package org.arquillian.example;

import org.junit.Assert;
import org.junit.Test;

public class GreeterTest {
    @Test
    public void should_create_greeting() {
        Assert.fail("Not yet implemented");
    }
}

Greeter Test Sınıfı - Arquillian


		 
package org.arquillian.example;

import javax.inject.Inject;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Test;
import org.junit.Assert;
import org.junit.runner.RunWith;

@RunWith(Arquillian.class)
public class GreeterTest {

    @Deployment
    public static JavaArchive createDeployment() {
        return ShrinkWrap.create(JavaArchive.class)
            .addClass(Greeter.class)
            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
    }

    @Inject
    Greeter greeter;

    @Test
    public void should_create_greeting() {
        Assert.assertEquals("Hello, Earthling!",
            greeter.createGreeting("Earthling"));
        greeter.greet(System.out, "Earthling");
    }
}

Sorular?

Arquillian ile ilgi daha fazla bilgi için arquillian.org'u ziyaret edebilirsiniz!