Kiểm soát chất lượng
Smoke test và cách liệt kê case
Smoke test trả lời đúng một câu: bản build này có đáng để test tiếp không. Bài này cho bộ tiêu chí chọn case, công thức liệt kê từ chính kiến trúc app, và danh sách đề xuất cho ba module.
Nội dung bài
- Smoke test trả lời câu gì
- Xanh nghĩa là gì, đỏ nghĩa là gì
- Phân biệt với bốn suite sát cạnh
- Sáu tiêu chí để một case được vào smoke suite
- Công thức liệt kê, năm bước
- Trục sống của Alliance App
- Đề xuất cho phần nền chung
- Đề xuất cho ba module
- Năm cách smoke suite chết
- Khi nào chạy, ai chạy
- Smoke ở phía backend
- Giới hạn
Thuật ngữ trong bài (22)
- quality gate · cổng chất lượng
- artifact · sản phẩm dựng
- build · bản dựng
- CI · tích hợp liên tục
- bug · lỗi
- device matrix · ma trận thiết bị
- emulator · máy giả lập
- regression · lỗi tái phát
- release · bản phát hành
- rollback · quay về bản cũ
- rollout · đưa bản mới ra người dùng
- device tier · bậc thiết bị
- low-end · máy cấu hình thấp
- session · phiên đăng nhập
- API · giao diện lập trình
- backend · phần máy chủ
- backward compatibility · tương thích ngược
- deep link · liên kết vào thẳng màn hình
- endpoint · điểm gọi
- migration · chuyển đổi dữ liệu
- offline · không có mạng
- token · khóa truy cập
10 phút
ngân sách cho cả suite
15 case
ngưỡng trên, không phải chỉ tiêu
100%
tỷ lệ pass bắt buộc
0
case được phép chập chờn
Smoke test trả lời câu gì
Tên gọi đến từ điện tử: cấp điện vào bảng mạch mới hàn, thấy khói thì rút điện mang đi sửa — không ai đo tiếp từng chân linh kiện. Smoke test giữ nguyên logic đó.
- Build ra
CI dựng xong, artifact có sẵn
- Smoke suite
10 phút, chạy trước mọi suite khác
- Xanh
mở cửa cho functional, critical path, regression
- Đỏ
trả build, không ai test tiếp
Vì nó là cổng đầu chuỗi, sai ở đây đắt hơn sai ở bất cứ suite nào khác: cổng quá chặt thì chặn oan cả ngày làm việc của đội test, cổng quá lỏng thì cả đội ngồi test một bản build đã chết.
Xanh nghĩa là gì, đỏ nghĩa là gì
Smoke xanh
- Nghĩa là build cài được, mở được, các đường trục còn thông
- Không nghĩa là tính năng làm đúng việc của nó
- Không nghĩa là bản này release được
- Nó chỉ mở cửa cho các suite sau chạy
Smoke đỏ
- Dừng lại, trả build cho dev, ghi đúng một phiếu
- Không mở hai mươi phiếu lẻ rồi test tiếp — mọi kết quả sau đó không đáng tin
- Không "test tránh chỗ đang hỏng"
- Không có ngoại lệ "đỏ này chấp nhận được"
Gạch cuối là ranh giới quan trọng nhất. Một case mà đội sẵn sàng bỏ qua khi nó đỏ là case thuộc regression suite, không thuộc smoke — để nó ở đây chỉ dạy cả đội thói quen phớt lờ màu đỏ.
Phân biệt với bốn suite sát cạnh
Năm suite dưới đây hay bị gọi lẫn tên nhau. Phân biệt bằng câu hỏi mỗi suite trả lời, đừng phân biệt bằng số lượng case.
Sáu tiêu chí để một case được vào smoke suite
1.Câu hỏi chốt — case này đỏ thì còn test tiếp được gì không?
Trả lời được là "còn nhiều" thì case đó không phải smoke. Smoke chỉ gồm case mà đỏ một cái là mọi kết quả sau đó mất nghĩa. Đây là tiêu chí bắt buộc; năm tiêu chí còn lại là bộ lọc thêm.
2.Đi qua, không đi sâu
Một tới ba assertion mỗi case, chỉ ở mức sống hay chết. Không assert business rule, không assert chữ trên nút, không assert định dạng số.
3.Chạm vào hạ tầng dùng chung
Khởi động, đăng nhập, lớp mạng, database và migration, khung điều hướng, push, tải tệp. Hạ tầng chết thì cả ba module chết theo.
4.Phủ bề rộng trước độ sâu
Mỗi module tối thiểu một case. Mười lăm case dồn vào một module là bộ smoke sai hình, dù từng case đều tốt.
5.Ổn định tuyệt đối
Case chập chờn bị gỡ khỏi smoke ngay hôm phát hiện, không chờ sửa xong. "Chạy lại lần nữa xem sao" là câu làm cổng mất hết giá trị.
6.Rẻ và nhanh
Case cần dựng dữ liệu mười phút, hoặc cần hai thiết bị phối hợp, thì hỏi lại: giá trị nó mang có xứng phần ngân sách nó ăn không.
Công thức liệt kê, năm bước
Vẽ trục sống của app
Cài, mở, đăng nhập, khung điều hướng, một vòng ra server, một hành động sinh dữ liệu ở mỗi module, đăng xuất. Mỗi mắt trên trục là một ứng viên, chưa phải một case chắc chắn.
Chấm điểm từng thành phần nền chung
Với mỗi thứ trong phần nền chung — tài khoản, phân quyền, push, tải tệp, đồng bộ ngoại tuyến — hỏi "nó chết thì bao nhiêu module chết theo". Từ hai module trở lên thì vào smoke.
Mỗi module lấy đúng một happy path
Chọn hành động tạo ra giá trị chính của module, đi đường thuận, không nhánh lỗi. Một, không phải ba.
Thêm case chứng minh chính bản build
Cài đè bản đang phát hành chứ không chỉ cài mới, số phiên bản đúng, mở lên không dừng ở splash, không màn trắng.
Sắp xếp rồi cắt từ dưới
Sắp theo "gãy thì bao nhiêu user gãy theo", cắt từ dưới lên cho vừa ngân sách. Cắt case, đừng nới ngân sách — nới một lần là nới mãi.
Trục sống của Alliance App
Ba module Chat, Task, Bán hàng cộng phần nền chung — xem phạm vi sản phẩm. Trục sống vẽ ra như sau, mỗi mắt là chỗ đặt câu hỏi của tiêu chí 1:
- Cài đặt
cài mới và cài đè bản trước
- Mở app
qua splash, tới màn đầu tiên
- Đăng nhập
token về, lưu được, đọc lại được
- Khung điều hướng
ba tab vẽ xong nội dung thật
- Một vòng ra server và về
đúng một request đủ chứng minh lớp mạng còn thông
- Mỗi module một hành động
sinh dữ liệu, đọc lại thấy
- Đăng xuất
token xoá, về màn đăng nhập
Đề xuất cho phần nền chung
Đề xuất cho ba module
Năm cách smoke suite chết
Phình ra thành regression
Mỗi bug lọt ra production lại thêm một case vào smoke. Sáu tháng sau: 120 case, 50 phút, không ai chạy trước khi bàn giao. Luật đổi một đổi một — thêm case mới thì bỏ một case cũ, hoặc để case mới vào regression suite.
Chứa case chập chờn
Đội học được rằng "chạy lại là xanh". Từ lúc đó cổng không chặn gì nữa, chỉ còn tốn mười phút mỗi build.
Assert quá sâu
Đỏ vì đổi chữ trên nút, không vì app hỏng. Smoke đỏ phải luôn nghĩa là "build hỏng", nếu không nó thành tiếng ồn.
Chỉ chạy trên máy mạnh
Xanh trên emulator và máy dev, hỏng trên máy user. Chạy smoke trên máy cấu hình thấp nhất của Tier 1, xem device matrix.
Chạy khi có người nhớ
Smoke thủ công là smoke không chạy. Phần tự động hoá được phải nằm trong CI mỗi build, xem quality gate tự động.
Khi nào chạy, ai chạy
Smoke ở phía backend
Ở quy mô 500.000 user, một lần deploy backend sai làm cả ba module chết cùng lúc trong khi app không đổi một dòng code. Nên phía server có smoke suite riêng, ngân sách 60 giây, chạy tự động ngay sau mỗi lần deploy:
Health endpoint trả 200
tiến trình sống và nhận được request
Một lượt ghi rồi đọc lại
database còn thông, không chỉ còn kết nối
Một lần phát token rồi dùng token đó
lớp xác thực còn hoạt động
Một job nền được nhận và xử lý
queue không đứng
Đỏ ở đây nghĩa là rollback bản deploy, không phải mở phiếu rồi chờ — xem quy trình release và rollback.
Giới hạn
Smoke không tìm bug mới
Nó phát hiện build chết. Tìm bug là việc của functional, exploratory và regression.
Smoke xanh không phải chỉ số chất lượng
Đừng đưa "tỷ lệ smoke pass" vào báo cáo như một thành tích, xem quality metrics.
Suite này cố tình thiếu
Mỗi lần có người muốn "thêm cho đủ", thứ họ đang muốn viết là regression suite. Cảm giác thiếu là dấu hiệu smoke suite còn đúng hình, không phải dấu hiệu phải bổ sung.

