0Pricing
Swift Academy · Pelajaran

Menguji kode asinkron (XCTest)

Tulislah pengujian asinkron dengan XCTest: tandai pengujian sebagai async , gunakan await dan throws , uji kegagalan dan batas waktu, serta tegaskan hasil konkurensi terstruktur.

Menguji kode asinkron (XCTest) adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 3 pelajaran total.

Dasar-dasar pengujian asinkron

XCTest mendukung pengujian async. Jaga pengujian tetap kecil dan deterministik:

  • Deklarasikan pengujian async dan gunakan await
  • Gunakan throws dan do/catch untuk kegagalan
  • Ganti sleep dengan tiruan kecil

Kasus sukses asinkron

Tandai pengujian sebagai async dan panggil SUT dengan await. Tulis pernyataan biasa seperti XCTAssertEqual.

import XCTest
import Foundation

// System Under Test (SUT)
func fetchValue() async -> Int {
    try? await Task.sleep(nanoseconds: 50_000_000)
    return 42
}

final class AsyncBasicsTests: XCTestCase {
    func testFetchValue_returns42() async {
        let v = await fetchValue()
        XCTAssertEqual(v, 42)
    }
}

Pelemparan galat asinkron & pernyataan

Gunakan pengujian async throws. Untuk galat tertentu, tangkap dan lakukan pencocokan pola agar maksudnya tetap jelas.

import XCTest

enum NetError: Error { case offline }

func loadNumber(online: Bool) async throws -> Int {
    try await Task.sleep(nanoseconds: 30_000_000)
    if !online { throw NetError.offline }
    return 7
}

final class AsyncThrowingTests: XCTestCase {
    func testLoadNumber_success() async throws {
        let n = try await loadNumber(online: true)
        XCTAssertEqual(n, 7)
    }

    func testLoadNumber_offline_throws() async {
        do {
            _ = try await loadNumber(online: false)
            XCTFail("Expected error")
        } catch NetError.offline {
            // expected
        } catch {
            XCTFail("Unexpected error: \\(error)")
        }
    }
}

Hasil paralel

Konkurensi terstruktur mudah diuji: gunakan async let dan nyatakan hasil akhirnya. Jaga penundaan tetap sangat singkat agar pengujian tidak mudah gagal secara acak.

import XCTest

func compute(_ x: Int) async -> Int {
    try? await Task.sleep(nanoseconds: 10_000_000)
    return x * x
}

final class ParallelTests: XCTestCase {
    func testParallel_asyncLet_sumsSquares() async {
        async let a = compute(2)
        async let b = compute(3)
        let sum = await (a + b)
        XCTAssertEqual(sum, 13) // 4 + 9
    }
}

Pengujian batas waktu

Uji batas waktu dengan mengadu operasi dengan sleep singkat. Gunakan durasi yang sangat kecil agar pengujian tetap cepat dan stabil.

import XCTest

enum TimeoutError: Error { case timedOut }

func withTimeout<T>(
    seconds: Double,
    operation: @escaping () async throws -> T
) async throws -> T {
    try await withThrowingTaskGroup(of: T.self) { group in
        group.addTask { try await operation() }
        group.addTask {
            try await Task.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
            throw TimeoutError.timedOut
        }
        let first = try await group.next()!
        group.cancelAll()
        return first
    }
}

final class TimeoutTests: XCTestCase {
    func testTimeout_timesOutFast() async {
        do {
            _ = try await withTimeout(seconds: 0.01) {
                try await Task.sleep(nanoseconds: 50_000_000) // slower than timeout
                return "OK"
            }
            XCTFail("Expected timeout")
        } catch TimeoutError.timedOut {
            // expected
        } catch {
            XCTFail("Unexpected error: \\(error)")
        }
    }
}

Ekspektasi (lama)

Untuk callback lama, tetap gunakan expectation/wait. Utamakan pengujian asinkron untuk kode baru.

import XCTest

// Legacy API with a completion handler
func legacyFetch(_ completion: @escaping (String) -> Void) {
    Task { try? await Task.sleep(nanoseconds: 20_000_000); completion("done") }
}

final class ExpectationTests: XCTestCase {
    func testLegacy_withExpectation() {
        let exp = expectation(description: "legacy finishes")
        legacyFetch { value in
            XCTAssertEqual(value, "done")
            exp.fulfill()
        }
        wait(for: [exp], timeout: 1.0)
    }
}

Gaya pengujian asinkron modern

Pemeriksaan singkat: Apa praktik terbaik untuk menguji fungsi asinkron?

Ringkasan

Ringkasan: Gunakan metode XCTest async dengan await, nyatakan jalur sukses dan kegagalan, jaga penundaan tetap sangat singkat, dan gunakan ekspektasi hanya untuk callback lama.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menguji kode asinkron (XCTest)” gratis?

Ya — teks lengkap “Menguji kode asinkron (XCTest)” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 3 pelajaran total.

Apa yang akan aku pelajari di “Menguji kode asinkron (XCTest)”?

Tulislah pengujian asinkron dengan XCTest: tandai pengujian sebagai async , gunakan await dan throws , uji kegagalan dan batas waktu, serta tegaskan hasil konkurensi terstruktur. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 3.

Berapa lama pelajaran “Menguji kode asinkron (XCTest)” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Produsen/konsumen, alur, batas waktu
  2. Menjembatani callback lama/Combine ke async/await
  3. Menguji kode asinkron (XCTest)
← Kembali ke Swift Academy