Published on

SwiftUI loyihasini Unit Test qilish (XCTest)

Authors

Nega test yozishimiz kerak?

Dasturlashda ikkita asosiy test turi bor:

  1. Unit Test (Birlik testi): Dasturning "miyasi" (biznes mantiq, ViewModel, Model, Service) to'g'ri ishlayotganini tekshiradi.
  2. 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:

  1. Xcode menyusida File -> New -> Target
  2. Unit Testing Bundle ni tanlang
  3. Nomini o'zgartirmang (odatda LoyihaNomiTests bo'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 tasdiqlaydi
  • XCTAssertFalse(shart) - Shart False ekanligini tasdiqlaydi
  • XCTAssertEqual(qiymat1, qiymat2) - Ikkala qiymat o'zaro teng ekanini tasdiqlaydi
  • XCTAssertNotNil(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!

Buy mea coffee