Unit (Birim) Test Nedir? Neden Önemlidir?

Gizem Demir
Innova-tech
Published in
5 min readJan 4, 2024

Test süreçleri yazılım geliştirme yaşam döngüsünün ayrılmaz bir parçasıdır. Yazılım test seviyeleri, bir ürünün farklı bileşenlerinin ve fonksiyonlarının test edilmesinde kullanılan farklı yaklaşımları ifade eder. 4 temel test seviyesi bulunmaktadır. Her bir test seviyesi, yazılımın farklı özelliklerini, işlevlerini ve performansını test etmek için özelleştirilmiş bir perspektif sunar.

Bu yazı, Unit (Birim) Testin önemini, sağladığı avantajları ve yazılım geliştirme sürecine olan etkisini anlamak için bir rehber olacak. Unit testlerin yazılım kalitesi, hata yakalanma oranı, sürdürülebilirlik gibi pek çok konuya nasıl katkı sağladığını anlayacak ve yazılım geliştirme süreçlerinde Unit Testin ayrılmaz rolünü göreceksiniz.

Unit (Birim) Test Nedir?

Unit test, yazılım geliştirme sürecinde kullanılan testlerden biridir. Bu testler yazılımın en küçük işlevsel birimlerini (fonksiyonlar, sınıflar, metotlar vb.) test ederek her bir birimin beklenen şekilde çalışıp çalışmadığını kontrol etmek amacıyla yapılır. Her birim için yazılan testler birbirinden bağımsız çalışır ve her birim üzerinde beklenen davranışı doğrulamayı hedefler. Unit testler, kodun her bir parçasının ayrı ayrı ve doğru bir şekilde çalıştığını garantileyerek yazılımın kalitesini artırır.

Unit Test Yazmanın Avantajları Nelerdir?

Yazılımın her bir parçasının geliştirme aşamasında ayrı ayrı test edilmesi bize ne gibi faydalar sağlar inceleyelim.

Hataların Erken Yakalanması Sağlar. Birim testleri, geliştirme döngüsünün başlarında hataların yakalanmasına yardımcı olur. Geliştiriciler, çeşitli senaryoları kapsayan birim testleri yazarak, kodlarındaki hataları diğer bileşenlerle entegre edilmeden önce yakalayabilirler. Bu, daha hızlı bir geri bildirim döngüsüne yol açar ve daha sonraki geliştirme sürecinde zaman ve emekten tasarruf sağlar.

Geliştirilmiş Kod Kalitesi Sağlar. Birim testleri yazmak, geliştiricileri daha modüler ve bakımı kolay kod yazmaya zorlar. Kolayca test edilebilir kod yazmaları gerekir; bu da genellikle daha az bağımlılığa sahip daha iyi tasarlanmış kodlarla sonuçlanır.

Daha Önce Yazılan Kodların Yeniden Kolaylıkla Düzenlenmesini Sağlar. Geliştiriciler, mevcut işlevselliği bozmadığından emin olmak için değişiklik yaptıktan sonra testleri çalıştırabilirler. Bu onlara yeni hataların ortaya çıkmasından endişe etmeden değişiklik yapma konusunda güven verir.

Hata Düzeltme Maliyetini Azaltır. Hataları geliştirme sürecinin başında düzeltmek, üretime girdikten sonra düzeltmekten çok daha ucuzdur. Birim testleri, bu hataların çoğunu üretime geçmeden önce tespit ederek şirketin zamandan ve paradan tasarruf etmesini sağlar.

Hataların Daha Hızlı Tespit Edilmesini Sağlar. Bir test başarısız olduğunda sorunun nerede olduğuna dair net bir gösterge sağlar. Geliştiriciler, sorunu yeniden oluşturmak ve hata ayıklamak için saatler, hatta günler harcamak yerine, sorunu hızlı bir şekilde izole edip düzeltebilir.

Dokümantasyon Sağlar. Birim testleri kod için dokümantasyon görevi görür. Geliştiriciler testlere bakarak kodun nasıl davranması gerektiğini ve ne yapması gerektiğini hızlı bir şekilde anlayabilir. Özellikle geliştiricinin değiştiği durumlarda dokümantasyon oldukça faydalıdır.

Kaliteli Ürünler Ortaya Çıkarmak İçin Birim Test Olmazsa Olmazdır !!

Peki Nasıl Yazılır Bu Birim Testler?

Birim testi yazma işlemi 3 temel bölümde gerçekleştirilir. Arrange, Act, Assert (Düzenle, İşlem Yap, Doğrula) adımları, birim testlerinin temel yapı taşlarıdır ve test senaryolarının yapısını oluştururlar.

  • Arrange (Düzenle): Test senaryosunun gerektirdiği önceden koşulları hazırlama aşamasıdır. Testin geçerli bir durumda çalışabilmesi için gerekli olan nesnelerin oluşturulması, ayarlanması veya yapılandırılması burada gerçekleşir. Örnek vermek gerekirse, test edilecek nesnelerin oluşturulması, gereken parametrelerin hazırlanması bu aşamada yapılır.
  • Act (İşlem Yap): Test senaryosunun temel işlemini gerçekleştirme aşamasıdır. Burada, belirli bir işlevin çağrılması, bir metodun çalıştırılması veya bir davranışın gerçekleştirilmesi gibi test edilen özelliğin tetiklenmesi yer alır.
  • Assert (Doğrula): Testin beklenen sonuçlarını kontrol etme ve doğrulama aşamasıdır. Bu aşamada, testin işlemi sonucunda elde edilen değerler, dönüşler veya durumlar, beklenen sonuçlarla karşılaştırılır. Eğer beklenen sonuçlarla uyumsuzluk varsa, test başarısız kabul edilir ve bir hata bildirilir.

Şimdi basit bir örnekle bu yapıların kullanımına bakalım. Aşağıdaki kod blogunda kullanıcı adı ve şifre ile giriş yapılan bir sayfaya ait login işlemi görülmektedir.

public class LoginService {
// Örnek bir kullanıcı adı ve şifre
private static final String VALID_USERNAME = "exampleUser";
private static final String VALID_PASSWORD = "examplePassword";

public boolean login(String username, String password) {
// Gerçek bir kullanıcı adı ve şifre kontrolü yerine basit bir kontrol
return VALID_USERNAME.equals(username) && VALID_PASSWORD.equals(password);
}
}

Şimdi bu login işlemini sağlayan LoginService sınıfı için TestNG ile yazılmış birim test örneklerini inceleyelim.

import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class LoginTest {
private LoginService loginService;

@BeforeClass
public void setUp() {
// Arrange: Test için gerekli ortamı hazırla
loginService = new LoginService();
}

@Test
public void testLoginWithValidCredentials() {
// Arrange: Parametreleri Ayarla
String username = "exampleUser";
String password = "examplePassword";

// Act: Login işlemini gerçekleştir
boolean result = loginService.login(username, password);

// Assert: Beklenen sonuçla gerçek sonucu karşılaştır
Assert.assertTrue(result, "Login with valid credentials should succeed");
}

@Test
public void testLoginWithInvalidCredentials() {
// Arrange : Parametreleri Ayarla
String username = "invalidUser";
String password = "invalidPassword";

// Act: Login işlemini gerçekleştir
boolean result = loginService.login(username, password);

// Assert: Beklenen sonuçla gerçek sonucu karşılaştır
Assert.assertFalse(result, "Login with invalid credentials should fail");
}
}

Burada geçerli kullanıcı adı şifre ile login işleminin test edildiği testLoginWithValidCredentials() ve geçersiz kullanıcı adı şifre ile login işleminin test edildiği testLoginWithInvalidCredentials() olmak üzere 2 adet test sınıfı oluşturulmuştur.

Bu fonksiyonların içinde Arrange, Act ve Assert yapılarını çok daha iyi görebiliriz. Arrange aşamasında username ve password değişkenlerinin tanımladığını, Act aşamasında testi yapılacak servisin çağırıldığını, son olarak Assert aşamasında testin gerçekleştiğini ve sonuçların belirlendiğini görüyoruz.

En Çok Kullanılan Birim Test Araçları Nelerdir?

Geliştirme yapılan yazılım diline göre değişkenlik gösteren birim test Tool’ları aşağıda resimde verilmiştir.

Bu Tool’lar arasında en çok kullanılanlara göz atalım.

JUnit

JUnit, Java’da açık kaynaklı bir birim test aracıdır. Testleri çalıştırmak için sınıf nesnelerinin oluşturulmasını veya ana yöntemin tanımlanmasını gerektirmez. Test sonuçlarını değerlendirmek için bir iddia kütüphanesi vardır. JUnit’teki açıklamalar test yöntemlerini yürütmek için kullanılır. JUnit, birden fazla test senaryosuna sahip otomasyon paketlerini çalıştırmak için yaygın olarak kullanılır.

NUnit

.NET tabanlı açık kaynaklı bir birim test çerçevesi olan NUnit, özelliklerinin çoğunu doğrudan JUnit’ten devralır. JUnit gibi NUnit de Test Odaklı Geliştirme (TDD) için güçlü bir destek sunar ve benzer işlevleri paylaşır. NUnit, konsol çalıştırıcısı aracılığıyla otomatik testlerin gruplar halinde yürütülmesini sağlar.

TestNG

Java için popüler bir diğer framework olan TestNG, Yeni Nesil Test’in kısaltması olup, birim test senaryolarının test edilmesi ve yürütülmesi üzerinde kapsamlı kontrol sunan güçlü bir çerçevedir. Hem JUnit hem de NUnit’in özelliklerini içerir ve birim, fonksiyonel ve entegrasyon testi gibi çeşitli test kategorileri için destek sağlar. TestNG, kullanıcı dostu işlevleri nedeniyle en güçlü birim test araçlarından biri olarak öne çıkıyor.

Mocha:

JavaScript için popüler bir test framework’üdür. Node.js ve tarayıcı ortamlarında kullanılabilir. Asenkron testler ve assertionlar için destek sunar.

Birim testleri, yazılım geliştirme sürecinin ayrılmaz bir parçasıdır ve bir yazılımın sağlamlığını, doğruluğunu ve güvenilirliğini sağlamak için kritik bir rol oynar. Bu testler, birimlerin (fonksiyonlar, sınıflar, modüller) beklenen şekilde çalışıp çalışmadığını doğrular ve kodun kalitesini artırır.

Bu yazımda birim testin nasıl yazıldığı, avantajlarının neler olduğu, yazılım geliştirme aşamasında birim test yazımının neden önemli olduğu gibi sizler için faydalı olabileceğini düşündüğüm konulara değindim.

Umarım faydalı olmuştur. Okuduğunuz için teşekkürler :)

--

--