API Testing
===
# Intro 2 API Testing:
- Copy cURL
- Gọi được thông tin của item nào đó bất kì từ API tuy nhiên nó không xuất hiện ở UI.
- Cần hỏi DEV tại sao có thể gọi được
- Domain lấy data cho cái này nhưng API trả về cái khác
- Ví dụ: domainabcxyz/products nhưng trả về customers
- Sửa json => put thông qua API, vẫn cập nhật tới server => có lỗi
- Test xem data có đồng nhất trước khi gửi không? Nếu không, FE lỗi => bugs
- Gửi cái gì, khi nào, chọn gì thì nó gửi lên
# Cách phân biệt lỗi BE và FE:
- Nếu UI hiện sai thì có thể lỗi ở BE hoặc là FE làm không chuẩn (hiếm)
# Kiểu dữ liệu từng field mà BE quy định truyền lên
- Stateless Vs. Stateful => kiến trúc nào thì do PM, BE, (Customers) thiết kế
- Test hiển thị:
- UI có khớp với dữ liệu API trả về không?
- Có hiển thị sai gì không?
- Do FE lấy data xử lý UI hiển thị sai hay do BE trả về dữ liệu sai?
# Test theo required của Product yêu cầu
# Thiết lập các test data cho từng field để test trường hợp biên:
- Trường hợp biên:
- Empty
- NULL
- Data type bị sai
=> Báo lỗi hoặc set default
- Ví dụ:
- Phường Xã không trong Quận => bugs
- Đường bị rỗng (EMPTY) => bugs
- Required fields (Bắt buộc phải nhập) => mà bị NULL hoặc EMPTY => báo lỗi
- Optional fields (Không bắt buộc phải nhập) => để rỗng (EMPTY) có được không?
- Fields nhập int hoặc float => nhưng được nhập str => bugs
- Sẽ không gọi là bugs nếu có xử lý chuyển đổi (convert) từ str sang int:
- Có 2 trường hợp xảy ra:
- Toàn số => có thể chuyển đổi được => backend có thể accept
- Gồm số và chữ => báo lỗi
- Ngoài ra, Front-end có thể xử lý convert trước khi đẩy qua API để server xử lý
- Có sự nhất quán:
- Ví dụ:
- Cho Thuê, gửi nhầm sang Chuyển Nhượng => báo lỗi
- Sang Nhượng, gửi nhầm sang Cho Thuê => không báo lỗi
=> Không nhất quán
- Ví dụ 2: Lỗi ở GET, PUT (Create, Update) phải nhất quán:
- Chiều ngang, chiều dài ở Create => không âm
- Chiều ngang, chiều dài ở Update => cho phép âm
=> không nhất quán => bugs
# Logic của từng field có liên quan tới nhau thì cần list case để test kỹ
# Kết hợp test giữa các api (tạo xong thì kiểm tra xem get về có hay ko? Data đã lưu chưa?)
- Mẹo test:
- Trừ khi 2 API khác => test kỹ
- Test kết hợp UI + API (trong giai đoạn Integration Test)
- Trừ khi BE hay FE thay đổi thì test lại
# Thiếu sót các field mà FE cần sử dụng (Thường sẽ là Change request):
- Đoán được design trong API:
- Đếm fields
- Hidden fields (fields ẩn)
- Ví dụ:
- Các fields mà điền ở Front-end như tên sản phẩm, địa chỉ,...
- Hidden fields như ai tạo? Role nào? username, userID,...
- Bugs có thể do đặc tả không rõ
- Test các trường hợp có thể xảy ra:
- Ví dụ: ở sản phẩm với mã 1000121, lại có logs cụ thể thay đổi gì,... nhưng với sản phẩm mã 1000128 logs lại rỗng.
- Phân tích các khả năng có thể xảy ra:
- Do mới tạo nên logs rỗng => thử cập nhật sản phẩm mới tạo => logs có thay đổi không?
- Không thay đổi? => do role người dùng? => chuyển đổi tài khoản => cập nhật => vẫn không có
- Tiếp tục công việc tới khi tìm ra được tại sao có sự khác biệt
- Nếu vẫn stuck có thể hỏi BE DEV, tại sao có field đó, chức năng field đó là gì
- Phải hiểu các fields được đẩy lên API có mục đích gì
- Nếu không có nhiều thời gian, testcases nên kết hợp với test API
- Sự khác biệt giữa các fields:
- Có => ảnh hưởng như thế nào
- Không => ảnh hưởng như thế nào
# Một số lưu ý khác:
- Không nên tạo data trên DB => dễ lỗi, dễ sót, dễ bugs => không nên allow chuyện này
- Ở Database:
- Đã gửi request tạo ra, sản phẩm được tạo ra nhưng không tạo ra trong DB
- Đã gửi request xóa, sản phẩm bị xóa, nhưng DB không xóa
- Do query "không thông minh"
- Test theo vùng, múi giờ:
- Đang ở GMT+0 hay GMT+7
- Test lúc 0:00 và 23:59 coi GMT đang set ở vùng nào => nếu tăng 2 thì đúng => tăng 1 là sai múi giờ
- API gửi data về (optional không cần phải gắt gao):
- Sắp xếp tăng dần
- Sắp xếp giảm dần
=> Phải có sự nhất quán
- Khi thay đổi data:
- Không cho xài GET
- Xài PUT
- Nếu dư thừa ở data trả về, FE không sử dụng, phải họp team để xem xét có nên bỏ field(s) đó hay không? Có mất thời gian để lượt bỏ không? Có phù hợp để bỏ không?
# Tools:
- Insonma
- [Code Beautify](https://codebeautify.org/file-diff)