Unit Test Nedir?

Ebru Aydemir
FLO Teknoloji

--

Unit test ,yazılımın en küçük işlevsel birimlerini, metodlarını,istenilen sonuçlara erişebilirliğini test etmeyi amaçlar. Yazılımdan istenilen çıktıları doğrulamak ya da metotların doğru çalıştığından emin olmak , yazılımın her bir parçasını bağımsız bir şekilde test etmek amaçlı yazılır.

Daha kaliteli kodların yazılmasında ve hataların erken tespitinde önemli bir etkendir.

Ayrıca yeni kodlar eklendikçe mevcutta bulunan kodların bu durumdan etkilenip etkilenmediğini ,işlevselliğinin korunduğunun doğrulanmasına yardımcı olur.

 $controller = new Save('Save', 'downloadImage');


$response = $controller->downloadImageAction();


$this->assertTrue($response['success']);

Yukarıdaki örnekte Save controller’ımız ve içerisinde downloadImage fonksiyonumuzun var olduğunu düşünelim. $this->assertTrue verdiğimiz değer true mu kontrolünü yapar ve değil ise exception fırlatır. $this->assertEquals(beklenen değer, test edeceğimiz değer); da aynı şekilde beklenen değer verilen değere eşit ise test ilerler, yanlış ise exception fırlatılır.

Mock

Test edeceğimiz senaryo dış bir servise bağımlı olabilir ya da database’den veri çekip ilerlenmesi gereken durumlar olabilir. Bizim test senaryomuzu bu bağımlılıkları kullanmadan test etmemiz gerekir. İşte bu noktada mock nesneleri devreye giriyor. Mock nesneleri istenilen bir nesneyi birebir taklit eden nesnelerdir. Örneğin bir veritabanı işlemi yapan nesne yerine mock nesnesi kullanabiliriz ve o işlemden beklediğimiz cevabı mock nesnesi ile koda verebiliriz. Bu şekilde uzun db işlemlerine gerek kalmadan istediğimiz senaryoya odaklanarak testimizi yapabiliriz.


class FileProcessor {
private $fileManager;


public function __construct(FileManager $fileManager) {
$this->fileManager = $fileManager;
}


public function processFile($filePath) {
$fileContent = $this->fileManager->readFile($filePath);
// ... dosya işleme işlemleri ...
return $processedData;
}
}

// FileManager.php

class FileManager {
public function readFile($filePath) {
// Dosya okuma işlemi
return $fileContent;
}
}

Yukarıdaki örnekte, FileProcessor sınıfı FileManager sınıfına bağımlıdır. processFile metodu, FileManager üzerinden dosyayı okuyup işler. FileProcessor test etmek için aşağıda Unit Test Class’ı oluşturalım:

require_once 'FileProcessor.php';

use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\MockObject\MockObject;


class FileProcessorTest extends TestCase {
public function testProcessFile() {
// Mock FileManager
$fileManagerMock = $this->createMock(FileManager::class);
$fileManagerMock->expects($this->once())
->method('readFile')
->willReturn('File content');


// Mock ile FileProcessor oluştur
$fileProcessor = new FileProcessor($fileManagerMock);


// processFile metodunu test et
$result = $fileProcessor->processFile('test.txt');


$this->assertEquals('Processed data', $result);
}
}

Yukarıdaki örnekte, FileProcessor sınıfını test etmek için FileManager’ın Mock’unu oluşturduk. $this->createMock yöntemi ile FileManager sınıfının bir taklidini Mock’unu oluşturuyoruz. Daha sonra, readFile metodunu bir kez çağıracağımızı ve bu metottan File Content değerini döneceğini belirtiyoruz.

Sonraki adımda, oluşturduğumuz mock ile FileProcessor sınıfının bir örneğini oluşturuyoruz. Ardından, processFile metodunu test ediyoruz ve beklenen sonucun Processed data olduğunu doğruluyoruz.

Mock’lama ile yukarıdaki örnekteki gibi test edilen birimin bağımlılıklarını taklit etmemizi ve doğru çalışıp çalışmadığını kontrol etmemizi sağlar. Bu şekilde, test senaryolarının oluşturulabilirliğini arttırabilir ve hızlı test yapılmasına olanak sağlanır.

--

--