Swift projelerinde birim testleri(Unit Tests) nasıl kullanılır?

Aybars Yalcin
5 min readDec 26, 2022

--

Merhabalar, ben Aybars ve bu yazıda size birim testlerine neden ihtiyaç duyuyoruz ve neden yazmalıyız hakkında bilgi vermek istiyorum.

Neden kullanmalıyız?

Birim testleri, uygulamamızdaki bir fonksiyon veya sınıf gibi daha küçük birimlerin doğru bir şekilde çalışıp çalışmadığını test etmek için kullanırız.

Peki nasıl başlayabiliriz?

Bir projeye birim testleri eklemek isterseniz eğer iki yoldan ekleyebilirsiniz.

Birincisi Xcode’da yeni bir proje açın. Include Tests seçili olacak şekilde projenizi oluşturun. Daha sonra Xcode içerisinde proje dosyalarınızda {ProjectName}Tests adında bir klasör otomatik olarak oluşacaktır.

Yeni proje oluştururken Include Tests seçin.
Projeize sonradan bir birim test eklemek için Unit Test Target seçin.

İkinci yolu ise; var olan projenize TestNavigator sekmesini açın ve Xcode’un en sol alt köşesinde bulununan “+” butonuna basarak “New Unit Test Class” seçin.

Test Navigator açmak için mavi seçili butona tıklayın
Yeni bir Unit Test Class oluşturmak için + butonuna basın ve New Unit Test Class seçin

Test fonksiyonları, genellikle test kelimesiyle başlar ve uygulamanızın bir özelliğini veya fonksiyonunu test etmeyi amaçlar.

Bir test fonksiyonu oluşturulduktan sonra, testi yazmak için aşağıdaki adımları izleyin:

  1. Test edilecek özelliği veya fonksiyonu çağırın.
  2. Çıktıyı beklediğiniz gibi bir değerle karşılaştırın.
  3. Eğer çıktı beklediğiniz gibi değilse, bir hata mesajı oluşturun ve XCTFail fonksiyonunu çağırarak testi başarısız olarak işaretleyin.

XCTest kütüphanesi, birim testleri yazmak için birçok test metodu sunar.

  1. XCTAssertTrue: Bir değişkenin doğru olduğunu test etmek için kullanılır.
  2. XCTAssertFalse: Bir değişkenin yanlış olduğunu test etmek için kullanılır.
  3. XCTAssertNil: Bir değişkenin nil olduğunu test etmek için kullanılır.
  4. XCTAssertNotNil: Bir değişkenin nil olmadığını test etmek için kullanılır.
  5. XCTAssertEqual: İki değişkenin eşit olduğunu test etmek için kullanılır.
  6. XCTAssertNotEqual: İki değişkenin eşit olmadığını test etmek için kullanılır.
  7. XCTAssertEqualWithAccuracy: İki sayının birbirine yakın olduğunu test etmek için kullanılır.
  8. XCTAssertNotEqualWithAccuracy: İki sayının birbirine eşit olmadığını test etmek için kullanılır.
  9. XCTAssertEqualObjects: İki nesnenin eşit olduğunu test etmek için kullanılır.
  10. XCTAssertNotEqualObjects: İki nesnenin eşit olmadığını test etmek için kullanılır.
  11. XCTAssertGreaterThan: Bir değişkenin bir değerden büyük olduğunu test etmek için kullanılır.
  12. XCTAssertGreaterThanOrEqual: Bir değişkenin bir değerden büyük veya eşit olduğunu test etmek için kullanılır.
  13. XCTAssertLessThan: Bir değişkenin bir değerden küçük olduğunu test etmek için kullanılır.
  14. XCTAssertLessThanOrEqual: Bir değişkenin bir değerden küçük veya eşit olduğunu test etmek için kullanılır.
  15. XCTAssertCloseTo: İki sayının birbirine yakın olduğunu test etmek için kullanılır.
  16. XCTAssertThrowsError: Bir blok içinde bir hata çıkıp çıkmadığını test etmek için kullanılır.
  17. XCTAssertNoThrow: Bir blok içinde hiçbir hata çıkmadığını test etmek için kullanılır.
  18. XCTAssertThrowsSpecificError: Bir blok içinde belirli bir hata çıkıp çıkmadığın
  19. XCTAssertThrowsSpecificNamedError: Bir blok içinde belirli bir isimli hata çıkıp çıkmadığını test etmek için kullanılır.
  20. XCTAssertNoThrowSpecificError: Bir blok içinde belirli bir hata çıkmadığını test etmek için kullanılır.
  21. XCTAssertNoThrowSpecificNamedError: Bir blok içinde belirli bir isimli hata çıkmadığını test etmek için kullanılır.

Code coverage(kod kaplama) nedir?

Code coverage, projenizin test edilen kodlarının yüzde kaçının çalıştığını gösterir. Bu özellik, projenizin hangi kodlarının test edilip edilmediğini anlamanıza yardımcı olur ve projenizin kalitesini arttırmasında faydası olur.

Xcode’da code coverage özelliğini açmak için aşağıdaki adımları izleyebilirsiniz:

  1. Projenizi açın ve projenin üst seviyesi seçilecek şekilde sol taraftaki Project Navigator bölmesine gidin.
  2. Sol üstteki menü çubuğunda “Product > Scheme > Edit Scheme” seçeneğine tıklayın. Bu işlem, Scheme Editor penceresini açar.
  3. Scheme Editor penceresinde, “Test” sekmesine gidin “Options” sekmesine tıklayın ve “Code Coverage” seçeneğini açın.
  4. “Close” düğmesine tıklayarak Scheme Editor penceresini kapatın.

Artık, projenizi test etmek için “Product > Test” seçeneğine tıklayabilir ve code coverage özelliği açık olacaktır.

Xcode’da Coverage buradan açabilirsiniz.

Code coverage en az kaç olmalıdır?

Code coverage yüzdesinin ne kadar olması gerektiği konusunda bir kesin sınır yoktur. Projenizin ihtiyaçlarına ve hedeflerine göre code coverage yüzdesi değişebilir. Örneğin, projenizin kritik bir parçası var ise ve bu parçanın çalışması çok önemlidir, o zaman code coverage yüzdesinin daha yüksek olması iyi olabilir. Ayrıca, projenizin büyüklüğü, kompleksliği ve geliştirme süreci de code coverage yüzdesini etkileyebilir.

Genel olarak, code coverage yüzdesinin en az yüzde 70 olması tavsiye edilir. Ancak, bu yüzde sadece bir yol göstericidir ve projenizin ihtiyaçlarına göre daha yüksek veya daha düşük olabilir. Önemli olan, projenizin test edilmeyen kodlarının azaltılmasıdır ve bu sayede projenizin güvenilirliğini ve kalitesini artırmaktır.

Teorik olarak anlattıklarımızı bir örnek ile devam edelim.

Calculator isminde bir sınıfımız olsun ve basit dört işlem yapabilen fonksiyonları olduğunu varsayalım.

class Calculator {
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
func subtract(_ a: Int, _ b: Int) -> Int {
return a - b
}
func multiply(_ a: Int, _ b: Int) -> Int {
return a * b
}
func divide(_ a: Int, _ b: Int) -> Double? {
guard b != 0 else {
return nil
}
return Double(a) / Double(b)
}
}

Calculator class içerisindeki tüm fonksiyonları test etmek için öncelikle XCTestCase ‘den türeyen bir class oluşturalım.

import XCTest

class CalculatorTests: XCTestCase {
}

Aşağıdaki örneği incelediğimizde; XCTest sınıfına ait methodları kullanarak eşit olup olmadıklarına bakan methodlar yazdık.

import XCTest

class CalculatorTests: XCTestCase {
func testAdd() {
let calculator = Calculator()
// Toplama işlevi çalışıyor mu?
XCTAssertEqual(calculator.add(1, 2), 3)
XCTAssertEqual(calculator.add(-1, -2), -3)
XCTAssertEqual(calculator.add(0, 0), 0)
}
func testSubtract() {
let calculator = Calculator()
// Çıkarma işlevi çalışıyor mu?
XCTAssertEqual(calculator.subtract(1, 2), -1)
XCTAssertEqual(calculator.subtract(-1, -2), 1)
XCTAssertEqual(calculator.subtract(0, 0), 0)
}
func testMultiply() {
let calculator = Calculator()
// Çarpma işlevi çalışıyor mu?
XCTAssertEqual(calculator.multiply(1, 2), 2)
XCTAssertEqual(calculator.multiply(-1, -2), 2)
XCTAssertEqual(calculator.multiply(0, 0), 0)
}
func testDivide() {
let calculator = Calculator()
// Bölme işlevi çalışıyor mu?
XCTAssertEqual(calculator.divide(1, 2), 0.5)
XCTAssertEqual(calculator.divide(-1, -2), 0.5)
XCTAssertEqual(calculator.divide(0, 0), nil)
}
}

Sonuç olarak, bu yazımızda projemizde birim testlerine neden ihtiyaç duyuyoruz ve neden yazmalıyız hakkında bahsetmiş oldum.

Umarım keyifli bir yazı olmuştur.

Diğer makalelerde görüşmek üzere… 👋

--

--