Một sản phẩm không tự nhiên mọc ra nguyên cục. Dev viết function, ghép function thành component, các component gọi nhau, nhiều service ghép thành hệ thống, cuối cùng hệ thống đó đi vào tay người dùng hoặc đội vận hành.

Test một function tính phí và test cả flow chuyển tiền rõ ràng không thể làm y hệt nhau. Đối tượng khác, lỗi muốn bắt khác, môi trường khác. Từ đấy mới sinh ra test level.

Test level là gì?

Test level là một nhóm hoạt động test được tổ chức và quản lý cùng nhau. Mỗi level gắn với một phiên bản nhất định của test object, từ phần nhỏ của code đến cả hệ thống trong bối cảnh sử dụng.

CTFL 4.0.1 dùng năm level:

  1. Component testing
  2. Component integration testing
  3. System testing
  4. System integration testing
  5. Acceptance testing

Bài cũ của mình gộp hai integration level thành Integration Test, cách nói vẫn rất phổ biến trong dự án. Lần này mình tách ra để khỏi có cảnh hai người cùng nói “integration” nhưng một người đang test giữa hai class, người kia đang test giữa app ngân hàng và cổng thanh toán.

V-Model minh họa mối liên hệ giữa hoạt động phát triển và test
V-Model minh họa mối liên hệ giữa hoạt động phát triển và test

V-Model là một cách dễ nhìn để ghép test level với sản phẩm làm việc tương ứng. Nó không có nghĩa mọi dự án phải chờ đi hết một nhánh rồi mới được test.

Component testing

Component testing, nhiều nơi gọi luôn là unit testing, kiểm tra một component trong trạng thái tương đối tách biệt. Component có thể là function, class, module hoặc một đơn vị lớn hơn tùy kiến trúc.

Giả sử có hàm tính phí:

def fee(amount):
    if amount <= 0:
        raise ValueError("amount must be positive")
    return amount * 0.01

Test ở level này quan tâm những thứ như:

Developer thường chịu trách nhiệm chính vì họ ở gần code nhất và sửa ngay tại chỗ. Tester có thể tham gia nếu team cần kỹ năng test hoặc có component test ở mức cao hơn. Chuyện quan trọng không phải đóng dấu “việc dev” hay “việc tester”, mà là component phải có hàng rào trước khi đem đi ghép.

Typical question: Who is responsible for component testing?

Developers usually own most component tests because they work closest to the code. Testers may also contribute depending on the product, skills and required independence.

Component integration testing

Hai component đứng riêng đều chạy ngon chưa nói được lúc gọi nhau chúng sẽ ngon.

Component A gửi amount dạng decimal, component B lại parse integer. Service này timeout sau 10 giây, client đã bỏ cuộc ở giây thứ 3. Bên gửi gọi field là userId, bên nhận chờ customer_id. Đấy là đất của component integration testing.

Các lỗi thường gặp:

Dev có thể test bằng unit/component test với fake, stub hoặc test container. Tester có thể test API hoặc một build tích hợp. Có frontend hay không không phải ranh giới quyết định ai được làm.

Big bang và incremental

Big bang ghép nhiều phần rồi mới test một lượt. Setup ban đầu có vẻ đỡ việc, nhưng failure xuất hiện thì khoanh vùng thủ phạm rất mệt.

Incremental integration ghép dần từng phần. Nếu dependency chưa sẵn sàng, có thể dùng:

Ngày nay team thường tích hợp liên tục, nhưng chữ CI không tự đảm bảo integration test tốt. Pipeline xanh chỉ chứng minh những test đã được viết đang xanh.

System testing

System testing kiểm tra hành vi và đặc tính của cả hệ thống tương đối hoàn chỉnh. Test basis có thể gồm requirement, user story, use case, risk, specification và cả luật mà team đã thống nhất.

Ở level này ta nhìn thấy những flow kiểu:

Một nhóm test độc lập thường làm phần lớn system testing vì góc nhìn tách khỏi implementation rất có ích. Nhưng “chỉ tester mới thực hiện System Test” là câu nói quá tay. Developer, specialist hoặc team khác vẫn có thể tham gia; context và mức độc lập cần thiết mới quyết định.

Typical question: What is system testing?

System testing verifies the behavior and quality characteristics of a complete system against its test basis in an environment representative of its intended use.

System integration testing

System integration testing kiểm tra giao diện giữa hệ thống đang test với hệ thống khác hoặc external service.

Ví dụ app thương mại điện tử gọi payment gateway:

Đoạn này hay bị gom vào integration test hoặc system test, hoàn toàn bình thường. Khi scope lớn lên, tách tên ra giúp team nói rõ đang test bên trong một hệ thống hay đường nối giữa nhiều hệ thống.

Acceptance testing

Acceptance testing đánh giá hệ thống đã sẵn sàng để được chấp nhận, triển khai hoặc sử dụng hay chưa. Nó tập trung vào nhu cầu business, quy trình vận hành, nghĩa vụ hợp đồng hoặc quy định — tùy context.

Người tham gia có thể là end user, khách hàng, Product Owner, đại diện business, đội vận hành hoặc cơ quan có thẩm quyền. Tester thường hỗ trợ môi trường, data, scenario và ghi nhận issue. Quyết định accept thuộc về phía có thẩm quyền chấp nhận, không tự động thuộc tester.

Các dạng thường gặp:

DạngTrọng tâm
User acceptance testingNgười dùng hoặc business có hoàn thành được công việc thật không?
Operational acceptance testingBackup, restore, monitoring, vận hành và hỗ trợ đã sẵn sàng chưa?
Contractual acceptance testingSản phẩm có đạt acceptance criteria trong hợp đồng không?
Regulatory acceptance testingSản phẩm có đáp ứng quy định liên quan không?
Alpha/Beta testingLấy feedback từ người dùng trong môi trường được kiểm soát hoặc ngoài thực tế

UAT không phải buổi khách hàng bấm vài cái rồi ký vì deadline đã đến. Nếu acceptance criteria mơ hồ hoặc môi trường chẳng giống vận hành thật, chữ ký đó chỉ giúp đóng hồ sơ chứ không giúp hệ thống bớt rủi ro.

Có phải lúc nào cũng đi từ thấp lên cao?

Về mặt dependency, component phải tồn tại rồi mới ghép thành system. Nhưng hoạt động test không cần ngồi xếp hàng tuyệt đối.

Trong lúc dev viết component test, tester đã có thể review acceptance criteria, thiết kế system test, chuẩn bị data và contract test. Một số level chạy song song hoặc lặp lại nhiều lần theo từng increment. Đừng nhìn V-Model rồi biến nó thành thác nước bằng bê tông.

Chốt lại

LevelCâu hỏi ngắn
ComponentPhần riêng này có chạy đúng không?
Component integrationCác phần code ghép với nhau có đúng contract không?
SystemCả hệ thống có đáp ứng test basis không?
System integrationHệ thống có nói chuyện đúng với hệ thống khác không?
AcceptanceSản phẩm đã đủ để phía có thẩm quyền chấp nhận chưa?

Biết level giúp xác định test object, mục tiêu, môi trường và người cần tham gia. Bài tiếp theo là Test Plan: trước khi test cả đống thứ này, team phải thống nhất scope, nguồn lực, rủi ro và điều kiện dừng đã.

Nguồn tham khảo