Test Yazarken Karşılaştığım Sorunlar ve Çözümleri

Kerem Hallaç
2 min readMar 17, 2023

--

Yazılım geliştirme süreçlerimizin olmazsa olmazlarından TEST

Test yazarken takıldığımız birkaç noktanın çözümünü aramada çok vakit kaybedebiliyoruz. Bunlardan karşılaştığım üç case ve çözümlerini örneklerle birlikte bu yazımda paylaşmak istiyorum. Yazının amacı benzer sorunu yaşayan birisinin anında çözüm sağlayabiliyor olmasıdır. Case ve çözümlerini Java’da örneklendirdim.

Hazırsak başlayalım 🤘

Empty Constructor — Sonar Coverage

Bazen sınıflarımızın constructorlarını boş olarak implement etmek isteyebiliriz. (örnek olarak utils classlarımız) Fakat bu Sonar’ın pek hoşuna gitmeyecektir ve test metriklerini olumsuz etkileyecektir. Sonar bizden boş constructor’ı da cover etmemizi ister.

Boş fonksiyonun neyini test edelim? 😡

Gibi haklı bir soru gelebilir 🙂 ama diyelim test etmemiz gerekti. Aşağıdaki kod bloğu bu sorunu çözecektir.

@Test
public void test_Constructor_Is_Private() throws NoSuchMethodException {
Constructor<Foo> constructor = Foo.class.getDeclaredConstructor();
assertTrue(Modifier.isPrivate(constructor.getModifiers()));
constructor.setAccessible(true);
constructor.newInstance();
}

Lombok Annotations — Exclude From Metrics

Lombok içerisinde birçok annotation barındırır. Bunlardan en çok kullandığım @Data’da şöyle bir case ile karşılaştım.

Data annotationı eklendiği class’ın içerisinde bulunan tüm @Getter, @Setter, @EqualsAndHashCode ve @ToString fonksiyonlarını oluşturur.

Bu annotation’a sonar ⚠️“Partially covered by test (x of y conditions)”⚠️ şeklinde bir uyarı verecektir. Cover edemediğimiz bu x tane condition bizim test coverage oranımızı düşürür.

Peki bunu nasıl çözeriz?

  • Öncelikle projemize lombok.config dosyasını ekliyoruz ve içerisine aşağıdaki kod bloğunu yazıyoruz. Dosya, projemizdeki temel Application sınıfıyla aynı seviyede konumlanabilir.
config.stopBubbling = true
lombok.addLombokGeneratedAnnotation = true
  • Daha sonra @Data annotation’ın kullanıldığı ve exclude etmek istediğimiz class’ların üzerine aşağıdaki satır eklenebilir. Lombok bu annotation’ı gördüğü class için uncoveraged condition kontrolünü yapmayacaktır.
@lombok.Generated
  • Son olarak uygulamamızda jacoco-maven-plugin’in olması gerekiyor. Eğer yok ise pom.xml içerisine ekleyerek son adımı tamamlayabiliriz.

Test Functions Without Assertions

Bazen test fonksiyonlarımız içerisinde sadece process’i gerçekleştirmek isteyebiliriz. Herhangi bir assertion kontrolü yapmadan test senaryomuzu işletmek istediğimizde karşımıza şöyle bir durum çıkacaktır.

⚠️“Add at least one assertion to this test case”⚠️

Sonar bu fonksiyonlar için bize blocker isssue oluşturur. Projemiz sırf bu yüzden failed durumda görülebilir, çünkü issue’larımız var. Bunlarla ilgili ise aşağıdaki çözümü uygulayabiliriz.

  • Assertion bulunmayan her test fonksiyonumuzun @Test annotation’ını şu şekilde değiştirmemiz gerekir.
@Test(expected = Test.None.class /* no exception expected */)

Sonar bunu gördüğü fonksiyonlar için bize herhangi bir issue oluşturmayacaktır.

Happyy Testtiiingg 🙌

--

--