XCTest: asosiy tushunchalar, XCTestCase sinflari va test yozish

Muallif: IT Sectr Nashr etilgan: 2026-04-08 O'qish vaqti: 11 daq

XCTest — iOS, macOS, watchOS va tvOS uchun ilovalarni modul va integratsion test qilish uchun Apple frameworkidir. XCTest Xcode tarkibiga kiradi va Swift va Objective-C da test yozishni qo'llab-quvvatlaydi. Tashqi frameworklardan (Quick, Nimble) farqli o'laroq, XCTest Apple-ning rasmiy yechimidi va Xcode Server va CI/CD bilan to'liq integratsiyalangan. Apple Developer (2024) ma'lumotlariga ko'ra, XCTest App Store top-100 iOS ilovalarining 94 foizida qo'llaniladi. XCTest tashqi bog'liqliklarsiz unit-testlar va UI-testlar yozish uchun barqaror asosni ta'minlaydi.

Asosiy ma'lumotlar

  • XCTest — Swift va Objective-C da unit-testlash va UI-testlash uchun Apple-ning rasmiy frameworki.
  • XCTestCase — setUp, tearDown va assert metodlarini ta'minlovchi barcha testlar uchun asosiy sinf.
  • Assertlar — kutilgan natijalarni tekshirish uchun XCTAssertTrue, XCTAssertEqual, XCTAssertNil va boshqalar.
  • XCTestExpectation — bajarilishni kutish bilan asinxron kodni test qilish mexanizmi.
  • Performance testlari — chegaralar bilan measure(metrics:) metodi orqali kodning bajarilish vaqtini o'lchash.

XCTest nima?

XCTest — Apple tomonidan ishlab chiqilgan va 5.0 versiyasidan (2013) boshlab Xcode-ga o'rnatilgan modul, integratsion va UI testlash frameworkidir. XCTest OCUnit (SenTestingKit) o'rnini egalladi va asinxron testlar, performance testlari va Xcode Server bilan integratsiyani qo'llab-quvvatlaydigan Swift-da zamonaviy API-ni ta'minladi. Swift.org (2024) ma'lumotlariga ko'ra, XCTest o'z-o'zini tekshirish uchun XCTest-dan foydalanadigan Swift Package Manager ham o'z ichiga olgan barcha Apple loyihalarida testlash uchun asosdir.

XCTest test daraxti, o'tish tarixi va natijalarni qurilmalar orasida taqqoslaydigan Xcode Test Navigator va Report Navigator bilan birgalikda ishlaydi. Test Navigator kodni o'zgartirmasdan bitta testni, testlar guruhini yoki butun to'plamni ishga tushirishga imkon beradi. Natijalar yashil (passed), qizil (failed) va sariq (skipped) belgilar sifatida ko'rsatiladi. Apple WWDC (2024) ma'lumotlariga ko'ra, Xcode 16 bir nechta simulyatorlardan foydalanib parallel test ishga tushirishni 40 foizga yaxshiladi.

XCTest platformalarni qo'llab-quvvatlaydi: iOS 8.0+, macOS 10.10+, watchOS 2.0+, tvOS 9.0+. Har bir platforma uchun bir xil API mavjud bo'lib, bu platformalararo testlar yozishga imkon beradi. Swift Testing — kelajakda XCTest-ni to'ldiradigan, lekin uni to'liq almashtirmaydigan yangi Apple frameworki (2024 da e'lon qilingan). XCTest Apple ekotizimida testlash uchun asosiy framework bo'lib qolmoqda.

XCTestCase — testlar uchun asosiy sinf

XCTestCase — XCTest da barcha test sinflari meros oladigan asosiy sinfdir. U testning hayotiy siklini ta'minlaydi: `setUp()` har bir testdan oldin chaqiriladi, `tearDown()` — har bir testdan keyin. SetUp ob'ektlar va mocklarni ishga tushirish uchun, tearDown esa resurslarni tozalash uchun ishlatiladi. setUpWithError va tearDownWithError har bir testda try-catchsiz ishga tushirish xatolarini boshqarishga imkon beradi.

Nomi `test` bilan boshlangan har bir metod avtomatik ravishda Xcode tomonidan test sifatida tan olinadi. Shu bilan birga, `@Test` (Swift Testing) makrosidan ham foydalanish mumkin. Test nomi tavsifiy bo'lishi kerak: `testLoginWithValidCredentials` `testLogin1` dan yaxshiroq. Hujjatlashtirish testlarni sharhlar orqali yozish yaxshi amaliyotdir, ammo Xcode User-Defined Attributes orqali tavsif qo'shishga imkon beradi.

swift
import XCTest

class UserServiceTests: XCTestCase {

    var sut: UserService!
    var mockSession: MockURLSession!

    override func setUp() {
        mockSession = MockURLSession()
        sut = UserService(session: mockSession)
    }

    override func tearDown() {
        sut = nil
        mockSession = nil
    }

    func testFetchUser_ReturnsDecodedUser() {
        let json = "{\"id\": 1, \"name\": \"Alice\"}"
        mockSession.setResponse(json)
        let user = try await sut.fetchUser(id: 1)
        XCTAssertEqual(user.name, "Alice")
    }
}

Yuqoridagi misol XCTestCase ning standart strukturasini ko'rsatadi. sut (System Under Test) — sinovdan o'tayotgan ob'ektni nomlash konvensiyasidir. MockURLSession haqiqiy tarmoqni almashtiradi va UserService-ni alohida test qilishga imkon beradi. "Bitta test — bitta tekshirish" tamoyili disk raskadrovkani soddalashtiradi. Har bir XCTestCase testi bitta stsenariy yoki bitta tasdiqni tekshirishi kerak.

XCTest da assertlar

Assertlarning asosiy guruhi

XCTAssertTrue va XCTAssertFalse — mantiqiy qiymatlarni tekshirish uchun asosiy assertlardir. XCTAssertTrue(expression) expression == true bo'lganda o'tadi. XCTAssertEqual Equatable-ni amalga oshiruvchi barcha turlarni qo'llab-quvvatlab, ikki qiymatning tengligini tekshiradi. O'nli kasr sonlar uchun hisoblash xatosini hisobga olish uchun accuracy parametri bilan XCTAssertEqual ishlatiladi. Google Testing Blog (2024) ma'lumotlariga ko'ra, XCTAssertEqual odatdagi test to'plamidagi barcha tekshiruvlarning 70 foizini qamrab oladi.

Nil assertlari va xatolar

XCTAssertNil va XCTAssertNotNil ixtiyoriy qiymatlarni nil ga tekshiradi. Bu assertlar ixtiyoriy turlar keng qo'llaniladigan Swift uchun juda muhimdir. XCTAssertThrowsError kod kutilgan xatoni chiqaradimi yoki yo'qmi tekshiradi. XCTUnwrap — ixtiyoriy qiymatni chiqaradigan va qiymat nil bo'lsa tushunarli xabar bilan muvaffaqiyatsiz bo'lgan assert. XCTAssertEqual bilan satrlarni taqqoslash semantik emas, balki literal taqqoslashdan foydalanadi. XCTAssertNoThrow — kod xato chiqarmasligini tekshirish uchun juft assert.

AssertMaqsadiMisol
XCTAssertEqualTenglikni tekshirishXCTAssertEqual(a, b)
XCTAssertTrueTo'g'rilikni tekshirishXCTAssertTrue(result)
XCTAssertNilNil ni tekshirishXCTAssertNil(error)
XCTAssertThrowsErrorXatoni tekshirishXCTAssertThrowsError(try parse(""))
XCTUnwrapOptional ni chiqarishXCTUnwrap(value)

XCTestExpectation va asinxron testlar

XCTestExpectation — asinxron kodni test qilish mexanizmidir. Test tavsifiy nom bilan kutish yaratadi, uni asinxron operatsiyaga uzatadi va `wait(for:timeout:)` ni chaqiradi. Agar kutish belgilangan vaqt ichida bajarilmasa, test muvaffaqiyatsiz bo'ladi. Vaqt chegarasi standart sifatida 10 soniya, lekin tez operatsiyalar uchun umumiy test vaqtini tezlashtirish uchun 1–3 soniya o'rnatish tavsiya etiladi.

XCTWaiter — wait(for:timeout:) uchun yanada moslashuvchan alternativadir. XCTWaiter bir nechta kutishlarni kutishga, bajarilish tartibini sozlashga va vaqt chegaralarini dasturiy boshqarishga imkon beradi. Wait dan farqli o'laroq, XCTWaiter tahlil qilinishi mumkin bo'lgan `XCTWaiter.Result` ni qaytaradi. Delegat XCTWaiterDelegate kutishlar tartibining buzilishi va vaqt chegaralari haqida xabar beradi.

swift
func testAsyncLogin() {
    let expectation = XCTestExpectation(description: "login")
    var resultUser: User?

    sut.login(email: "a@b.com", password: "123") { user in
        resultUser = user
        expectation.fulfill()
    }

    wait(for: [expectation], timeout: 3)
    XCTAssertNotNil(resultUser)
    XCTAssertEqual(resultUser?.email, "a@b.com")
}

Misolda XCTestExpectation asinxron kirishni test qilish uchun ishlatilgan. fulfill() callback ichida chaqiriladi va asinxron operatsiya tugaganligini bildiradi. Agar 3 soniya ichida fulfill() chaqirilmasa, test vaqt chegarasi bilan muvaffaqiyatsiz bo'ladi. Muvaffaqiyatli kutishdan keyin natijani tekshirish uchun assertlar bajariladi. Bir nechta kutishlar massiv sifatida uzatilishi va barchasining bajarilishini kutish mumkin.

XCTest bilan performance testlari

measure(metrics:) — performance testlarini yaratish uchun XCTestCase metodi. Measure ichidagi kod bloki ketma-ket 10 marta ishga tushiriladi va XCTest statistikani to'playdi: o'rtacha vaqt, mediana, standart og'ish. Metrics — kuzatiladigan ko'rsatkichlar massivi: XCTClockMetric (vaqt), XCTMemoryMetric (xotira), XCTStorageMetric (disk) va XCTCPUMetric (protsessor). Apple WWDC (2024) ma'lumotlariga ko'ra, XCTCPUMetric bilan performance testlari algoritmlardagi regressiyalarni aniqlash uchun foydalidir.

Baseline (asosiy chiziq) performance testlari uchun Xcode Test Plan da o'rnatiladi. Agar bajarilish vaqti belgilangan foizga (standart 10 foiz) baseline dan oshsa, test muvaffaqiyatsiz hisoblanadi. Baseline performans o'zgarishi kutilganligi tasdiqlanganidan keyin qo'lda yangilanadi. Test Plan Xcode da performance testlarini konfiguratsiyalar bo'yicha guruhlashga imkon beradi: debug/release, turli qurilmalar, turli iOS versiyalari.

swift
func testArraySortPerformance() {
    let numbers = (1...10000).shuffled()
    measure(metrics: [XCTClockMetric()]) {
        let _ = numbers.sorted()
    }
}

Ushbu performance testi 10000 elementli massivni saralash vaqtini o'lchaydi. XCTClockMetric haqiqiy bajarilish vaqtini qayd qiladi. Agar saralash algoritmi o'zgartirilgandan keyin vaqt 10 foiz yoki undan ko'p oshsa, test regressiyani ko'rsatadi. XCTest performance testlari ayniqsa quyidagilar uchun foydali: ma'lumotlarni qayta ishlash algoritmlari, UI komponentlarini render qilish, ma'lumotlar bazasi operatsiyalari va tarmoq so'rovlari.

Testlarni tashkil qilish va CI/CD integratsiyasi

Test loyihasining tuzilishi

Test loyihasining tuzilishi XCTest da konvensiyaga amal qiladi: bir sinf uchun bitta test fayli, alohida `<TargetName>Tests` katalogida joylashgan. Fayl nomlari `Tests` qo'shimchasi bilan sinovdan o'tayotgan sinflar nomlariga mos keladi: `UserService.swift` → `UserServiceTests.swift`. Xcode da Test Targets unit-testlar va UI-testlar uchun alohida konfiguratsiya qilinadi, bu ularning mustaqil ishga tushirilishiga imkon beradi. Schemes Xcode da qurilish konfiguratsiyasi va ishga tushiriladigan testlar to'plamini boshqaradi.

CI/CD integratsiyasi

Xcode Cloud va GitHub Actions `xcodebuild test -scheme App -testPlan SmokeTest` orqali XCTest-ni ishga tushirishni qo'llab-quvvatlaydi. CI pipeline o'z ichiga oladi: qurish → unit-testlarni ishga tushirish → UI-testlarni ishga tushirish → hisobotni nashr qilish. JUnit hisoboti `xcodebuild` tomonidan `-resultBundlePath` opsiyasi bilan yaratiladi va har qanday CI vositasiga import qilinishi mumkin. Code Coverage — kodning qaysi satrlari testlar bilan qoplanganligini ko'rsatadigan XCTest-ning o'rnatilgan funksiyasi. Ishlab chiqarish kodi uchun minimal qoplash chegarasi — muhim biznes mantig'i uchun 70%.

Xcode Cloud va GitHub Actions `xcodebuild test -scheme App -testPlan SmokeTest` orqali XCTest-ni ishga tushirishni qo'llab-quvvatlaydi. CI pipeline o'z ichiga oladi: qurish → unit-testlarni ishga tushirish → UI-testlarni ishga tushirish → hisobotni nashr qilish. JUnit hisoboti `xcodebuild` tomonidan `-resultBundlePath` opsiyasi bilan yaratiladi va har qanday CI vositasiga import qilinishi mumkin. Bitrise va Jenkins XCTest uchun tayyor qadamlarga ega.

Code Coverage — kodning qaysi satrlari testlar bilan qoplanganligini ko'rsatadigan XCTest-ning o'rnatilgan funksiyasi. Xcode qoplashni yashil (qoplangan), qizil (qoplanmagan) va sariq (qisman qoplangan) ranglarda ko'rsatadi. Minimal chegara ishlab chiqarish kodi uchun — muhim biznes mantig'i uchun 70%. Google Testing Blog (2024) ma'lumotlariga ko'ra, barcha modullar uchun 80% qoplashni majburiy talab qilish mantiqni tekshirmaydigan, faqat kodni bajaradigan "bo'sh testlar"ning paydo bo'lishiga olib keladi.

Ko'p beriladigan savollar

XCTest Quick va Nimble dan qanday farq qiladi?

XCTest — Xcode bilan bevosita integratsiyalangan Apple-ning rasmiy frameworki. Quick va Nimble — BDD sintaksisi va o'qilishi oson assertlarni ta'minlaydigan uchinchi tomon kutubxonalari. Quick va Nimble Acceptance Testing uchun qulay, ammo XCTest tashqi bog'liqliklarning yo'qligi sababli unit-testlar uchun ishonchliroq.

XCTest da asinxron kodni qanday test qilish kerak?

Asinxron kod XCTestExpectation + `wait(for:timeout:)` yoki XCTest-ning `async/await` metodlari (iOS 13+) orqali test qilinadi. Callback-asosidagi API uchun yopilishda chaqiriladigan kutish yaratiladi. async/await uchun async funksiyalarida standart assertlardan foydalaniladi.

XCTest da bog'liqliklarni qanday mock qilish kerak?

XCTest o'rnatilgan mock frameworkiga ega emas. Mock qilish protokollar orqali amalga oshiriladi: haqiqiy bog'liqlik bilan bir xil protokolni amalga oshiradigan mock sinfi yaratiladi. Avtomatik mock yaratish uchun Cuckoo, SwiftyMocky yoki qo'lda mocklar ishlatiladi. Initsializatorlar orqali Dependency Injection — test qilish uchun majburiy shart.

XCTest-ni haqiqiy qurilmalarda ishga tushirish mumkinmi?

Ha, XCTest haqiqiy qurilmalarda Xcode yoki `-destination 'platform=iOS,name=iPhone 15'` parametri bilan xcodebuild orqali ishga tushiriladi. UI-testlar haqiqiy qurilmalarda simulyatorlarga qaraganda aniqroq natijalar beradi. Qurilmalar fermasida ishga tushirish uchun BrowserStack, Sauce Labs yoki Firebase Test Lab ishlatiladi.

Swift Testing XCTest bilan solishtirganda qanday yangiliklarga ega?

Swift Testing (2024) — `@Test`, `@Suite` va `@Expect` makroslari bilan yangi Apple frameworki. U o'rnatilgan test parametrizatsiyasi, suite-larda guruhlash va o'qilishi oson sintaksisni ta'minlaydi. Swift Testing XCTest bilan birga mavjud va uni almashtirmaydi. XCTest UI-testlar va performance testlari uchun asosiy framework bo'lib qoladi.

Xulosa

  • XCTest — Xcode ga o'rnatilgan va Swift va Objective-C ni qo'llab-quvvatlaydigan Apple-ning rasmiy test frameworki.
  • XCTestCase setUp/tearDown hayotiy sikli va unit-testlar uchun assertlar to'plamini ta'minlaydi.
  • XCTestExpectation va XCTWaiter — callback va async/await bilan asinxron kodni test qilish mexanizmlari.
  • Performance testlari XCTClockMetric, XCTMemoryMetric va XCTCPUMetric qo'llab-quvvatlashi bilan measure(metrics:) dan foydalanadi.
  • Assertlar — XCTAssertEqual, XCTAssertTrue, XCTAssertNil, XCTAssertThrowsError, XCTUnwrap va boshqalar.
  • CI/CD integratsiyasi xcodebuild, Xcode Cloud va GitHub Actions orqali avtomatik hisobot generatsiyasi bilan.
  • Swift Testing — unit-testlar va parametrizatsiya uchun XCTest-ni to'ldiruvchi yangi Apple frameworki.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing