0

JUnit 5: Yeni Nesil Java Test Çerçevesi

Share

JUnit, Java’da yazılım testlerini yapmayı kolaylaştıran ve standardize eden bir çerçevedir. JUnit 5, bu geleneği sürdürürken modern Java özelliklerini destekleyen ve gelişmiş test seçenekleri sunan bir güncellemedir. Bu makalede, JUnit 5’in temel özelliklerine derinlemesine bir bakış atacak ve JUnit 4 ile karşılaştıracağız.

JUnit 5 Nedir?

JUnit 5, Java 8 ve sonrası sürümleri hedefleyen bir test çerçevesidir. Modüler bir yapıya sahiptir ve JUnit 4’ten farklı bir mimariye dayanır. JUnit 5, JUnit Platform, JUnit Jupiter ve JUnit Vintage olmak üzere üç ana modülden oluşur. Bu modüller, JUnit 5’in esnekliğini ve uyumluluğunu sağlar.

JUnit 5’in Temel Özellikleri:

  1. JUnit Jupiter: JUnit 5’in yeni test motorudur. Bu modül, Java 8’den itibaren gelen özellikleri kullanarak test yazmayı kolaylaştırır. Yeni annotasyonlar ve genişletilebilir mimari sayesinde JUnit Jupiter, testlerinizi esnek ve okunabilir hale getirir.
  2. JUnit Platform: JUnit 5 testlerinin çalıştırılmasını, raporlanmasını ve entegrasyonunu sağlayan temel altyapıyı sağlar. Bu, farklı test çerçeveleriyle uyumlu olmayı ve çeşitli entegrasyonlar için destek sunmayı amaçlar.
  3. JUnit Vintage: Bu modül, JUnit 3 ve JUnit 4 testlerinin JUnit 5 platformunda çalışmasını sağlar. Mevcut testlerinizi yükseltirken uyumluluk ve geçiş sürekliliği sağlar.

En temel ve gerekli olan modül JUnit Platform. Bunun görevi testlerin JVM’de çalışmasını sağlamak için bir taban oluşturmak. JUnit Jupiter ise programlama ve extension modelini projeye ekler. Kullanılan annotation’lar vs. bu modüle ait. Bu iki modül ile projenizde JUnit5 ile çalışabilirsiniz. Diğer iki modül(Vintage ve Params) opsiyoneldir fakat önemlidir.

JUnit Vintage modülü JUnit3 ve JUnit4 için destek sağlıyor. Böylece projenizde aynı anda JUnit3, JUnit4 ve JUnit5 testlerinizi bir arada tutabilir hale geliyorsunuz. JUnit Params modülü ise size parametreler kullanarak test yazma olanağı sağlıyor.

Uzun zamandır yeni versiyonu beklenen JUnit 4 kullanıcılarının karşılaşacağı değişikliklere değinecek olursak.En temel değişiklik JUnit5’in modüler bir yapıya bürünmüş olması. JUnit 4 tek .jar dosyasından oluşan bir kütüphane ve siz bağımlılığını projenize eklediğinize kullanmasanız bile kütüphanenin tüm parçaları bir paket olarak geliyor. JUnit5’te ise bu durum değişti. JUnit5’te her bir çalışma birimi farklı modüller ile dizayn edildi.

Bu modüller dependency olarak bakacak olursak. Tüm yapı eskiden tek bir dependency olarak eklenirken şimdi tüm modüller bağımsız olarak ekleniyor.

JUnit 4 Maven Bağımlılığı:

JUnit 4’ü Maven projesine eklemek için genellikle aşağıdaki bağımlılığı kullanırsınız:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

Bu bağımlılık, JUnit 4.13.2 sürümünü test kapsamında (test scope) ekler.

JUnit 5 Maven Bağımlılıkları:

JUnit 5, birkaç farklı modülden oluşur. Bu nedenle, JUnit 5’e ilişkin Maven bağımlılıklarını eklerken, genellikle farklı modülleri belirtmeniz gerekir.

JUnit 5 bağımlılıklarını projenize eklediğinizde, JUnit 5’i kullanarak testlerinizi yazabilir ve çalıştırabilirsiniz.

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>1.8.2</version>
    <scope>test</scope>
</dependency>

Yukarıdaki Maven bağımlılıkları, JUnit 4 ve JUnit 5’in en son sürümlerini içermektedir. Güncel sürümleri tercih etmek, projenizin güvenliğini ve performansını artırabilir. Bağımlılıkları güncellemek için projenizin gereksinimlerine uygun olan en son sürümleri kontrol etmek önemlidir.

JUnit5 ile birlikte annotation’larda isim değişikliği oldu. bu değişiklikler test kodu yazımında en dikkat çekici kısım olarak göze çarpıyor.


JUnit 5, @DisplayName annotation’ı aracılığıyla testlerimizin daha anlamlı ve okunabilir olmasını sağlar. Artık testlerimizin başarısız olması durumunda daha açıklayıcı geri bildirimler alabiliriz. JUnit 4’te, genellikle metod isimlerini anlamlı bir şekilde belirterek bu açıklamaları sağlamaya çalışıyorduk. Ancak JUnit 5, @DisplayName annotation’ı sayesinde bu zorluğu ortadan kaldırır ve istediğimiz metinleri yazarak testlerimizi daha açıklayıcı hale getirmemize olanak tanır. Bu annotation’ı sınıf seviyesinde veya metod seviyesinde kullanarak testlerimize anlamlı bilgiler ekleyebiliriz.

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

@DisplayName(“Calculator Test”)
public class CalculatorTest {

@Test
@DisplayName("Addition Test")
void testAddition() {
    assertEquals(4, Calculator.add(2, 2), "2 + 2 should equal 4");
}

@Test
@DisplayName("Subtraction Test")
void testSubtraction() {
    assertEquals(2, Calculator.subtract(4, 2), "4 - 2 should equal 2");
}

}

Yukarıdaki örnek kodda, @DisplayName annotation’ı hem sınıf seviyesinde hem de her test metodu için ayrı ayrı kullanılmıştır.

  • @DisplayName("Calculator Test") annotation’ı, sınıfın adını belirler. Bu durumda, test sınıfının adı “Calculator Test” olarak gösterilir.
  • @DisplayName("Addition Test") annotation’ı, testAddition() metodu için açıklayıcı bir ad sağlar. Bu test metodu, toplama işlemini kontrol eder.
  • @DisplayName("Subtraction Test") annotation’ı, testSubtraction() metodu için açıklayıcı bir ad sağlar. Bu test metodu, çıkarma işlemini kontrol eder.

@Nested annotation’ı, JUnit 5’te iç içe (nested) test sınıflarını tanımlamak için kullanılır. Bu annotation sayesinde, bir test sınıfı içindeki mantıksal gruplamaları daha iyi yapabiliriz.

import org.junit.jupiter.api.*;

@DisplayName(“MathUtils Test”)
public class MathUtilsTest {

private MathUtils mathUtils;

@BeforeEach
void setUp() {
    mathUtils = new MathUtils();
}

@Nested
@DisplayName("Addition Tests")
class AdditionTests {

    @Test
    @DisplayName("Adding two positive numbers")
    void testAddPositiveNumbers() {
        assertEquals(4, mathUtils.add(2, 2), "2 + 2 should equal 4");
    }

    @Test
    @DisplayName("Adding a positive and a negative number")
    void testAddPositiveAndNegativeNumbers() {
        assertEquals(0, mathUtils.add(2, -2), "2 + (-2) should equal 0");
    }
}

@Nested
@DisplayName("Subtraction Tests")
class SubtractionTests {

    @Test
    @DisplayName("Subtracting two positive numbers")
    void testSubtractPositiveNumbers() {
        assertEquals(2, mathUtils.subtract(4, 2), "4 - 2 should equal 2");
    }

    @Test
    @DisplayName("Subtracting a negative number from a positive number")
    void testSubtractNegativeFromPositive() {
        assertEquals(4, mathUtils.subtract(6, -2), "6 - (-2) should equal 4");
    }
}

}

ukarıdaki kodda, @Nested annotation’ı kullanılarak AdditionTests ve SubtractionTests adlı iç içe geçmiş test sınıfları oluşturulmuştur.

  • @Nested annotation’ı, iç içe geçmiş test sınıflarını tanımlamak için kullanılır.
  • Her bir iç içe geçmiş sınıf, bir grup testi temsil eder. Bu gruplandırma, testlerin daha organize olmasını ve anlaşılmasını sağlar.
  • @DisplayName annotation’ı, sınıf ve metot isimlerini açıklayıcı hale getirir ve test raporlarının okunabilirliğini artırır.

Bu yapı, özellikle büyük test sınıfları için kodun daha düzenli ve anlaşılır olmasını sağlar. Ayrıca, her bir grup testi için ayrı ayrı hazırlık ve temizlik işlemleri yapılabilir. Bu da testlerin bağımsızlığını artırır ve daha güvenilir sonuçlar elde etmemizi sağlar.

JUnit 5, Java geliştiricilerine daha esnek, güçlü ve modern bir test çözümü sunar. Yeni annotasyonlar, geliştirilmiş assert metotları ve modüler mimari, test yazmayı daha keyifli ve etkili hale getirir. Mevcut JUnit 4 projeleri, JUnit 5’e geçişi düşünmelidir çünkü JUnit 5, gelecek için Java test otomasyonunun standartlarını belirleyen bir çerçeve olmaya adaydır.

JUnit 5 hakkında daha fazla bilgi için JUnit 5 resmi belgelerine göz atabilirsiniz.