Hồi mới học testing mình gặp một đống từ kết thúc bằng chữ test: Unit Test, Smoke Test, Static Test, Regression Test, Performance Test. Nhìn qua cứ tưởng chúng nằm chung một bảng phân loại, học hết bảng là xong.

Không có cái bảng thần kỳ đó.

System Test nói về test level. Functional Test nói về đặc tính đang kiểm tra. Static Test nói về có chạy đối tượng hay không. Regression Test lại nói về mục đích sau một thay đổi. Một bài test hoàn toàn có thể đeo vài nhãn cùng lúc.

Ví dụ: tester chạy lại flow chuyển tiền sau khi dev sửa cách tính phí. Đây có thể đồng thời là system testing, dynamic testing, functional testing và regression testing. Không có nhãn nào đấm nhau cả.

Test level không phải test type

Bốn level thường gặp đã nằm ở bài Testing Levels:

LevelTest object thường gặpMục tiêu chính
Component testingFunction, class, module hoặc componentKiểm tra từng phần riêng
Component integration testingGiao diện giữa các componentKiểm tra cách các phần code nói chuyện với nhau
System testingMột hệ thống tương đối hoàn chỉnhKiểm tra hành vi end-to-end và đặc tính hệ thống
Acceptance testingSản phẩm trong bối cảnh sử dụng hoặc vận hànhĐánh giá hệ thống đã sẵn sàng để được chấp nhận chưa

Team vẫn hay nói “loại test này là UAT”, người nghe vẫn hiểu. Nhưng khi cần giải thích cho rõ thì cứ gọi đúng chiều phân loại của nó.

Static testing và dynamic testing

Static testing

Static testing kiểm tra một work product mà không chạy chính đối tượng đó. Review requirement, walkthrough test case, code review và static analysis đều nằm trong vùng này.

Giả sử requirement ghi:

Mật khẩu phải dài từ 8 đến 16 ký tự và tối thiểu 20 ký tự nếu là tài khoản quản trị.

Chưa cần build cũng thấy hai rule đá nhau nếu tài khoản quản trị vẫn bị giới hạn 16 ký tự. Bắt được ở đây thì sửa một đoạn document. Đợi đến system test mới bắt thì BA, dev, tester và có khi cả database cùng làm lại.

Static testing phát hiện defect trong requirement, design, code hay testware. Bugdefect thường được dùng như từ đồng nghĩa; không có luật rằng bug chỉ nằm trong code còn defect chỉ nằm trong document. Phần đó đã xử lý ở Error, Defect và Failure.

Dynamic testing

Dynamic testing cho test object chạy rồi quan sát hành vi. Gọi một function trong unit test, bắn request vào API hay bấm app trên điện thoại đều là dynamic testing.

Nếu actual result lệch expected result, thứ ta quan sát được là failure. Từ failure đó team mới điều tra defect nằm ở code, config, data hay chỗ nào khác.

Functional testing và non-functional testing

Functional testing

Functional testing hỏi hệ thống làm gì. Nó kiểm tra business rule, flow, tính toán và những hành vi đã được yêu cầu.

Ví dụ với đăng nhập:

Smoke testing thường chọn một nhóm chức năng quan trọng để xem build có đủ ổn cho việc test sâu hơn không. Còn chữ sanity test được mỗi công ty dùng một kiểu; đừng tranh luận bằng mồm, hãy hỏi scope thực tế của bộ test đó gồm những gì.

Non-functional testing

Non-functional testing hỏi hệ thống làm tốt đến đâu hoặc có những đặc tính chất lượng nào. Một số nhóm quen thuộc:

NhómCâu hỏi ví dụ
PerformanceAPI chịu được bao nhiêu request và phản hồi trong bao lâu?
SecurityNgười không có quyền có đọc được dữ liệu này không?
UsabilityNgười dùng có hiểu và hoàn thành được flow không?
AccessibilityNgười dùng bàn phím hoặc screen reader có thao tác được không?
CompatibilityTính năng có chạy đúng trên browser, OS hoặc thiết bị được hỗ trợ không?
ReliabilityHệ thống có duy trì hoạt động ổn định trong điều kiện đã nêu không?

UI testing không nằm gọn trong một phía. Click nút gửi form và kiểm tra request là functional; kiểm tra focus, contrast và cách screen reader đọc form lại nghiêng về non-functional.

Black-box và white-box

Black-box testing thiết kế test dựa trên input, output và hành vi được mô tả, không dựa vào cấu trúc bên trong. Equivalence partitioning, boundary value analysis, decision table và state transition là các kỹ thuật black-box.

White-box testing dựa trên cấu trúc bên trong như statement, branch hoặc đường đi của code. Biết source code tồn tại không tự động biến mọi test thành white-box; test phải thật sự dùng cấu trúc đó để chọn coverage item.

Giữa hai phía còn có chữ gray-box, dân dự án dùng khá nhiều để chỉ tình huống tester biết một phần kiến trúc, database hoặc implementation rồi tận dụng nó khi test. Đây là cách nói thực dụng, không phải một nhóm kỹ thuật chính trong CTFL.

Confirmation testing và regression testing

Dev báo bug đã fixed. Ta có hai câu hỏi khác nhau:

  1. Con bug cũ đã hết chưa?
  2. Thay đổi vừa rồi có làm hỏng thứ khác không?

Confirmation testing trả lời câu đầu. Chạy lại điều kiện từng làm bug xuất hiện và kiểm tra fix có hoạt động không. Mọi người thường gọi là retest.

Regression testing trả lời câu thứ hai. Ta chọn các vùng có thể chịu ảnh hưởng và chạy lại test liên quan. Có lúc phải chạy cả bộ, nhưng không có luật rằng mỗi bug fix đều kéo toàn bộ kho test case ra chạy từ đầu đến cuối.

Giả sử dev sửa query đăng nhập:

Scope regression là bài toán impact và risk. “Chạy hết cho chắc” nghe an toàn, đến lúc bộ test chạy ba ngày mà tối nay phải release thì nó bắt đầu bớt chắc.

Exploratory, ad-hoc và monkey testing

Exploratory testing là lúc học sản phẩm, thiết kế test và thực thi test diễn ra cùng nhau. Nó vẫn có thể có charter, timebox, note và debrief. Không có test case viết sẵn không đồng nghĩa với không có đầu óc.

Ad-hoc testing ít formal hơn, dựa nhiều vào trực giác và hiểu biết của người test tại thời điểm đó. Monkey testing lại thiên về thao tác ngẫu nhiên hoặc bán ngẫu nhiên, đôi khi do tool sinh ra. Ba chữ này hay bị quẳng chung vào một rổ “bấm linh tinh”, nhưng làm vậy thì mất sạch ý nghĩa.

Ví dụ mình muốn exploratory test màn hình upload file trong 45 phút. Charter có thể là:

Tìm cách làm upload thất bại hoặc tạo trạng thái khó hiểu bằng loại file, kích thước file và việc mất mạng.

Từ đó mình vừa thử, vừa học constraint, vừa ghi lại đường đi tiếp theo. Nó tự do hơn scripted testing, nhưng không phải ngồi đập bàn phím cầu bug hiện lên.

Chốt lại

Khi ai đó nói “đây là loại test gì?”, hỏi ngược một câu là đủ:

Bạn đang muốn phân loại theo level, theo đặc tính chất lượng, theo cách thiết kế hay theo mục đích chạy lại?

Xác định đúng cái trục rồi thì đống thuật ngữ tự nhiên bớt loạn. Bài tiếp theo sẽ đi từ các test condition sang high-level test case và RTM, tức là bắt đầu biến requirement thành thứ có thể quản lý coverage được.

Nguồn tham khảo