XCTest bilan testlash
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 importbilan 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,XCTAssertNotEqualXCTAssertTrue,XCTAssertFalseXCTAssertNil,XCTAssertNotNilXCTAssertThrowsError,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 testbilan 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!
