Testing — XCTest
Darsliklar (Tutorials)
Testing — XCTest & Swift Testing — To'liq Darslik
Mundarija
- Nega test yozish kerak?
- Testing piramidasi
- XCTest asoslari (setUp, tearDown, Assert)
- Unit Test yozish (ViewModel testlash)
- Mocking va Stubbing (Protocol-based)
- Async/Await funksiyalarini testlash
- UI Testing (XCUITest)
- Swift Testing — Yangi framework (iOS 18+)
- TDD (Test Driven Development)
- Code Coverage (80% maqsad)
- Real misol: Login ViewModel test
- Xulosa
1. Nega test yozish kerak? {#motivatsiya}
"Mening kodim ishlayapti, nega test yozishim kerak?" — bu eng katta xato.
- Xavfsiz Refactoring: Kodni o'zgartirganda boshqa joylar buzilmaganiga ishonch hosil qilish.
- Bug'larni erta aniqlash: Foydalanuvchi xato topishidan oldin uni tuzatish.
- Hujjatlashtirish: Testlar kodingiz qanday ishlashi kerakligini ko'rsatib beradi.
2. Testing piramidasi {#testing-pyramid}
- Unit Tests (Asos): Eng ko'p va eng tez testlar. Alohida funksiya yoki klassni testlaydi.
- Integration Tests: Modullar bir-biri bilan qanday ishlashini testlaydi.
- UI Tests: Ilovani foydalanuvchi kabi ishlatib ko'radi (Eng sekin).
3. XCTest asoslari {#xctest-basic}
XCTest — Apple'ning klassik testing framework'i.
import XCTest
class MathTests: XCTestCase {
// Har bir testdan oldin ishlaydi
override func setUp() { super.setUp() }
// Har bir testdan keyin ishlaydi
override func tearDown() { super.tearDown() }
func testAddition() {
let result = 2 + 2
XCTAssertEqual(result, 4, "2+2 to'rtga teng bo'lishi kerak")
}
}
4. Unit Test yozish (ViewModel testlash) {#unit-testing}
MVVM arxitekturasida biznes logika ViewModel'da bo'ladi, shuning uchun uni testlash juda oson.
func testCounterIncrement() {
let vm = CounterViewModel()
vm.increment()
XCTAssertEqual(vm.count, 1)
}
5. Mocking va Stubbing (Protocol-based) {#mocking}
API dan ma'lumot kelishini kutib o'tirmaymiz. Biz "soxta" (mock) servis yaratamiz.
protocol NetworkService {
func fetchData() async throws -> [String]
}
class MockService: NetworkService {
func fetchData() async throws -> [String] {
return ["Rasm 1", "Rasm 2"] // Doim tayyor natija qaytaradi
}
}
6. Async/Await funksiyalarini testlash {#async-testing}
Swift 5.5 dan keyin asinxron kodni testlash juda osonlashdi:
func testFetchData() async throws {
let service = MockService()
let data = try await service.fetchData()
XCTAssertFalse(data.isEmpty)
}
7. UI Testing (XCUITest) {#ui-testing}
Ilovani haqiqiy simulyatorda ishga tushirib, tugmalarni bosib ko'radi.
func testLoginFlow() {
let app = XCUIApplication()
app.launch()
let emailField = app.textFields["email_field"]
emailField.tap()
emailField.typeText("test@mail.com")
app.buttons["login_button"].tap()
XCTAssertTrue(app.staticTexts["Welcome"].exists)
}
8. Swift Testing — Yangi framework (iOS 18+) {#swift-testing}
Apple yangi, zamonaviy va sodda framework chiqardi. #expect macro'si va @Test atributi bilan ishlaydi.
import Testing
@Test func checkMath() {
let result = 2 + 2
#expect(result == 4)
}
@Suite struct UserTests {
@Test(arguments: ["Ali", "Vali"])
func checkUserNames(name: String) {
#expect(!name.isEmpty)
}
}
9. TDD (Test Driven Development) {#tdd}
Avval test yozish, keyin kod yozish.
- Red: Test yozing (u o'tmaydi — qizil).
- Green: Test o'tishi uchun eng minimal kodni yozing (yashil).
- Refactor: Kodni chiroyli qiling.
10. Code Coverage (80% maqsad) {#code-coverage}
Xcode'da "Edit Scheme" → "Test" → "Options" → "Gather Coverage" yoqing. Bu sizga kodingizning necha foizi test bilan qoplanganini ko'rsatadi. Professional ilovalar uchun 80% yaxshi natija.
11. Real misol: Login ViewModel test {#real-loyiha}
Darslikda biz login tugmasini aktiv bo'lishi, hato email kiritilganda error chiqishi va muvaffaqiyatli login jarayonini to'liq testlab chiqamiz.
12. Xulosa {#xulosa}
Test yozadigan dasturchi — professional dasturchi hisoblanadi.
- Unit test lardan boshlang.
- ViewModel dagi biznes logikani har doim testlang.
- Swift Testing framework'ini o'rganishni boshlang (kelajak shunda).
Vazifa: O'zingizning kichik funksiyangiz (masalan, yoshni hisoblovchi) uchun 3 ta Unit Test yozing! 🧪