You are on page 1of 26

TDD

Test Driven Development


Melih Sakarya

www.sahabt.com
melih.sakarya@sahabt.com
https://github.com/melihsakarya

www.sahabt.com 1
Neden Test
l  Kaliteli bir yazılım çıktısı
l  Uygulama gereksinimleri karşılıyor mu ?
l  Doğru çıktıyı üretiyor mu ?
l  Beklenen ortamlarda çalışıyor mu ?
l  Günvenli mi ?
l  Yoğun yük altında beklentileri karşılıyor mu ?
l  Kaynak ihtaçları nedir ?

www.sahabt.com 2
Test Tipleri
l  Birim testleri
l  Entegrasyon testleri
l  Fonksiyonel testler
l  Kabul testleri
l  Yük testleri
l  Performans testleri
l  Güvenlik testleri
l  Platform ve uyumluluk testleri
l  Kullanılabilirlik testleri

www.sahabt.com 3
TDD
Test Driven Development
l  Test yönelimli programlama
l  Önce test sonra kod
l  Gereksinimlerle testler belirlenir
l  Testler ile uygulama ortaya çıkar
l  Hatalar geliştirme anında ortaya çıkar

www.sahabt.com 4
Unit Test – Birim Testi
l  Bir birimi test etmeyi sağlar
l  Tek birim testinin farklı fonksiyonları test etmesi beklemez
l  Refactoring sürecindeki hataları minimize eder

www.sahabt.com 5
JUnit
l  Java platformunda birim testleri için kullanılır.
l  Hata durumunda geliştirme ortamında gözlemlenebilir.
l  Test metodları @Test notasyonu ile belirlenir.

public class OrnekTest {

@Test
public void ornekTest(){
fail("hata olustu");
}
}

www.sahabt.com 6
Assert Sınıfı
l  Test akışında beklenen durumu sorgulamak için kullanılır.
l  Beklenen durum karşılanmazsa hata verir ve testi sona erdirir.

assertEquals(5, mat.topla(2,3));
assertTrue(true);
assertFalse(false);
assertNotEquals("aa", "bb");

www.sahabt.com 7
Assert Kullanımı
public class OrnekTest {

@Test
public void ornekTest(){
Matematik mat = new Matematik();
assertEquals(5, mat.topla(2,3));
}
}

www.sahabt.com 8
JUnit Yaşam Döngüsü
l  Junit çalışma anında sınıf öncesi veya sonrası yapılması gereken
işlemler tanımlanabilir.
l  Annotation tanımları ile yapılır.
l  @Test
l  @BeforeClass
l  @AfterClass
l  @Before
l  @After

www.sahabt.com 9
JUnit Yaşam Döngüsü
@BeforeClass
public static void sinifOncesi(){
}

@Before
Public void metodOncesi(){
}

@After
public void metodSonrasi(){
}

@AfterClass
Public static void sinifSonrasi(){
} www.sahabt.com 10
JUnit Yaşam Döngüsü
l  Testlerin birbirlerine bağımlığı yoktur.
l  Testler entegrasyonlardan yalıtılmış olmalıdır.

www.sahabt.com 11
Parametreler
l  Testler farklı değerler ile test edilmek istenebilir.
l  Bu durumda her data için yeni bir karşılaştırma yapmak yerine
parametrik hale getirilebilir.

www.sahabt.com 12
Paremetreler
@RunWith(Parameterized.class)
public class OrnekTest {

@Parameters
public static String[][] getParameters(){
String[][] parametreler = {
{"Melih", "Sakarya"},
{"Melih", "Sakarya"}
};
return parametreler;
}

...
}
www.sahabt.com 13
Paremetreler
@RunWith(JUnitParamsRunner.class)
public class DataDrivenTest {

UserService userService;

@Before
public void init(){
this.userService = new UserService();
userService.emailService = Mockito.mock(EmailService.class);
}

@Test
@Parameters({"Melih, Sakarya, melih.sakarya@gmail.com”})
public void dataDrivenTest(String name, String lastname, String email){
userService.register(name, lastname, email);
}
}

www.sahabt.com 14
Test Suite
l  Testleri bir grup olarak çalıştırmak için kullanılır.
l  Sıralama dikkate alınır.
l  Proje içerisinde Suite ve testler tekrar çalıştırılır.

@RunWith(Suite.class)
@SuiteClasses({
HavaleTest.class,
BildirimTest.class
})
public class OrnekTestSuite {

}
www.sahabt.com 15
Mock Objeler
l  Taklit nesne anlamına gelir.
l  Nesnenin gerçek değil sahte bir kopyasını oluşturur.
l  Bağıl nesnelerin davranışlarına ihtiyaç duymaz.
l  Nesne davranışları kontrol edilebilir.

www.sahabt.com 16
Mock Objeler
Hesap hesap;
Bildirim bildirim;

@Before
public void baslangic(){
hesap = new Hesap();
bildirim = Mockito.mock(Bildirim.class);
hesap.setBildirim(bildirim);
}

www.sahabt.com 17
Mock Objeler
@RunWith(MockitoJUnitRunner.class)

@InjectMocks
Hesap hesap;

@Mock
Bildirim bildirim;

@Before
public void baslangic(){

www.sahabt.com 18
Mock Objeler - Kontroller
l  Mock objeler içerisinde çağırım kontrolleri yapılabilir.

verify(bildirim).bildirimYap(anyString());
verify(bildirim).bildirimYap(startsWith("para"));
verify(bildirim, times(1)).bildirimYap(anyString());
verify(bildirim, never()).ornekMetod();
verify(bildirim).ornekMetod();

www.sahabt.com 19
Mock Objeler –Kontroller
l  Mock nesneler gerçek olmadığından metod davranışları default
değerlerini döner.
l  Akışın herhangi bir yerinde istediğimiz durumu gerçekleştirmek
isteyebiliriz.

when(bildirim.bildirimYap(anyString())).thenReturn(true);
when(bildirim.ornekMetod()).thenReturn("havale");

www.sahabt.com 20
Spy Tanımlar
@InjectMocks
UserService userService;
@Spy
EmailService mailService;

@Test
public void userRegisterTest(){
userService.register("Melih", "Sakarya",
"melih.sakarya@gmail.com");
verify(mailService, times(1)).sendEmail(anyString());
}

www.sahabt.com 21
Entegrasyon Testleri
l  Test birim değil alt bileşenlerle birlikte tasarlanır.
l  Testleri uçtan uca diğer bileşenlerin davranışları ile test eder.
l  Birim testlere göre doğrulama daha yüksektir.
l  Birim testlere göre çalışması daha uzun ve masraflıdır.
l  Sürekli çalıştırılması geliştirme sürecinde zaman kaybına neden
olabilir.

www.sahabt.com 22
Test Yoğunluğu

Arayüz
Testleri

Entegrasyon Testleri

Birim Testleri

www.sahabt.com 23
Entegrasyon Testleri
l  EJB ve Spring gibi container ihtiyacı duyan katmanlar için test
ihtiyacı olabilir.
l  Bu durumda ilgili container üzerinde test yapılmalıdır.
l  Container’ ları oluşturan ve sarmallayan entegrasyon test
kütüphaneleri kullanılmalıdır.
l  Arquillian ve Spring Integration Test kütüphaneleri kullanılır.

www.sahabt.com 24
Arquillian
l  JBoss ekibi tarafından yayınlanan açık kaynak entegrasyon test
kütüphanesidir.
l  JPA, EJB, CDI gibi katmanların testleri için ilgili container ayağa
kaldırılır.
l  Test süreçleri birim testlerine göre daha yavaştır.

www.sahabt.com 25
Son

Sorular ????

melih.sakarya@sahabt.com

www.sahabt.com 26

You might also like