Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Test Reporting — Allure

Mở đầu — vì sao bài này quan trọng

Hãy tưởng tượng bạn là một QA Engineer vừa chạy xong 800 test case cho một release lớn của sàn thương mại điện tử. Suite chạy xong lúc 2 giờ sáng trên CI, và sáng hôm sau team lead hỏi bạn: "Kết quả thế nào? Cái gì fail? Fail ở bước nào? Có phải lỗi thật không?". Nếu tất cả những gì bạn có là một dòng log 47 passed, 3 failed trong console, hoặc một file HTML mặc định trơ trọi chỉ liệt kê tên test, bạn sẽ mất cả buổi sáng để đào lại log, tìm screenshot, rồi giải thích cho từng người.

Đây chính là khoảng trống mà test reporting lấp đầy. Một bộ test tự động dù mạnh đến đâu cũng vô nghĩa nếu kết quả của nó không được truyền đạt rõ ràng cho những người cần đọc: developer sửa bug, QA lead đánh giá chất lượng, product manager quyết định có release hay không. Trong toàn bộ khóa học này, chúng ta đã học cách viết test và chạy test; bài này tập trung vào một mắt xích thường bị xem nhẹ nhưng cực kỳ quan trọng: cách trình bày kết quả test một cách đẹp, có cấu trúc và thuyết phục.

Và trong thế giới test reporting, Allure Report là một trong những công cụ được yêu thích nhất. Nó biến những con số khô khan thành một dashboard tương tác đẹp mắt, phân loại lỗi theo mức độ nghiêm trọng, gắn screenshot và log vào từng bước, vẽ biểu đồ xu hướng qua thời gian. Bài này sẽ dạy bạn dùng Allure một cách bài bản.

Khái niệm cốt lõi

Allure Report là gì?

Allure là một framework báo cáo test mã nguồn mở, đa ngôn ngữ (hỗ trợ Python/pytest, Java/JUnit-TestNG, JavaScript, C#, Ruby, PHP...). Điểm mấu chốt cần hiểu ngay từ đầu: Allure hoạt động theo mô hình hai giai đoạn.

  • Giai đoạn thu thập (collection): Trong lúc test chạy, một adapter (ví dụ allure-pytest) ghi lại thông tin từng test vào các file JSON trong một thư mục tạm (thường là allure-results). Mỗi file mô tả một test: tên, trạng thái, thời gian, các bước, attachment...
  • Giai đoạn kết xuất (generation): Sau khi test chạy xong, công cụ dòng lệnh allure đọc thư mục allure-resultskết xuất ra một website HTML tĩnh (thư mục allure-report) mà bạn có thể mở trong trình duyệt.
Sự tách bạch này rất quan trọng: framework test của bạn (pytest, TestNG...) hoàn toàn không biết gì về HTML. Nó chỉ ghi dữ liệu thô. Việc render đẹp là nhiệm vụ riêng của Allure CLI. Nhờ vậy, cùng một allure-results có thể được render ở bất kỳ đâu, và bạn có thể gộp kết quả từ nhiều lần chạy song song lại với nhau.

Vì sao đẹp hơn report HTML mặc định?

Report HTML mặc định của pytest (pytest-html) hay của TestNG chỉ cho bạn một bảng phẳng: tên test, pass/fail, thời gian. Allure vượt xa ở những điểm sau:

  • Phân loại theo severity (mức độ nghiêm trọng): blocker, critical, normal, minor, trivial — giúp bạn nhìn ngay đâu là lỗi chết người, đâu là lỗi vặt.
  • Steps (các bước): mỗi test có thể được chia thành các bước con, giúp người đọc thấy chính xác test fail ở bước nào mà không cần đọc code.
  • Attachments (đính kèm): screenshot, log, request/response API, file HTML — gắn trực tiếp vào bước tương ứng.
  • Categories: tự động nhóm các lỗi cùng loại (ví dụ "Product defects" vs "Test defects").
  • Trends & History: biểu đồ xu hướng pass/fail qua nhiều lần build, giúp phát hiện suite đang xuống cấp.
  • BDD-style labels: Epic, Feature, Story — liên kết test với yêu cầu nghiệp vụ.

Các khái niệm annotation chính (Python)

  • @allure.severity(...) — gán mức nghiêm trọng.
  • @allure.feature(...) / @allure.story(...) / @allure.epic(...) — gắn nhãn phân cấp nghiệp vụ.
  • @allure.step(...) hoặc with allure.step(...) — định nghĩa một bước.
  • allure.attach(...) — đính kèm dữ liệu (screenshot, text, JSON).
  • @allure.title(...) — đặt tên dễ đọc thay cho tên hàm test.

Tình huống thực tế

Ví dụ 1 — Tiki: từ "log 3000 dòng" đến dashboard 30 giây

Một team QA giả định tại Tiki phụ trách automation cho luồng checkout. Suite của họ có khoảng 420 test chạy trên Jenkins mỗi đêm. Trước khi dùng Allure, mỗi sáng bạn QA lead phải mở console log dài hơn 3000 dòng để tìm xem test nào fail. Trung bình mất 40 phút chỉ để triage (phân loại) kết quả.

Sau khi tích hợp Allure, họ gắn @allure.severity cho từng test và chia luồng checkout thành các step rõ ràng: "Thêm sản phẩm vào giỏ", "Áp mã giảm giá", "Chọn phương thức thanh toán", "Xác nhận đơn". Giờ đây khi mở report, QA lead thấy ngay: 5 test fail, trong đó 1 test severity blocker fail ở step "Áp mã giảm giá" với screenshot cho thấy mã hết hạn. Thời gian triage giảm còn dưới 5 phút.

Bài học: giá trị lớn nhất của Allure không phải là "đẹp" mà là tốc độ ra quyết định. Khi bạn cấu trúc test thành step và gắn severity, report trở thành công cụ triage chứ không chỉ là bằng chứng.

Ví dụ 2 — Startup fintech Đông Nam Á: attachment cứu một cuộc tranh cãi

Một startup ví điện tử ở Singapore chạy API test cho luồng nạp tiền. Một hôm dev khẳng định "API của tao chạy đúng, test của mày sai". Trước đây cuộc tranh cãi này sẽ kéo dài cả buổi qua Slack. Nhưng team QA đã cấu hình mỗi API test tự động allure.attach cả request body, response body và HTTP status vào report.

Khi mở test fail, dev thấy ngay: request gửi amount: 50000 nhưng response trả về status: 422 với message "currency field required". Hóa ra API vừa thêm field bắt buộc mới mà chưa thông báo. Cuộc tranh cãi kết thúc trong 2 phút, và lỗi được xác định đúng là product defect chứ không phải test defect.

Bài học: attachment biến report từ "lời khẳng định" thành "bằng chứng không thể chối cãi". Với API test, hãy luôn đính kèm request/response.

Ví dụ 3 — Agency outsource: History & Trends thuyết phục khách hàng

Một agency phần mềm ở TP.HCM làm outsource cho khách Nhật. Khách hàng ban đầu nghi ngờ chất lượng test automation của agency. Agency bật tính năng History của Allure (copy thư mục history giữa các lần build) để report hiển thị biểu đồ xu hướng 30 ngày.

Trong buổi review hàng tháng, họ chiếu biểu đồ cho khách xem: tỉ lệ pass ổn định ở mức 98-99%, số flaky test giảm từ 12 xuống 3 sau đợt cải thiện. Con số trực quan này thuyết phục khách gia hạn hợp đồng thêm 6 tháng.

Bài học: Allure không chỉ phục vụ kỹ thuật mà còn là công cụ giao tiếp với stakeholder. Trend chart là ngôn ngữ chung giữa QA và khách hàng.

Hướng dẫn từng bước

Chúng ta sẽ đi qua một ví dụ hoàn chỉnh với Python + pytest, sau đó ghi chú ngắn cho Java.

Bước 1 — Cài đặt

Cài adapter pytest và công cụ CLI:

Adapter ghi kết quả (cài qua pip)

pip install allure-pytest

Công cụ CLI để render report (cài qua package manager)

macOS:

brew install allure

Ubuntu/Debian:

sudo apt-add-repository ppa:qameta/allure && sudo apt update && sudo apt install allure

Hoặc tải bản zip từ github.com/allure-framework/allure2/releases

Lưu ý phân biệt: allure-pytest là thư viện Python; allure (CLI) là một ứng dụng Java riêng, cần JDK 8+ trên máy.

Bước 2 — Viết test có annotation

import allure
import pytest

@allure.epic("Thanh toán") @allure.feature("Nạp tiền ví") class TestNapTien:

@allure.story("Nạp tiền bằng thẻ ngân hàng") @allure.severity(allure.severity_level.CRITICAL) @allure.title("Nạp 100.000đ vào ví thành công") def test_nap_tien_thanh_cong(self): with allure.step("Đăng nhập tài khoản"): token = dang_nhap("user01", "pass") allure.attach(token, "Access Token", allure.attachment_type.TEXT)

with allure.step("Gửi yêu cầu nạp 100.000đ"): resp = nap_tien(token, amount=100000) allure.attach(str(resp.json()), "Response", allure.attachment_type.JSON)

with allure.step("Kiểm tra số dư mới"): assert resp.json()["balance"] == 100000

Điểm cần nhớ: mỗi with allure.step(...) tạo một dòng riêng trong report. Nếu assert fail bên trong step nào, step đó sẽ đỏ, giúp người đọc định vị lỗi tức thì.

Bước 3 — Chạy test và sinh kết quả thô

pytest --alluredir=allure-results

Sau lệnh này, thư mục allure-results/ chứa hàng loạt file JSON — đây là dữ liệu thô, chưa phải report để xem.

Bước 4 — Render và mở report

Cách nhanh: render tạm và mở trình duyệt luôn

allure serve allure-results

Cách chuẩn cho CI: render ra thư mục tĩnh

allure generate allure-results --clean -o allure-report allure open allure-report

allure serve phù hợp khi bạn debug ở local. allure generate tạo ra một thư mục HTML tĩnh mà bạn có thể lưu artifact trên CI hoặc deploy lên web nội bộ.

Bước 5 — Đính kèm screenshot cho UI test (Selenium)

Với UI automation, mẹo hay là chụp screenshot tự động khi test fail:

@pytest.fixture(autouse=True)
def chup_screenshot_khi_fail(request, driver):
    yield
    if request.node.rep_call.failed:
        allure.attach(
            driver.get_screenshot_as_png(),
            name="screenshot-luc-fail",
            attachment_type=allure.attachment_type.PNG,
        )

(Cần thêm hook pytest_runtest_makereport trong conftest.py để có rep_call.)

Bước 6 — Bật History & Trends

Để có biểu đồ xu hướng, trước khi generate bạn phải copy thư mục history từ report cũ vào results mới:

cp -r allure-report/history allure-results/history 2>/dev/null || true
allure generate allure-results --clean -o allure-report

Trên CI, bạn lưu allure-report/history như một artifact và khôi phục nó ở build kế tiếp. Đây là cách Allure "nhớ" các lần chạy trước để vẽ trend.

Ghi chú cho Java

Với Maven, thêm allure-junit5 (hoặc allure-testng) và plugin AspectJ vào pom.xml. Kết quả thô mặc định ghi vào target/allure-results. Các annotation tương đương: @Epic, @Feature, @Story, @Severity, @Step. Lệnh render vẫn là allure serve target/allure-results. Bản chất hai giai đoạn hoàn toàn giống Python.

Lỗi thường gặp & mẹo

1. Mở thẳng file index.html bằng double-click và thấy trang trắng. Đây là lỗi kinh điển. Report Allure là một single-page app dùng AJAX để load JSON, nên nó không chạy qua giao thức file://. Bạn phải phục vụ nó qua HTTP server — dùng allure open hoặc allure serve, đừng mở trực tiếp file.

2. Nhầm lẫn allure-resultsallure-report. allure-results là dữ liệu thô (JSON), allure-report là website đã render. Đừng commit allure-results vào git; đừng cố đọc report bằng cách mở JSON.

3. Quên --clean khi generate. Nếu không có --clean, Allure có thể trộn lẫn kết quả cũ và mới, cho ra report sai. Luôn dùng allure generate --clean cho mỗi lần render mới.

4. Report luôn "trắng" phần Trends. Vì bạn quên copy thư mục history. Không có history thì không có trend — đây là nguyên nhân số một khiến người mới thất vọng.

5. Lạm dụng step đến mức rối. Đừng chia mỗi dòng code thành một step. Step nên phản ánh bước nghiệp vụ (login, add to cart, checkout), không phải chi tiết kỹ thuật. Report tốt là report kể được câu chuyện của test, không phải sao chép source code.

6. Attach dữ liệu nhạy cảm. Cẩn thận với việc attach token, password, thông tin thẻ vào report — nhất là khi report được deploy công khai. Hãy mask (che) các trường nhạy cảm trước khi attach.

Mẹo hiệu năng: với suite lớn hàng nghìn test, thư mục allure-results có thể phình to vì attachment. Chỉ attach screenshot khi test fail, đừng attach cho mọi test pass, để giữ report gọn nhẹ và render nhanh.

Mẹo tích hợp CI: hầu hết các nền tảng CI (Jenkins có Allure plugin riêng, GitLab, GitHub Actions) đều có cách publish report Allure. Dù chúng ta không đi sâu vào CI trong bài này, hãy nhớ nguyên tắc: CI chỉ cần chạy pytest --alluredir=... rồi để bước sau lo việc render và publish.

Bài tập thực hành

  • Cài đặt cơ bản: Tạo một project pytest nhỏ với 3 test (1 pass, 1 fail, 1 skip). Chạy với --alluredir=allure-results, sau đó allure serve và quan sát cách Allure hiển thị 3 trạng thái khác nhau.
  • Cấu trúc hóa: Thêm @allure.epic, @allure.feature, @allure.story cho các test. Vào tab "Behaviors" trong report và xác nhận test được nhóm theo phân cấp nghiệp vụ.
  • Steps + attachment: Viết một test mô phỏng luồng đăng nhập với 3 allure.step. Trong một step, dùng allure.attach để đính kèm một đoạn text (ví dụ giả lập response). Cố tình để một step fail và xác nhận report chỉ ra đúng step đỏ.
  • Severity: Gán 4 mức severity khác nhau cho 4 test. Dùng bộ lọc trong report để chỉ hiển thị các test critical trở lên.
  • Nâng cao — Trends: Chạy suite 3 lần liên tiếp, mỗi lần copy history từ report trước sang. Sau lần thứ 3, mở report và xác nhận biểu đồ Trends hiển thị 3 điểm dữ liệu.

Tóm tắt

Allure Report là công cụ biến kết quả test thô thành một dashboard tương tác, đẹp và — quan trọng hơn — có ý nghĩa hành động. Những ý cốt lõi cần khắc ghi:

  • Allure hoạt động theo hai giai đoạn: adapter ghi JSON vào allure-results, rồi CLI render thành website allure-report. Đừng nhầm hai thư mục này.
  • Cài allure-pytest (Python) và allure CLI (Java-based) là đủ để bắt đầu. Chạy pytest --alluredir=allure-results rồi allure serve allure-results.
  • Giá trị thật của Allure nằm ở severity, steps, attachments, và trends — chúng biến report thành công cụ triage nhanh, bằng chứng thuyết phục, và ngôn ngữ giao tiếp với stakeholder.
  • Ba tình huống thực tế cho thấy Allure rút ngắn thời gian triage từ 40 phút xuống 5 phút, chấm dứt tranh cãi QA-dev bằng attachment, và giữ chân khách hàng bằng trend chart.
  • Tránh các lỗi phổ biến: mở file trực tiếp qua file://, quên --clean, quên copy history, và lạm dụng step.
Khi bạn xây một bộ automation suite hoàn chỉnh ở các bài sau, hãy coi reporting là công dân hạng nhất chứ không phải suy nghĩ thêm sau cùng. Một suite chạy đúng nhưng báo cáo mù mờ sẽ chẳng ai tin; một suite có report Allure rõ ràng sẽ khiến cả team — từ dev đến sếp — tin tưởng vào chất lượng công việc của bạn.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi