Professional Documents
Culture Documents
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.
@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