Section 7/121 menit
7. Async Testing
7. Async Testing
Native async/await
swift
@Test("Fetch dan cache user")
func fetchAndCacheUser() async throws {
let service = UserService()
// Pertama fetch — dari network
let user1 = try await service.fetchUser(id: "123")
#expect(user1.id == "123")
// Kedua fetch — dari cache
let user2 = try await service.fetchUser(id: "123")
#expect(user2.id == user1.id)
// Verifikasi sumber
#expect(service.lastFetchSource == .cache)
}
Menguji Concurrent Code
swift
@Test("Concurrent requests tidak menyebabkan data race")
func concurrentRequests() async throws {
let counter = Counter()
// Jalankan 100 increment secara bersamaan
await withTaskGroup(of: Void.self) { group in
for _ in 0..<100 {
group.addTask {
await counter.increment()
}
}
}
let finalCount = await counter.value
#expect(finalCount == 100)
}
Menguji AsyncStream dan AsyncSequence
swift
@Test("EventBus menerima events")
func eventBusReceivesEvents() async throws {
let bus = EventBus<String>()
var received: [String] = []
// Subscribe
let (_, stream) = await bus.subscribe()
// Publish dalam task terpisah
let publishTask = Task {
await bus.publish("event1")
await bus.publish("event2")
await bus.publish("event3")
}
// Collect events (dengan timeout implisit dari .timeLimit trait)
for await event in stream.prefix(3) {
received.append(event)
}
publishTask.cancel()
#expect(received == ["event1", "event2", "event3"])
}