Vòng lặp
Lặp lại hành động bằng command repeat cho các kịch bản test lặp.
Tự động hóa các tác vụ lặp lại là một trong những lợi ích chính của test end-to-end. Dù bạn thêm nhiều món vào giỏ hàng, xoá một danh sách tin nhắn, hay nhập dữ liệu hàng loạt, vòng lặp cho phép thực thi chuỗi lệnh hiệu quả mà không phải nhân bản code.
Trong flow, vòng lặp được xử lý bằng lệnh repeat. Hướng dẫn này chỉ cách dùng vòng lặp cố định và vòng lặp có điều kiện để tạo flow động và bền vững.
Các chiến lược lặp
Astra Scout có ba cách chính để lặp qua các lệnh. Chọn cách nào tùy thuộc bạn biết chính xác số lần lặp hay vòng lặp phụ thuộc vào trạng thái động của UI.
Số lần lặp cố định (times)
Dùng khi bạn biết chính xác số hành động cần thực hiện. Phù hợp để stress-test một tương tác cụ thể hoặc tạo một số lượng mục nhất định.
# Thêm 5 mục vào danh sách
- repeat:
times: 5
commands:
- tapOn: "Add Item"
- tapOn: "Save"Vòng lặp có điều kiện (while)
Dùng khi bạn không biết chính xác số lần, nhưng biết trạng thái nào sẽ dừng vòng lặp. Hữu ích cho nội dung động có thể khác nhau giữa các run, như phân trang.
# Xóa tin nhắn cho đến khi xuất hiện văn bản "Inbox Empty"
- repeat:
while:
notVisible: "Your inbox is empty"
commands:
- tapOn: "Delete Message"
- tapOn: "Confirm"Mẹo: độ ổn định của UI
Nếu vòng lặp có thao tác chạm nhanh hoặc màn hình thay đổi liên tục, hãy cân nhắc thêm waitForAnimationToEnd vào danh sách commands để đảm bảo UI sẵn sàng cho lần lặp tiếp theo.
Vòng lặp thông minh
Thực hành tốt là luôn có lưới an toàn trong tự động hóa. Bằng cách kết hợp times và while, bạn đảm bảo vòng lặp luôn kết thúc dù trạng thái UI mong đợi không bao giờ xuất hiện (ví dụ do bug hoặc error mạng).
Giả sử bạn muốn tắt mọi thông báo "Update", nhưng muốn giới hạn test ở 10 lần tắt để tránh vòng lặp vô hạn nếu thông báo cứ sinh ra liên tục. Trong ví dụ sau, vòng lặp kết thúc nếu thông báo đã hết hoặc khi chạm 10 lần thử, bảo vệ test khỏi bị treo vô thời hạn.
- repeat:
times: 10
while:
visible: "Update available"
commands:
- tapOn: "Dismiss"
- assertNotVisible: "Dismiss" # Đảm bảo nó biến mất trước vòng lặp kế tiếpThử lại các step cho đến khi thành công
Nếu một nhóm step hay bị flaky và bạn muốn thử lại cả nhóm, hãy bao nó bằng retry. Khối này chạy tối đa maxRetries lần và dừng ở lần thử đầu tiên pass.
- retry:
maxRetries: 3
commands:
- tapOn: "Refresh"
- assertVisible: "Updated just now"Dùng JavaScript cho logic phức tạp
Đôi khi kiểm tra hiển thị đơn giản là chưa đủ. Bạn có thể cần lặp dựa trên một giá trị số hoặc một phép tính. Khi đó, bạn có thể dùng biểu thức JavaScript trong tham số while.
Tùy cách dùng JavaScript, bạn có thể cần khởi tạo biến trước vòng lặp. Ví dụ, nếu dùng bộ đếm, bạn có thể dùng evalScript để đặt giá trị khởi đầu trong đối tượng output của flow. Sau đó, dùng biến này trong điều kiện while.
Trong ví dụ sau, bộ đếm được khởi tạo rồi tăng dần ở mỗi lần lặp.
- evalScript: ${output.attempt = 0}
- repeat:
while:
true: ${output.attempt < 3}
commands:
- tapOn: "Refresh Data"
# Tăng bộ đếm sau mỗi lần thử
- evalScript: ${output.attempt++}Kết hợp flow lồng nhau với vòng lặp
Bạn có thể kết hợp flow lồng nhau với vòng lặp khi cần thực hiện nhiều lần một chuỗi phức tạp, nhiều step (ví dụ tạo năm tài khoản người dùng khác nhau hoặc thêm nhiều sản phẩm vào giỏ). Thay vì làm rối test chính bằng danh sách lệnh dài trong vòng lặp, bạn có thể đóng gói logic vào một subflow và gọi nó bằng runFlow trong khối repeat.
Giả sử bạn cần thêm ba món khác nhau vào giỏ hàng. Bằng cách kết hợp repeat với runFlow và biến env, bạn có thể tạo một test gọn gàng, hướng dữ liệu. Flow chính có thể dùng JavaScript để định nghĩa dữ liệu rồi lặp qua nó, còn subflow xử lý phần tìm và thêm một món.
appId: com.example.shop
---
- launchApp
- evalScript: ${output.items = ["Headphones", "Charger", "Phone Case"]}
- evalScript: ${output.index = 0}
- repeat:
while:
true: ${output.index < output.items.length}
commands:
- runFlow:
file: subflows/add_item.yaml
env:
PRODUCT_NAME: ${output.items[output.index]}
- evalScript: ${output.index++}
- tapOn: "Cart"
- assertVisible: "3 Items"# subflows/add_item.yaml
- tapOn: "Search"
- inputText: ${PRODUCT_NAME}
- pressKey: Enter
- tapOn: "Add to Cart"
- tapOn: "Back to Home"Step tiếp theo
Giờ bạn đã hiểu cách dùng vòng lặp trong flow, hãy tìm hiểu cách dùng thực thi có điều kiện hoặc khám phá mọi khả năng của JavaScript để tạo test.
