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"])
}