Testing Without Documentation: QA phải bắt đầu từ đâu?

Không có documentation, không có đầy đủ requirement. Vậy QA dựa vào đâu để biết hệ thống đang hoạt động đúng hay sai?


Khi làm việc với một hệ thống đã vận hành nhiều năm, QA rất dễ gặp tình huống documentation không còn đầy đủ hoặc không phản ánh đúng behavior hiện tại.

Một số business rules chỉ tồn tại trong code. Một số logic được kế thừa từ phiên bản cũ. Có những chức năng mà ngay cả team hiện tại cũng không hiểu hết.

Trong tình huống này, nếu QA bắt đầu bằng cách viết test cases dựa trên suy đoán, có thể:

  • bỏ sót behavior quan trọng;

  • hiểu sai business rule;

  • hoặc coi một behavior đang được sử dụng là bug.

Vì vậy: 
Khi documentation không đáng tin cậy, việc đầu tiên không phải là viết thêm test case.
Mục tiêu là giảm những điều QA chưa biết về hệ thống.

Bài viết này đi theo một flow đơn giản:

Understand → Collect Evidence → Map Dependencies → Define Test Scope → Validate → Monitor





1. Trước khi viết Test Case, hãy hiểu mình đang test cái gì

Sai lầm phổ biến nhất là bắt đầu viết test khi expected behavior còn chưa rõ.

Hãy tưởng tượng bạn nhận một task:

“Update registration logic to support a new business rule.”

Requirement chỉ có vài dòng.

Không có flow diagram.
Không có tài liệu đầy đủ về business rules hiện tại.
Không có danh sách các chức năng liên quan.

Khi kiểm tra hệ thống, bạn phát hiện:

  • một function được nhiều module sử dụng;

  • một database table được nhiều chức năng đọc và ghi;

  • một số validation không có trong requirement;

  • có scheduled jobs chạy tự động;

  • UI hiện tại khác với documentation cũ.

Lúc này, QA chưa có đủ cơ sở để viết expected result.

Nếu tự suy đoán, test case có thể sai từ đầu.

Nếu chỉ test đúng phần requirement mới, bạn lại có nguy cơ bỏ sót behavior cũ mà những chức năng khác đang phụ thuộc.

Vì vậy,
    Bước đầu tiên không phải là tăng test coverage
    Mà là giảm những điều chưa biết về hệ thống.

QA cần trả lời ba câu hỏi trước

1. Hệ thống hiện tại đang hoạt động như thế nào?
2. Những chức năng nào đang phụ thuộc vào behavior đó?
3. Khi thay đổi, khu vực nào cần được kiểm thử lại?

Mục tiêu ở bước này: chưa cần test nhiều, nhưng phải hiểu đúng phạm vi.

Ba câu hỏi này sẽ định hướng toàn bộ Test Strategy 


2. Khi không biết expected behavior, thì tìm hiểu hệ thống đang hoạt động thế nào - dùng Characterization Testing

QA cần xây dựng lại baseline về behavior hiện tại của hệ thống. Một phương pháp hữu ích là Characterization Testing

Characterization Testing giúp QA ghi nhận hệ thống đang thực sự làm gì, thay vì đoán nó phải làm gì.

Câu hỏi cốt lõi là:

“Với input và điều kiện này, hệ thống hiện tại thực sự trả ra kết quả gì?”

Ví dụ với chức năng Registration:

Thành phầnĐiều cần tìm hiểu
InputPlayer, event, class, registration status
OutputSuccess message, error message, registration result
DatabaseRecord được tạo, cập nhật hoặc xóa
Side effectsEmail, notification, waitlist update
Related behaviorRegistration list, registration history, reports

Giả sử khi đăng ký thành công, hệ thống:

  1. Kiểm tra điều kiện đăng ký.
  2. Tạo registration record.
  3. Cập nhật trạng thái.
  4. Gửi email xác nhận.
  5. Cập nhật danh sách registration.

QA có thể viết test để ghi nhận những behavior này.

Ví dụ:

  • Registration thành công phải tạo đúng record.

  • Registration thất bại không tạo dữ liệu ngoài mong muốn.

  • Email xác nhận được gửi khi đăng ký thành công.

  • Registration status trên admin được cập nhật đúng.

  • Dữ liệu liên quan không bị thay đổi sai.

Điểm cần nhớ

Characterization Test không chứng minh behavior hiện tại là đúng về business. Nó chỉ giúp QA biết behavior nào đang tồn tại.

Nếu gặp behavior lạ, vẫn cần xác minh với Developer hoặc Business Owner trước khi xác định expected result chính thức.


3. Không có Documentation thì tìm Evidence ở đâu?

Một nguồn thông tin hiếm khi đủ. QA cần ghép nhiều evidence lại với nhau.

NguồnQA có thể tìm hiểu
UIUser nhìn thấy và thao tác được gì
Source codeLogic, validation, conditions
DatabaseDữ liệu được lưu và thay đổi thế nào
LogsRequest đã đi qua đâu, lỗi phát sinh ở bước nào
Support ticketsNgười dùng thường gặp vấn đề gì
Incident historyProduction từng lỗi ở đâu
AnalyticsFlow nào được dùng nhiều
Release notesHệ thống đã từng thay đổi gì
User manualsNghiệp vụ được vận hành ra sao

Cách đọc evidence hiệu quả

  • UI → thấy behavior từ phía user.

  • Source code → hiểu logic xử lý.

  • Database → thấy dữ liệu thật.

  • Logs → thấy quá trình thực thi.

  • Tickets / incidents → thấy lỗi thực tế đã từng xảy ra.

Ví dụ:

Documentation nói rằng một registration chỉ có một Age group.

Nhưng database lại lưu nhiều Age group, và admin UI dùng dữ liệu đó để hiển thị registration history.

Nếu chỉ đọc documentation, QA rất dễ bỏ qua phần này.

Đừng hỏi “Nguồn nào đúng nhất?”. Hãy hỏi “Các nguồn này có đang kể cùng một câu chuyện không?”.


4. Dependency Mapping: Một thay đổi có thể ảnh hưởng đến những gì?

Hiểu behavior của một chức năng vẫn chưa đủ. QA còn cần biết chức năng đó đang được những thành phần nào sử dụng

Vì test đúng feature nhưng bỏ sót dependency vẫn có thể làm release lỗi.

Đây là lý do cần Dependency Mapping.

Điểm cần nhớ

Dependency Mapping giúp xác định các thành phần có quan hệ phụ thuộc với chức năng đang được thay đổi. Từ đó, QA có thể xác định những khu vực cần regression testing.

Ví dụ Registration Module có thể liên quan đến:

  • Registration Form

  • Registration API

  • Business logic

  • Database

  • Scheduled jobs

  • Email service

  • Reports

  • Export data

Có thể hình dung:

Registration Form → API → Database → Jobs → Reports / Notifications

Nếu Developer thay đổi logic lưu registration, QA không nên chỉ test UI.

Cần kiểm tra thêm:

  • Record có lưu đúng không?

  • Module khác đọc record đó có còn đúng không?

  • Scheduled job có xử lý đúng không?

  • Report có hiển thị đúng không?

Cách tìm dependency

  1. Search nơi function hoặc API được gọi.
  2. Kiểm tra database tables và queries liên quan.
  3. Tìm scheduled jobs dùng dữ liệu đó.
  4. Kiểm tra external integrations.
  5. Trao đổi với Developer hoặc owner của module.

Không cần hiểu cả hệ thống. Bắt đầu từ điểm thay đổi, rồi lần theo những thứ đang phụ thuộc vào nó.


5. Xây dựng Test Coverage: Không thể test mọi thứ: ưu tiên gì trước?

Test coverage tốt không có nghĩa là test tất cả. Nó có nghĩa là test đúng nơi có rủi ro cao nhất.

Một hệ thống đã vận hành nhiều năm có thể có hàng trăm chức năng và rất nhiều business rules. Không thể chạy toàn bộ test cases sau mỗi thay đổi. Vì vậy, cần ưu tiên những luồng có mức độ quan trọng cao.

Một cách hữu ích là xác định Golden Paths.

Golden Paths là các luồng quan trọng mà hệ thống phải duy trì ổn định.

Có thể ưu tiên dựa trên:

  • Business impact – lỗi có ảnh hưởng nghiệp vụ lớn không?

  • Usage frequency – flow có được dùng thường xuyên không?

  • Risk of failure – có nhiều dependencies không?

  • Data criticality – có ảnh hưởng dữ liệu khó khôi phục không?

Ví dụ với Registration System:

  • User đăng ký thành công.

  • Class full → user vào waitlist.

  • Admin cập nhật registration status.

  • Registration bị rejected hoặc cancelled.

  • Reports hiển thị đúng số lượng.

Những luồng này nên được đưa vào smoke test hoặc regression suite tùy theo mức độ ảnh hưởng của từng thay đổi.

Smoke Test vs Regression Test

Smoke Test
Kiểm tra nhanh những chức năng cốt lõi sau khi deploy.

Regression Test
Kiểm tra các behavior hiện có để phát hiện lỗi do thay đổi mới gây ra.

Phạm vi regression nên đi theo impact analysis, không nên mặc định “chạy tất cả”.


6. Historical Bugs là một nguồn Test Coverage rất giá trị

Bug đã từng xảy ra là bằng chứng rõ nhất về nơi hệ thống dễ vỡ.

Historical bugs có thể giúp QA nhận ra:

  • module nào thường lỗi;

  • edge case nào dễ bị bỏ sót;

  • dependency nào dễ gây side effect;

  • business rule nào có nhiều ngoại lệ.

Ví dụ:

Một player đăng ký hai chương trình khác nhau nhưng conflict message chỉ hiển thị một chương trình.

Sau khi fix, regression test nên bao gồm:

  • Một conflict → hiển thị đúng.

  • Nhiều conflicts → hiển thị đầy đủ.

  • Thứ tự đăng ký không làm thay đổi kết quả ngoài mong muốn.

Một production bug quan trọng không nên kết thúc bằng “fix xong rồi close”. Nó nên để lại một regression test, checklist hoặc monitoring rule.


7. Gặp behavior lạ: đừng vội gọi đó là bug

“Không có trong requirement” chưa chắc đồng nghĩa với “sai”.

Một behavior lạ có thể là:

  • bug cũ;

  • business rule chưa document;

  • workaround;

  • logic mà hệ thống khác đang phụ thuộc.

Ví dụ:

  • Status tự đổi.

  • Record vẫn được giữ sau khi cancel.

  • Một validation không có trong requirement.

  • Scheduled job sửa dữ liệu tự động.

QA nên:

  1. Ghi nhận behavior.
  2. Reproduce lại.
  3. Kiểm tra bug history, logs, release notes.
  4. Tìm dependency liên quan.
  5. Xác minh với Developer hoặc Business Owner
  6. Ghi lại quyết định cuối cùng.

Hai khái niệm cần tách rõ

Behavior đang tồn tại
≠
Behavior được business xác nhận là đúng

QA không nên tự biến behavior hiện tại thành expected behavior nếu chưa có evidence đủ mạnh.


8. Testing không kết thúc ở Staging

Pass regression chưa có nghĩa là release không còn rủi ro.

Production có thể khác môi trường test ở:

  • data;

  • traffic;

  • integration;

  • scheduled jobs;

  • những combination hiếm.

Vì vậy Test Strategy nên bao gồm cả kế hoạch sau release. Đặc biệt với những hệ thống có nhiều dependencies, một thay đổi có thể hoạt động tốt trong môi trường test nhưng vẫn phát sinh vấn đề khi chạy với dữ liệu và traffic thực tế.

Một số phương pháp team có thể sử dụng:

Feature Flag

Cho phép bật/tắt feature mới bằng config.

Canary Release

Deploy cho một nhóm nhỏ user trước.

Enhanced Logging

Theo dõi:

  • request;

  • database operations;

  • error;

  • scheduled jobs;

  • trạng thái xử lý.

Rollback Plan

Cần xác định trước:

  • rollback code như thế nào;

  • database có cần rollback không;

  • dữ liệu đã thay đổi có khôi phục được không.

Ví dụ sau khi update Registration Logic

Có thể monitor:

  • số registration thành công;

  • số registration fail;

  • error mới;

  • trạng thái scheduled jobs;

  • dữ liệu giữa registration và reports có khớp không.

Test Strategy tốt không chỉ nói “test gì trước release”, mà còn phải nói “sau release cần nhìn vào đâu để biết hệ thống vẫn ổn”.


9. Practical Checklist: Không có Documentation thì bắt đầu từ đâu?

Khi nhận một task trên hệ thống thiếu tài liệu, QA có thể sử dụng checklist sau:

Step 1 – Understand Current Behavior

  • Thử flow hiện tại.

  • Ghi nhận input, output, state change.

  • Kiểm tra side effects.

  • Tạo characterization tests.

Step 2 – Collect Evidence

  • Kiểm tra Source code và Database.

  • Tìm kiếm Logs của application.

  • Tìm lại Historical bugs và Support tickets.

  • Kiểm tra Release notes.

  • Xác minh với Developer / Business Owner.

Step 3 – Map Dependencies

  • Tìm và xác định những Module Shared function / API.

  • Xác định Database tables và stored procedures liên quan.

  • Kiểm tra Scheduled jobs và External integrations.

  • Xác định Downstream systems có thể bị ảnh hưởng.

Step 4 – Define Test Scope

  • Xác định Golden Paths.

  • Ưu tiên business-critical và High-risk flows.

  • Bổ sung Regression tests từ Historical bug.

  • Xác định Smoke scope và Regression scope cho task hiện tại.

Step 5 – Control Release Risk

  • Xác định Logs và Metrics cần theo dõi.

  • Chuẩn bị Feature flag / limited rollout nếu cần.

  • Xác định Rollback plan.

  • Theo dõi Production verification sau release.


Takeaway

Không có documentation không có nghĩa QA không thể test. Nhưng QA không nên nhảy thẳng từ requirement thiếu sang test case.

Một flow an toàn hơn là:

Understand → Collect Evidence → Map Dependencies → Define Test Scope → Validate → Monitor

Một Test Strategy tốt cần trả lời được:

  • Expected behavior này dựa trên evidence nào?

  • Thay đổi có thể ảnh hưởng đến đâu?

  • Tại sao những test case này được ưu tiên?

  • Rủi ro nào vẫn chưa được xác minh?

  • Sau release cần monitor gì?

Khi documentation không có sẵn, QA không chỉ làm nhiệm vụ tìm bug. QA còn phải từng bước tái xây dựng hiểu biết về hệ thống để mọi thay đổi sau đó có thể được test một cách có cơ sở.

Đăng nhận xét

Mới hơn Cũ hơn