Quick & Nimble ile Unit Test - Swift

Tuğba Aksoy Güven
IBTech
Published in
2 min readJun 22, 2022

Unit test, bir yazılımın en küçük fonksiyonunun test edilmesidir. Uygulamaya test yazılması bug fix maliyetlerini düşürür, geliştiriciyi test edilebilir clean code yazması için yönlendirir.Karmaşık metodlardan kurtulmamızı, daha bağımsız metodlar yazmamızı sağlar.

Quick, unit test yazmak için oluşturulan, Swift ve Objective-C desteği olan BDD(Behavior Driven Development) temelli framework’dür.

Nimble, Unit test yazmak için oluşturulan Swift ve Objective-C desteği olan matching framework’dür.

Quick ve Nimble’ın kullanımı XCTest’e göre daha kolaydır.Testlerimizi daha okunabilir ve anlaşılır bir şekilde tanımlamamızı sağlar.

Bu framework’leri projemize nasıl ekleriz?

Aşağıdaki komutları pod file’ınıza ekledikten sonra ‘pod install’ yaparak, ya da Swift Package Manager üzerinden Quick ve Nimble’ı yükleyerek framework’leri uygulamanıza ekleyebilirsiniz.

pod 'Nimble'
pod 'Quick'

Önemli not: Xcode 13.3 versiyonunda Quick framework’ünde sorun olduğu için aşağıdaki versiyonu indirmeniz gerekecektir.

pod ‘Quick’, ‘~>5.0.1’

Xcode 13.3 hata çözümü için yapılan pull request aşağıdadır.

github.com/Quick/Quick/pull/1129

Şimdi gelelim bu framework’leri nasıl kullanacağımıza;

Quick, test senaryomuzu daha açıklayıcı ve okunabilir hale getirmemizi sağlar. Bunun için test class’ımızı ‘QuickSpec‘ den kalıtım alıp oluştururuz ve testlerimizi ‘spec’ metodunun içine yazarız. Bu framework’de BDD deki given, when , then mantığında keyword’ler oluşturulmuştur.

Testler için bu framework’de kullanabileceğimiz bazı fonksiyonlar şunlardır:

describe: Hangi eylemi veya davranışı test edeceğinizi tanımlamak için kullanılır.

context: Koşul veya durumu belirtir.

it: Test yöntemini tanımlamak için kullanılan açıklamadır.

beforeEach: XCTest’teki setUp metoduyla eşdeğerdir. Test koşmadan önce yapılacaklar bu blok içinde yapılır.

afterEach: XCTest’teki tearDown metoduyla eşdeğerdir. Test koşulduktan sonra yapılması gerekenler bu blok içinde yapılır.

Quick ve Nimble frameworklerini import ettikten sonra, test etmek istediğimiz class’ı @testable olarak ekliyoruz.

Framework’ün sunduğu güzel bir özellik daha var. Bazı testlerin çalışmamasını ya da sadece belirli testlerin çalışmasını isterseniz çok basit bir değişiklikle bunu sağlayabiliyorsunuz.

Yazdığınız testlerin geçici olarak çalışmamasını isterseniz keywordler’in başına “x” koyabilirsiniz: Örneğin;

Eğer belirli senaryolara odaklanmak isterseniz keyword’lerin başına “f” koyabilirsiniz. Örneğin;

Nimble framework’ünde kullandığımız bazı metodları inceleyelim;

Yukarıdaki örnekte gördüğünüz gibi “expect” keyword’ü ile kontrollerimizi yapıyoruz. Eşitlik kontrolü için equal() metodunu kullanıyoruz. Yapmak istediğimiz işleme göre kullanacağımız fonksiyon değişiyor.

Nimble’da kullanabileceğimiz bazı fonksiyonlar:

toEqual: (Eşit mi kontrolü )
toNotEqual: (Eşit değil kontrolü)
Test başarılı değilse yukarıdaki gibi custom message eklenebilir
Nimble farklı tip değişkenleri kontrol etmenizi sağlar(Sadece swiftte)
Operatörlerle kontrolü sağlar
toEventually: (Asenkron çalışan fonksiyonları kontrol etmemiz sağlar)

Bazı durumlarda (örneğin daha yavaş makinelerde çalışırken), varsayılan timeout ve poll interval değerlerini değiştirmek faydalı olabilir. Bu şöyle yapılabilir:

beAKindOf: (Yazılan değerin tipini kontrol etmemizi sağlar)

Nimble’ın işimizi kolaylaştıracak bir özelliği de test hata aldıktan sonra verilen mesajların daha açıklayıcı olması.

IOS ‘un test kütüphanesi XCTest, fail ya da pass olduğunda, daha anlaşılır olması için açıklama yazmak zorundayız fakat Nimble bize mesajı anlaşılır bir biçimde veriyor.

Örneğin XCTest’ te aşağıdaki gibi bir test yazalım.

output: XCTAssertTrue failed

Bu output’un daha anlaşılır olması için kontrol kodunu şöyle değiştirmemiz gerekiyor.

Fakat Quick ve Nimble kullanarak yazdığımızda aşağıdaki gibi output otomatik geliyor.

output:

expected to contain <Monkey(name: Kiki, sillines: extremelySilly)>,
got <[Monkey(name: Jane, silliness: verySilly)]>

Sonuç olarak;

XCTest framework’ü gerçekten iyi olsa da, amacı açıklamaması, bazı fonksiyonları test etmenin daha karışık olması, mock ve stub kullanımının daha zor olması gibi nedenlerden dolayı, birçok geliştirici Quick ve Nimble gibi framework’leri tercih ediyor.

Bu yazıyı yazarken kullandığım kaynaklar aşağıdadır. Quick ve Nimble fonksiyonlarını bu linklerden daha detaylı inceleyebilirsiniz.

1-Quick Framework

2-Nimble Framework

3-Nimble Assertions

--

--