- Published on
SwiftUI loyihasini Unit Test qilish (XCTest)
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Nega test yozishimiz kerak?
Dasturlashda ikkita asosiy test turi bor:
- Unit Test (Birlik testi): Dasturning "miyasi" (biznes mantiq, ViewModel, Model, Service) to'g'ri ishlayotganini tekshiradi.
- UI Test (Interfeys testi): Foydalanuvchi ekranda aynan qaysidir tugmani bossa o'sha narsa bo'layotganini tekshiradi.
Kichik dasturlar uchun test yozish vaqtni yotishdek tuyulishi mumkin. Ammo dasturingiz kattalashgani sari o'zgarishlar kiritilganda uning boshqa joyi sinib (buzilib) qolmaganiga ishonch hosil qilish uchun Unit Testlar juda zarur!
1. Testlar uchun yangi Target yaratish
Testlar alohida muhitda ishlashi va bizning asosiy dasturimiz xotirasini band qilmasligi uchun ularga yangi manzil (Target) yaratamiz:
- Xcode menyusida File -> New -> Target
- Unit Testing Bundle ni tanlang
- Nomini o'zgartirmang (odatda
LoyihaNomiTestsbo'ladi).
2. Test nomlash va yozish qoidalari
Test faylida siz yozadigan har bir tekshiruv (funksiya) test so'zi bilan boshlanishi kerak, shundagina Xcode uni test deb taniydi. Lekin tartibli yozish uchun maxsus nomlash uslubidan foydalanamiz:
test_[QaysiKlass]_[QaysiHolat]_[KutilayotganNatija]
Masalan bizda quyidagicha sodda ViewModel bor:
class UnitTestingViewModel: ObservableObject {
@Published var isPremium: Bool
init(isPremium: Bool) {
self.isPremium = isPremium
}
}
Endi uning testini yozamiz:
import XCTest
// Asosiy ilovamiz nomini yozamiz
@testable import MeningAsosiyIlovam
final class UnitTestingViewModel_Tests: XCTestCase {
// Nomlash qoidasi bo'yicha yozilgan test
func test_UnitTestingViewModel_isPremium_shouldBeTrue() {
// GIVEN (Berilgan holat: qanday qiymatlar bor)
let userIsPremium: Bool = true
// WHEN (Qachonki: Biz shuni ishga tushirsak)
let vm = UnitTestingViewModel(isPremium: userIsPremium)
// THEN (Shunda: Shu natija chiqishi kerak)
XCTAssertTrue(vm.isPremium) // vm.isPremium rostdan ham True ekanligini tasdiqlash
}
}
3. Har xil turdagi tekshiruvlar (Asserts)
Testlarda natijani tekshirish uchun XCTAssert... buyruqlaridan foydalaniladi:
func test_UnitTestingViewModel_isPremium_shouldBeInjectedValue() {
// GIVEN
// Random qilib beramiz (True yoki False tushishi noma'lum)
let randomBool = Bool.random()
// WHEN
let vm = UnitTestingViewModel(isPremium: randomBool)
// THEN
// Bizga natija aniq bo'lmasa-da, kiritilgan va chiqqan qiymat bir xil ekanligini tasdiqlaymiz:
XCTAssertEqual(vm.isPremium, randomBool)
}
Asosiy ishlatiladigan Asserts:
XCTAssertTrue(shart)- Shart True ekanligini tasdiqlaydiXCTAssertFalse(shart)- Shart False ekanligini tasdiqlaydiXCTAssertEqual(qiymat1, qiymat2)- Ikkala qiymat o'zaro teng ekanini tasdiqlaydiXCTAssertNotNil(qiymat)- Qiymat Nil emasligini tasdiqlaydi
Bular eng sodda testlar edi. Keyingi darslarda biz ma'lumotlar tortib kelinadigan va kutish talab qilinadigan (Asynchronous) funksiyalarni qanday test qilishni ko'rib chiqamiz!