2. Nedir?
• Java programlama dili için geliştirilmiş bir test
framework
• Erich Gamma ve Kent Beck tarafından geliştirilmiştir.
• Birden fazla IDE ve derlemearacı için desteği vardır.
(Eclipse, Netbeans, IntelliJ, maven, ant vb.)
² Erich Gamma; Design Patterns kitabını yazarı, Junit, Eclipse JDT ve
Microsoft Visual Studio proje lideri
² Kent Beck; Extreme Programming’nin yaratıcısı ve Agile Manifesto’nun
yazarlarından biri
3. Neye Yarar?
• Test kod tabanının standart olması
• Test ve test suite’leri oluşturulması
• Basit anlamda birim test yapabilmenizi sağlarken, belirli
framework entegrasyonları ile karmaşık testleri de
kolaylaştırır.
• Örneğin junit.framework.TestCase ile unit test
yazabilirken,
• @Runwith(SpringJUnit4ClassRunner.class) kullanarak
Spring framework ile entegre çalıştırılması sağlanabilir
4. Birim Test
• junit.framework.TestCase sınıfını kalıtan bir sınıf
içerisinde birim test yazılabilr.
• Birim testlerin koşabilmesi için test metodlarının “test”
anahtar sözcüğü ile başlaması gereklidir.
• setUp() metodu ile test öncesi ayarlar ve nesne
oluşturma işlemleri yapılabilir.
• tearDown() metodu ile setUp metodundaki ayarları
sıfırlayabilirsiniz.
• setUp her test metodu öncesinde, tearDown ise
sonrasında birer kez çalıştırılır.
5. Özellikler
• Test metodları public olmalıdır
• Metodlar void dönmelidir
• Herhangi bir parametre almamalıdır
public void testHede()
• Her test metodu tek bir akış veya birim testi yapmalıdır
• Testlerdeki çıktılar assert* ifadeleri ile kontrol edilmeli ve
bu kontrol sonrası test akışı ilerletilmelidir.
• Eğer hata olması durumu söz konusuysa fail()
kullanılmalı ve test başarısız sonuçlandırılmalıdır
6. Assert
• assertEquals
• assertNotNull
• assertSame
• assertNotSame
• assertTrue
• assertFalse
• assertThat
v assertEquals .equals() ile kontrol ederken assertSame == ile kontrol
yapar.
7. package com.turkcell.singlehub.test.unit;
Örnek
import org.apache.log4j.Logger;
import junit.framework.TestCase;
import com.turkcell.singlehub.util.MathUtils;
public class MathUtilsTest extends TestCase{
private Logger logger = Logger.getLogger(MathUtilsTest.class);
@Override
public void setUp(){
logger.debug("run setUp");
}
public void testCut(){
double d = MathUtils.cut(1.1234, MathUtils.SCALE_TWO);
String result = String.valueOf(d);
assertEquals(4, result.length());
}
public void testCut2(){
double d = MathUtils.cut(1.1234, MathUtils.SCALE_TWO);
String result = String.valueOf(d);
assertFalse(result.length() == 5);
}
public void tearDown(){
logger.debug("run tearDown");
}
8. Entegrasyon Testi
• Belirli bir akışın veya entegrasyon noktasına ait servisin test
edilmesidir.
• Junit, Spring, Hibernate vb. frameworkler ile birlikte
çalışabilmektedir.
• Spring context’ini junit ile yüklenmesini sağlayabilir ve
herhangi bir uygulama sunucusuna yükleme yapmadan
uygulamayı çalıştırabilirsiniz.
• Daha çok annotasyon ile yönetim tercih edilir.
• Method başlangıcında @Test annotasyonu varsa test
otomatik olarak çalıştırılır.
• Test öncesinde herhangi bir ayar gerekiyorsa @Before,
sonrasında ise @After annotasyonu olan metodlar Junit
tarafından otomatik olarak çalıştırılır.
9. Örnek
• @RunWith kullanılarak hangi Junit çalıştırıcı ile testin çalıştırılacağı belirtilir.
Burada Spring Framework’ünün Junit için geliştirdiği plugin kullanılmaktadır.
• @ContextConfiguration ile Spring Context’inin hangi xml dosyasından
yükleneceği gösterilmektedir.
• Test kodu için farklı context yüklenebileceği için kod tabanındaki context de
kullanılabilir. Ancak gerçek ortam kodunda sorun oluşmaması için farklı
konfigurasyon dosyası tercih edilmelidir.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:context-Test.xml"})
public abstract class AbstractTest {
}
10. Örnek
public class InvoiceServiceTest extends AbstractTest {
@Autowired
private InvoiceService invoiceService;
@Test
public void hasUnpaidInvoices() {
ServiceResult<Boolean> serviceResult = invoiceService
.hasUnpaidInvoice(user);
Assert.assertNotNull(serviceResult.getValue());
Assert.assertTrue(serviceResult.getValue());
}
}
11. Test Suite
• Test suite kullanarak istediğiniz testlerin birlikte tek bir
sınıf üzerinden koşmasını sağlayabilirsiniz.
• Bu durum belirli akışları tek bir akışta çalıştırabilmenizi
ve test senaryoları oluşturabilmesini sağlar
Örnek
@RunWith(Suite.class)
@Suite.SuiteClasses({ InvoiceServiceTest.class, SummaryServiceTest.class,
LimitManagementUtil.class, InvoiceServiceUtilTest.class })
public final class ProjectRunSuite {
}