Nỗi ám ảnh “hỏng luồng” ngay trước giờ release
Chiều thứ Sáu, khi cả team chuẩn bị tắt máy đi nhậu thì bug xuất hiện. Kịch bản rất quen thuộc: Bạn vừa merge một tính năng mới và tự tin nó chạy ổn. Thế nhưng, nó lại vô tình làm hỏng luồng Đăng ký (Sign-up) vốn đã hoạt động trơn tru suốt 3 tháng qua.
Tôi từng tham gia refactor một codebase hơn 50,000 dòng cho dự án Fintech. Bài học xương máu rút ra là: Đừng bao giờ tin vào việc test tay hoàn toàn. Chỉ cần sửa một dòng code mà không có bộ UI Test bảo vệ, bạn đang đặt cược với vận may của chính mình. Tuy nhiên, việc viết UI Test cho mobile từ trước đến nay luôn là một trải nghiệm gây mệt mỏi.
Tại sao UI Testing cho Mobile lại khó nhằn đến thế?
Nếu đã từng sờ vào Appium, chắc hẳn bạn hiểu cảm giác dành cả ngày chỉ để cấu hình environment, WebDriver và loay hoay với mớ dependencies rắc rối.
UI Testing thường bị ngó lơ trong các dự án vừa và nhỏ vì ba rào cản lớn:
- Setup quá phức tạp: Bạn phải cài đủ thứ từ Node.js, Appium Server đến các Drivers đặc thù.
- Chạy chậm và thiếu ổn định (Flakiness): Test thường fail vô cớ do độ trễ của emulator hoặc animation của ứng dụng. Một bộ test 20 cases có thể fail 5 cases chỉ vì máy ảo… giật.
- Đòi hỏi ngôn ngữ riêng: Bạn chỉ muốn test UI đơn giản nhưng lại phải học thêm framework bằng Java hoặc Python cồng kềnh.
Các giải pháp phổ biến hiện nay
Trước khi tìm hiểu Maestro, hãy điểm qua những cái tên quen thuộc trên thị trường:
- Appium: Cực kỳ mạnh mẽ nhưng việc bảo trì là cơn ác mộng với các bạn Junior.
- Detox (React Native): Tốc độ nhanh do can thiệp sâu vào code. Tuy nhiên, việc cấu hình ban đầu cho Android cực kỳ tốn thời gian.
- Flutter Integration Test: Tốt cho Flutter, nhưng không phải lựa chọn tối ưu nếu dự án của bạn dùng đa nền tảng hoặc cần một công cụ thống nhất.
Maestro: Đơn giản hóa mọi quy trình
Maestro thay đổi hoàn toàn cách tiếp cận này. Thay vì viết code script phức tạp, bạn định nghĩa các bước test bằng file YAML. Nó hoạt động mượt mà với React Native, Flutter, Native iOS và Android.
Điểm cộng lớn nhất của Maestro là khả năng xử lý animation và độ trễ. Nó tự động chờ element hiển thị, giúp giảm tỉ lệ test fail ảo xuống mức tối thiểu.
Bước 1: Cài đặt Maestro trong 30 giây
Trên macOS hoặc Linux, bạn chỉ cần thực hiện duy nhất một dòng lệnh:
curl -Ls "https://get.maestro.mobile.dev" | bash
Sau đó, hãy khởi động lại terminal và kiểm tra phiên bản để đảm bảo cài đặt thành công:
maestro --version
Lưu ý: Với Windows, bạn nên sử dụng WSL2 để có trải nghiệm tốt nhất.
Bước 2: Gán định danh cho UI Element
Để Maestro tìm thấy các thành phần trên màn hình, chúng ta cần gán ID cho chúng.
- Với React Native: Sử dụng thuộc tính
testID.
<TouchableOpacity testID="login_button" onPress={handleLogin}>
<Text>Đăng nhập</Text>
</TouchableOpacity>
- Với Flutter: Sử dụng
SemanticshoặcTooltip. Maestro cũng hỗ trợ tìm kiếm trực tiếp theo nội dung text hiển thị trên màn hình.
Bước 3: Viết Flow test đầu tiên
Hãy tạo file login_flow.yaml. Giả sử chúng ta cần kiểm tra luồng đăng nhập cơ bản:
appId: com.example.myapp # Bundle ID (iOS) hoặc Package Name (Android)
---
- launchApp
- tapOn: "Email"
- inputText: "[email protected]"
- tapOn: "Mật khẩu"
- inputText: "123456"
- tapOn: "login_button"
- assertVisible: "Chào mừng bạn!"
Cấu trúc này cực kỳ dễ hiểu. Ngay cả các bạn Manual QA cũng có thể tham gia viết và đọc hiểu bộ test mà không cần biết code sâu.
Bước 4: Thực thi và quan sát kết quả
Mở Emulator hoặc Simulator đã cài sẵn app, sau đó chạy lệnh:
maestro test login_flow.yaml
Maestro sẽ tự động thực hiện các thao tác nhấn, nhập liệu và kiểm tra kết quả. Nếu muốn test tự động chạy lại mỗi khi bạn sửa file (giống như Hot Reload), hãy thêm flag -c:
maestro test -c login_flow.yaml
Mẹo nhỏ: Sử dụng Maestro Studio
Đây là tính năng tiết kiệm thời gian nhất. Thay vì phải đoán xem element đó tên là gì, bạn hãy gõ:
maestro studio
Một giao diện web sẽ hiện ra. Bạn chỉ cần di chuột vào bất kỳ thành phần nào trên màn hình máy ảo, Maestro sẽ gợi ý ngay lệnh YAML tương ứng. Bạn chỉ việc copy và dán vào file test.
Tích hợp CI/CD để bảo vệ mã nguồn
Sau khi các flow chạy ổn định tại máy cá nhân, tôi thường đưa chúng vào GitHub Actions. Mỗi khi có Pull Request mới, hệ thống sẽ tự động chạy toàn bộ test case.
Việc này giúp ngăn chặn tình trạng vô tình phá hỏng các tính năng cũ. Lưu ý rằng khi chạy trên CI, bạn cần cấu hình môi trường máy ảo (như macOS runner cho iOS) để Maestro có thể thực thi.
Đừng đợi đến khi ứng dụng gặp lỗi nghiêm trọng trên Production mới bắt đầu viết test. Hãy bắt đầu với những luồng quan trọng nhất như Login hay Checkout bằng Maestro ngay hôm nay. Sự đơn giản của nó sẽ khiến bạn hối hận vì không sử dụng sớm hơn!

