XCTest bilan testlash


ULASHISH

XCTest bilan testlash

XCTest freymvorki yordamida mantiqni tekshirish uchun unit testlar, boshidan oxirigacha bo‘lgan (end-to-end) jarayonlarni avtomatlashtirish uchun esa UI testlar yozing.


Unit testlar

Xcode’da test target’ini yarating va XCTestCase dan meros oladigan test holatlarini (test cases) qo‘shing.

Sintaksis: class MyTests: XCTestCase { func testSomething() { XCTAssertEqual(...) } }

Misol

import Foundation

struct Math {
  static func add(_ a: Int, _ b: Int) -> Int { a + b }
}
import XCTest
@testable import MyApp

final class MyTests: XCTestCase {
  func testAdd() {
    XCTAssertEqual(Math.add(2, 3), 5)
  }
}

Ushbu misol sof funksiyani va uning natijasini XCTAssertEqual bilan tekshiradigan unit testni e’lon qiladi.


Test target’ini sozlash

  • Xcode’da Unit Testing Bundle target’ini qo‘shing (File → New → Target).
  • Test fayllarini test target’i ichida saqlang; kerak bo‘lganda ilovangizni @testable import bilan import qiling.
  • Fayl ilovaga yoki testlarga tegishli ekanini tanlash uchun Target Membership’dan foydalaning.


Testlar yozish (AAA)

Kirish ma’lumotlarini tayyorlang (Arrange), test qilinayotgan kodni chaqirib amal bajaring (Act), natijani tasdiqlang (Assert).

Misol

import XCTest
@testable import MyApp

final class MyTests: XCTestCase {
  func testAdd() {
    // Arrange
    let a = 2, b = 3
    // Act
    let sum = Math.add(a, b)
    // Assert
    XCTAssertEqual(sum, 5)
  }
}

XCTAssert variantlari

Shartlar va qiymatlarni tasdiqlang (assert).

  • XCTAssertEqual, XCTAssertNotEqual
  • XCTAssertTrue, XCTAssertFalse
  • XCTAssertNil, XCTAssertNotNil
  • XCTAssertThrowsError, XCTAssertNoThrow

Asinxron testlar

Asinxron ish tugashini kuting.

Misol

import XCTest

final class AsyncTests: XCTestCase {
  func testExpectation() {
    let exp = expectation(description: "async work")
    DispatchQueue.global().async {
      // simulate work
      exp.fulfill()
    }
    wait(for: [exp], timeout: 1.0)
  }
}

Unumdorlik testlari

Bajarilish vaqti va xotiradan foydalanishni o‘lchang.

Misol

import XCTest

final class PerformanceTests: XCTestCase {
  func testSortPerformance() {
    let input = Array(0..<10_000).shuffled()
    measure {
      _ = input.sorted()
    }
  }
}

Test rejalari va CI

Konfiguratsiyalarni (sxemalar, destination’lar, diagnostika) tartibga soling va testlarni CI’da simulyator qurilmasiga yo‘naltirilgan xcodebuild test bilan ishga tushiring.

  • Konfiguratsiyalarni (sxemalar, destination’lar, diagnostika) tartibga solish uchun Test Plans dan foydalaning.
  • Testlarni CI’da simulyator qurilmasiga yo‘naltirilgan xcodebuild test bilan ishga tushiring.
  • Deterministik testlarni afzal ko‘ring; tarmoq va vaqtni mock qiling (soxtalashtiring); iloji bo‘lsa, parallel bajaring.

UI testlar

Ilovani ishga tushirish va UI elementlari bilan accessibility orqali ishlash uchun XCUIApplication dan foydalaning.

Sintaksis:

  • let app = XCUIApplication(); app.launch()
  • elementlarni app.buttons["Label"] bilan qidiring
  • XCTAssertTrue(...) bilan tasdiqlang

Misol

import SwiftUI

struct CounterView: View {
  @State private var count = 0
  var body: some View {
    VStack(spacing: 12) {
      Text("Count: \(count)")
      Button("Increment") { count += 1 }
    }
    .padding()
  }
}
import SwiftUI

struct ContentView: View {
  var body: some View { CounterView() }
}
import SwiftUI

@main
struct MyApp: App {
  var body: some Scene {
    WindowGroup { ContentView() }
  }
}
import XCTest

final class MyUITests: XCTestCase {
  func testIncrementButtonIncrementsCount() {
    let app = XCUIApplication()
    app.launch()

    let increment = app.buttons["Increment"]
    XCTAssertTrue(increment.exists)
    increment.tap()

    XCTAssertTrue(app.staticTexts["Count: 1"].exists)
  }
}

Ushbu misol ilovani ishga tushiradi, tugmani bosadi va yorliq mavjudligini tekshiradi.

Maslahat: Kichik, deterministik testlarni afzal ko‘ring; stub’lar yoki test doubles yordamida tarmoqqa tayanmang.



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!