Trường Hợp Sử Dụng

Kiểm thử QA cho CAPTCHA trên công cụ tính cước vận chuyển của bạn

Phạm vi an toàn: Chỉ áp dụng cho môi trường QA, staging hoặc pre-production do bạn sở hữu hoặc được uỷ quyền, không phải bên thứ ba.

Bộ test biểu cước xanh trên local rồi đỏ toàn tập khi staging bật reCAPTCHA v2: cách xử lý không phải tắt widget, mà là cấp cho test một token hợp lệ. Coi CAPTCHA như một dependency ngoài — dựng bộ lô hàng cố định, lấy token qua CaptchaAI, gắn vào request, rồi so cước backend trả về với biểu cước.

Bối cảnh quen ở Việt Nam: team logistics hoặc sàn thương mại điện tử tự viết bảng tính cước nội địa, đặt form báo giá sau reCAPTCHA v2 hay Turnstile. Mỗi lần biểu cước đổi, QA phải chứng minh tuyến Hà Nội – TP.HCM 5 kg vẫn đúng giá.

Bước 1: chốt bộ lô hàng mẫu trước khi động vào widget

Giá trị bộ test nằm ở dữ liệu đầu vào. Cố định một tập lô hàng tổng hợp trong repo dạng JSON hoặc YAML:

  • Tuyến: cặp điểm đi – điểm đến: nội thành, liên tỉnh, liên vùng.
  • Khối lượng: một mẫu khối lượng thực, một mẫu khối lượng quy đổi.
  • Trường hợp biên: khối lượng 0, vượt ngưỡng, mã bưu chính sai.
  • Kết quả kỳ vọng: mức cước theo biểu cước, kèm ngày hiệu lực.

Ghi ngày hiệu lực vào từng bản ghi, để khi test đỏ bạn biết lỗi ở code hay bảng giá cũ.

Bước 2: giữ nguyên loại CAPTCHA của production trên staging

Tắt widget cho "dễ test" là bỏ mất đúng đoạn hay hỏng nhất. CaptchaAI hỗ trợ reCAPTCHA v2/v3, Turnstile, Cloudflare Challenge, GeeTest v3, CAPTCHA ảnh/OCR, dạng lưới và BLS; CaptchaFox, Friendly Captcha, Lemin ở giai đoạn beta. hCaptcha, FunCaptcha (Arkose Labs) và GeeTest v4 chưa được hỗ trợ.

Luồng token gồm bốn bước: đọc sitekey, gửi task kèm sitekeypageurl, polling tới khi có kết quả, đặt token vào đúng trường form — g-recaptcha-response với reCAPTCHA v2, cf-turnstile-response với Turnstile. Xem thêm ở hướng dẫn reCAPTCHA v2, TurnstileGeeTest v3.

Bước 3: gọi CaptchaAI từ test bằng Python

Tối thiểu: gửi task, nhận ID task, hỏi kết quả.

import os
import requests

API_KEY = os.environ['CAPTCHAAI_KEY']
QA_PAGE_URL = os.environ['QA_PAGE_URL']  # ví dụ https://staging.example.com/qa-login
QA_SITE_KEY = os.environ['QA_SITE_KEY']


def submit_qa_recaptcha() -> str:
    payload = {
        'clientKey': API_KEY,
        'task': {
            'type': 'NoCaptchaTaskProxyless',
            'websiteURL': QA_PAGE_URL,
            'websiteKey': QA_SITE_KEY,
        },
    }
    response = requests.post(
        'https://api.captchaai.com/createTask',
        json=payload,
        timeout=30,
    )
    response.raise_for_status()
    return response.json()['taskId']


def fetch_qa_result(task_id: str) -> dict:
    payload = {'clientKey': API_KEY, 'taskId': task_id}
    response = requests.post(
        'https://api.captchaai.com/getTaskResult',
        json=payload,
        timeout=30,
    )
    response.raise_for_status()
    return response.json()

Bọc fetch_qa_result bằng vòng polling có timeout: hỏi lại mỗi 5 giây, dừng sau 120 giây. API key đọc từ CI secret. Lần đầu gọi API, xem quickstart.

Bước 4: đối chiếu cước backend theo ba lớp

Có token mới chỉ là qua cổng; phần kiểm thử thật nằm ở phản hồi backend.

  1. Giá: cước cơ bản và từng phụ phí tách riêng — so tổng thì hai lỗi ngược dấu triệt tiêu nhau.
  2. Dịch vụ: mã dịch vụ và thời gian giao đúng cấu hình tuyến.
  3. Lỗi: trường hợp biên trả mã lỗi rõ ràng, không phải cước 0.

Ghi log có cấu trúc mỗi lần chạy — thời gian giải, ID task, mã trạng thái — nối bằng một correlation id. Dữ liệu mẫu lấy từ đơn hàng thật phải ẩn danh trước khi vào repo; Nghị định 13/2023/NĐ-CP là lý do thực tế.

Khi test đỏ: bảng tra nhanh

Vấn đề Nguyên nhân thường gặp Cách xử lý
Test không tìm thấy widget Đổi selector hoặc thời điểm load Kiểm tra wait_for_selector
ERROR_NO_SLOT_AVAILABLE Hàng đợi đầy tạm thời Thử lại với backoff
Backend từ chối token Sai action/sitekey/secret Đối chiếu với cấu hình staging
Số cước lệch biểu cước Payload thiếu trường phụ phí Bổ sung phụ phí vào dữ liệu

Test trình duyệt đỏ mà gọi API lại xanh? Xem bài gỡ lỗi riêng.

Câu hỏi thường gặp

Bật CAPTCHA trên staging có làm bộ test chậm hẳn không?

Mỗi lần giải cộng thêm vài chục giây. Chỉ bật CAPTCHA ở test đi qua form báo giá; test đơn vị gọi thẳng backend.

Team QA thuê ngoài có test được hệ thống của khách hàng không?

Được, miễn có uỷ quyền bằng văn bản cho đúng môi trường staging đó. Mô hình outsourcing phổ biến ở Việt Nam, nên lưu uỷ quyền cùng cấu hình test.

Gói CaptchaAI nào đủ cho một pipeline QA?

BASIC ($15/tháng, 5 thread) đủ cho nightly build của team nhỏ: thread là số CAPTCHA giải đồng thời, không phải hạn mức số lần giải. Nhiều job CI song song thì STANDARD ($30/tháng, 15 thread).

Hướng dẫn liên quan

Lấy API key tại CaptchaAI và cho bộ test biểu cước chạy xanh trở lại trên staging.

Os comentários estão desativados para este artigo.