📄️ Chiến lược test theo rủi ro
Senior không chỉ tăng coverage hoặc số mock. Một bộ test hữu ích phải phát hiện failure quan trọng ở nơi nó có thể xảy ra và có chi phí chạy/bảo trì phù hợp. Test thuần logic không thay thế test Android lifecycle; screenshot đúng không chứng minh persistence đúng.
📄️ Test Coroutines & StateFlow
Test nên kiểm tra hành vi người dùng/contract: state cuối đúng, cancellation được giữ, retry không tạo side effect trùng. Tránh dùng Thread.sleep() để chờ một lịch chạy không kiểm soát được.
📄️ Unit test, scheduler và state transition
Local JVM tests phù hợp pure logic/state transformation không cần thiết bị. Khi code phụ thuộc Android API hoặc lifecycle, cần fake/abstraction, môi trường hỗ trợ hoặc instrumented test đúng boundary. Chọn runner JUnit theo toolchain/source set được hỗ trợ; không coi số phiên bản mới hơn tự giải quyết integration.
📄️ MockK
MockK is a mocking library with Kotlin-oriented APIs. It provides APIs for stubbing/verifying Kotlin calls, including suspend functions; choose mocks or fakes according to the behavior under test.
📄️ UI testing, semantics và synchronization
Espresso làm việc với View hierarchy; Compose testing API tìm node theo semantics. Trên Android, createComposeRule() vẫn dùng cơ chế host/instrumentation tương ứng: “không phải chỉ định Activity riêng” không đồng nghĩa “không có Activity” hoặc một JVM test thuần.