Cấu hình repository
Tổ chức repository test theo mẫu User Journey hoặc Feature Test.
Quyết định đặt flow ở đâu và chia thư mục flow thế nào.
Nhiều team đặt flow ngay trong repo của app, cùng một chỗ với mã nguồn (cách này gọi là monorepo: một repo chứa nhiều phần của sản phẩm). Cách này có hai lợi ích:
- Test khớp phiên bản app: mỗi commit có đúng bộ test đi kèm, nên checkout một commit cũ vẫn chạy được test của nó.
- Đổi app và test cùng lúc: một pull request sửa được cả logic app lẫn flow tương ứng.
Các mẫu cấu trúc repository
Phần lớn project chia flow theo một trong hai cách: theo hành trình người dùng (User Journeys), hoặc theo tính năng (Feature Tests). Bảng dưới so sánh hai cách.
| Cách chia | User Journeys (app hướng mục tiêu) | Feature Tests (app hướng thói quen) |
|---|---|---|
| Mục tiêu chính | Người dùng đi hết một quy trình (funnel) | Mọi tương tác nhỏ đều mượt |
| Phù hợp nhất với | Thương mại điện tử, tài chính, giao đồ ăn | Mạng xã hội, nội dung, giải trí |
| Người dùng muốn gì | Làm xong một việc cụ thể (ví dụ đặt đồ ăn) | Dùng và khám phá liên tục |
| Thế nào là thành công | Đi đến cuối funnel | Không có chỗ nào gây khó chịu |
Chọn đúng cách chia giúp bộ test vẫn hợp với app khi app lớn lên. Funnel là chuỗi các bước người dùng đi qua để hoàn thành một việc, như chọn món, thanh toán, nhận xác nhận.
User journeys (app hướng mục tiêu)
Cách này hợp với app thương mại điện tử, giao đồ ăn hoặc tài chính (ví dụ DoorDash, Uber, ngân hàng). Người dùng mở các app này để làm xong một việc: đói thì đặt đồ ăn, ăn xong là thôi dùng.
- Mục tiêu: người dùng đi đến cuối funnel (ví dụ: đơn hàng được xác nhận).
- Cách làm: chia thư mục theo hành trình. Viết các flow end-to-end (chạy từ đầu đến cuối) cho từng biến thể của việc chính, ví dụ giao hàng hoặc tự đến lấy, dùng coupon, hoặc thanh toán qua cổng bên ngoài.
Thường bộ test còn được chia theo nhóm người dùng (mới hoặc đã có tài khoản).
├── flows
│ ├── config.yaml
│ ├── tests
│ │ ├── new_users
│ │ │ ├── register.yaml
│ │ │ └── shopping_first_time_discount.yaml
│ │ └── existing_users
│ │ ├── account_settings.yaml
│ │ ├── deeplink_from_email.yaml
│ │ ├── deeplink_from_notification.yaml
│ │ ├── login.yaml
│ │ ├── shopping.yaml
│ │ └── shopping_bulk_buy_discount.yaml
│ └── utils
│ └── set_discount_code.js
└── src
└── app
└── <code here>Thư mục con cần khai báo trong config.yaml
Nếu chia flow vào các thư mục con như trên, khai báo đường dẫn tìm flow bằng key flows trong config.yaml. Ví dụ, - tests/** báo cho Astra Scout lấy mọi file flow trong thư mục tests và các thư mục con của nó (** nghĩa là mọi cấp thư mục). Key này quyết định flow nào chạy.
Feature tests (app hướng thói quen)
Cách này hợp với app mạng xã hội, đọc tin hoặc giải trí (ví dụ Reddit, Instagram, Spotify). Người dùng ở lại các app này khi mọi thứ mượt mà. Trải nghiệm tốt là tổng của rất nhiều tương tác nhỏ.
- Mục tiêu: người dùng gắn bó lâu và không gặp chỗ nào gây khó chịu.
- Cách làm: chia thư mục theo từng tính năng. Mỗi tính năng cần được test kỹ, vì chỉ một spinner chậm hay một thao tác lỗi cũng đủ khiến người dùng bỏ đi.
Mỗi thư mục flow ứng với một module của app, như sau:
├── flows
│ ├── config.yaml
│ ├── account
│ │ └── set_display_name.yaml
│ ├── auth
│ │ ├── login.yaml
│ │ ├── login_invalid.yaml
│ │ └── login_locked_account.yaml
│ ├── basket
│ │ ├── add_to_cart.yaml
│ │ └── update_cart.yaml
│ └── checkout
│ ├── complete_purchase.yaml
│ └── save_for_later.yaml
└── src
└── app
├── account
│ └── <code here>
├── auth
│ └── <code here>
├── basket
│ └── <code here>
└── checkout
└── <code here>