Neden Swift Testing Kullanalim?
Apple’ın WWDC 2024’te duyurduğu Swift Testing, XCTest’in mirasını alarak gelen, Swift dilinin ruhuna uygun şekilde tasarlanmış modern bir test framework’ü.
Unit Test Deneyimini Iyilestirmek
Swift Testing Nedir?
Apple’ın WWDC 2024’te duyurduğu Swift Testing, XCTest’in mirasını alarak gelen, Swift dilinin ruhuna uygun şekilde tasarlanmış modern bir test framework’ü. Sade ve okunabilir syntax’ı, async/await desteği ve hiyerarşik test yapılarıyla, biz geliştiricilerin test yazma deneyimini iyilestirmeyi hedefliyor. XCTest’e kıyasla daha az boilerplate, daha fazla esneklik ve hata ayıklama süreçlerinde netlik vadeden bu araç, coktan gelistiriciler tarafindan bolca sempati topladi.
Oncesi ve Sonrasi
Hic suphesiz test yazmak yazilim gelistirme surecinin vazgecilmez bir parcasidir. Hem kod kalitesini arttirmak hem de hatalari erken asamada yakalamak icin kritik bir rol oynar. Calistigimiz projelerde test yazmayi bazen ihmal de etsek, bunun nasil bir onem tasidiginin hepimiz farkindayiz.
Simdi gelin, uzun yillar boyunca bizim kahrimizi ceken XCTest ile yeni duyurulan Swift Testing framework’unun kullanimina yakindan bakalim.
import XCTest
class UserManagerTests: XCTestCase {
var userManager: MockUserManager!
override func setUp() {
super.setUp()
userManager = MockUserManager()
}
override func tearDown() {
userManager = nil
super.tearDown()
}
func test_userRegistration() {
// Given
let user = User(name: "Ted", email: "ted@example.com")
// When
let isRegistered = userManager.register(user)
// Then
XCTAssertTrue(isRegistered)
}
}
Yukarida registration islemlerinin test edilmesi amaciyla yazilmis ornek unit test metodlarini goruyoruz.
Ilk goze carpanlari soyle bir incelyelim.
XCTest ile yazılan testler:
- Bir
classiçinde tanımlanır veXCTestCase’den türetilmesi zorunludur. - Test metodları
testprefix’i ile başlar. - Assertion’lar için
XCTAssertfonksiyonlarından test case icin uyumlu olan bir alternatifi kullanılır. - Her test metodundan önce çalıştırılan
setUp()ve sonra çalıştırılantearDown()metodları bulunur. Bunlar, testler için ortam hazırlamak, kaynakları temizlemek ve testlerin birbirini etkilemesini önlemek için kullanılır.
import SwiftTesting
@Suite
struct UserManagerTests {
var userManager: MockUserManager
init() {
userManager = MockUserManager()
}
@Test
func userRegistration() {
// Given
let user = User(name: "Ted", email: "ted@example.com")
// When
let isRegistered = userManager.register(user)
// Then
#expect(isRegistered)
}
}
Swift Testing ile yazilan testler:
- Bir
classiçinde tanımlanmak zorunda değildir;@Testattribute’u ile doğrudan fonksiyonlar test olarak işaretlenebilir. - Test metodlarının
testile başlaması zorunluluğu yoktur;@Testattribute’u bu gereksinimi ortadan kaldırır. - Assertion’lar için
#expectmacrosu kullanılır, bu da daha basit ve okunabilir bir syntax sunar. - Setup ve Teardown işlemleri,
@Testiçinde veya@Suiteile hiyerarşik olarak yönetilebilir.
| XCTest | Swift Testing |
|---|---|
| try XCTUnwrap(x) | try # require(x) |
| XCTFail(“Unexpected Failure”) | Issue.record(“Unexpected Failure”) |