DEV Community

Cover image for Apidog và Schemathesis: Kiểm thử chức năng và hợp đồng so với Kiểm thử Fuzzing dựa trên thuộc tính
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Apidog và Schemathesis: Kiểm thử chức năng và hợp đồng so với Kiểm thử Fuzzing dựa trên thuộc tính

Nếu bạn đang so sánh Apidog và Schemathesis để đưa vào CI, đừng xem chúng như lựa chọn “cái này hoặc cái kia”. Schemathesis phù hợp cho fuzzing dựa trên schema để tìm lỗi biên khó đoán. Apidog phù hợp để thiết kế API, viết test chức năng/test hợp đồng có chủ đích, mock endpoint và chạy test trong CI/CD. Bài viết này phân chia rõ vai trò của từng công cụ và cách dùng cả hai trong một pipeline thực tế. Nếu cần nền tảng rộng hơn, xem thêm hướng dẫn kiểm thử API toàn diệnmã nguồn/tài liệu Schemathesis trên GitHub.

Dùng thử Apidog hôm nay

Tóm tắt nhanh

Schemathesis là công cụ fuzzing dựa trên thuộc tính. Bạn đưa vào schema OpenAPI hoặc GraphQL, Schemathesis sẽ tự sinh nhiều biến thể request để tìm lỗi như:

  • API trả về 500 với input biên.
  • Response không khớp schema.
  • API chấp nhận dữ liệu không hợp lệ.
  • Contract giữa implementation và spec bị lệch.

Schemathesis được xây dựng trên Hypothesis, thư viện property-based testing của Python.

Demo Schemathesis

Apidog là nền tảng API all-in-one. Bạn có thể thiết kế API trực quan, viết test chức năng và contract test, chạy test với dữ liệu CSV/JSON, mock endpoint, tạo tài liệu và tích hợp CI/CD bằng apidog run. Apidog hỗ trợ REST, gRPC, WebSocket, SSE, SOAP và GraphQL trong cùng một workspace.

Cách phân chia đơn giản:

  • Dùng Schemathesis để tìm lỗi không đoán trước từ schema.
  • Dùng Apidog để xây dựng bộ test có chủ đích, có thể review và duy trì bởi team.

Schemathesis giỏi ở điểm gì?

Schemathesis đọc schema như một contract, sau đó cố gắng phá vỡ contract đó bằng cách sinh input từ type, constraint và operation đã khai báo.

Ví dụ, với một OpenAPI schema có field:

age:
  type: integer
  minimum: 0
  maximum: 120
Enter fullscreen mode Exit fullscreen mode

Schemathesis có thể tự tạo nhiều giá trị hợp lệ và không hợp lệ để kiểm tra API có xử lý đúng hay không.

Các lỗi thường phát hiện được:

  • 500 Internal Server Error do input biên.
  • Response thiếu field bắt buộc.
  • Response có type sai so với schema.
  • API trả về 2xx cho dữ liệu đáng lẽ phải bị reject.
  • Endpoint hoạt động khác với spec đã publish.

Một điểm mạnh thực tế là khả năng thu nhỏ lỗi. Khi phát hiện bug, Schemathesis cố gắng rút gọn payload thành input nhỏ nhất vẫn tái tạo được lỗi. Điều này giúp debug nhanh hơn nhiều so với việc đọc một payload lớn.

Bạn có thể chạy Schemathesis bằng CLI:

schemathesis run openapi.yaml --base-url http://localhost:8000
Enter fullscreen mode Exit fullscreen mode

Hoặc dùng trong CI:

name: schemathesis

on:
  pull_request:
  schedule:
    - cron: "0 2 * * *"

jobs:
  fuzz-api:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Schemathesis
        run: |
          pip install schemathesis
          schemathesis run openapi.yaml --base-url http://localhost:8000
Enter fullscreen mode Exit fullscreen mode

Schemathesis hỗ trợ OpenAPI 2.0, 3.0, 3.1 và GraphQL. Nó phù hợp nhất khi:

  • Spec của bạn tương đối chính xác.
  • Team muốn tự động khám phá input space.
  • Bạn cần phát hiện lỗi biên mà test viết tay thường bỏ sót.
  • Pipeline của bạn có chỗ cho fuzzing job riêng hoặc job chạy định kỳ.

Giới hạn cần hiểu rõ: Schemathesis là công cụ testing, không phải nền tảng thiết kế API, mock API, tài liệu hóa hoặc cộng tác cho nhiều vai trò. Nó cũng thiên về CLI/Python hơn là giao diện trực quan.

Apidog giỏi ở điểm gì?

Apidog xử lý các phần còn lại của vòng đời API: thiết kế, mock, test chức năng, contract test, tài liệu và CI/CD.

Bạn có thể dùng Apidog để:

  • Thiết kế API trực quan với OpenAPI làm nguồn đáng tin cậy.
  • Viết test chức năng bằng assertion trực quan.
  • Tạo kịch bản kiểm thử truyền dữ liệu giữa nhiều bước.
  • Chạy kiểm thử hợp đồng để xác nhận API thực tế vẫn khớp spec.
  • Chạy test dựa trên dữ liệu CSV/JSON bằng apidog run -d.
  • Mock endpoint trước khi backend hoàn thiện.
  • Tích hợp test vào CI/CD bằng lệnh apidog run.
  • Kiểm thử REST, gRPC, WebSocket, SSE, SOAP và GraphQL trong cùng một nơi.

Ví dụ workflow thực tế với Apidog:

  1. Thiết kế endpoint POST /orders.
  2. Định nghĩa request/response schema.
  3. Mock response 201 Created để frontend tích hợp sớm.
  4. Viết test case:
    • Payload hợp lệ trả về 201.
    • Response có orderId.
    • orderId không rỗng.
    • Token hết hạn trả về 401.
  5. Chạy test trong CI bằng apidog run.

Ví dụ command CI:

apidog run --project-id <PROJECT_ID> --env-id <ENV_ID>
Enter fullscreen mode Exit fullscreen mode

Nếu muốn chạy cùng nhiều bộ dữ liệu:

apidog run --project-id <PROJECT_ID> --env-id <ENV_ID> -d ./orders.csv
Enter fullscreen mode Exit fullscreen mode

Điểm cần nói rõ: Apidog không thay thế property-based fuzzing của Schemathesis. Apidog có kiểm thử monkey, tức gửi input ngẫu nhiên vào API. Nhưng monkey testing không giống property-based testing.

Khác biệt chính:

  • Monkey testing: input ngẫu nhiên, ít cấu trúc.
  • Property-based testing: input được sinh chiến lược từ schema/type/constraint và kiểm tra thuộc tính tổng quát.

Nếu bạn cần fuzzing dựa trên thuộc tính từ schema, Schemathesis là công cụ phù hợp. Nếu bạn cần test có chủ đích, mock, tài liệu, CI và hỗ trợ đa giao thức, Apidog là lớp phù hợp.

So sánh trực tiếp

Khả năng Apidog Schemathesis
Công việc chính Kiểm thử chức năng + hợp đồng, thiết kế, giả lập, tài liệu Fuzzing dựa trên thuộc tính từ schema
Soạn kiểm thử Xác nhận trực quan, không cần code + kịch bản Tự động tạo từ schema; thuộc tính trong code
Chiến lược đầu vào Các trường hợp có chủ đích + dựa trên dữ liệu CSV/JSON Đầu vào được tạo trên toàn bộ input space của schema
Tìm trường hợp biên không xác định Hạn chế; monkey testing không phải property-based fuzzing Có, đây là thế mạnh cốt lõi
Kiểm tra contract/schema Có, bằng contract testing Có, xác thực response dựa trên spec
Giao thức REST, gRPC, WebSocket, SSE, SOAP, GraphQL OpenAPI REST + GraphQL
Mock API Không
Thiết kế API + tài liệu Không
CI/CD apidog run CLI, Docker, GitHub Action, pytest
Giao diện Ứng dụng desktop + CLI CLI / Python library
Đối tượng phù hợp Dev, QA, tech lead, frontend, technical writer Kỹ sư quen Python/CLI

Kết luận từ bảng: Apidog rộng hơn và phù hợp cho workflow có chủ đích. Schemathesis hẹp hơn nhưng mạnh hơn trong việc tự động sinh input để tìm lỗi biên.

Cách dùng cả hai trong cùng một workflow

Bạn không cần chọn một. Cách triển khai hiệu quả là chia pipeline thành hai lớp.

1. Dùng Apidog cho lớp test có chủ đích

Dùng Apidog cho các case mà team biết rõ và muốn duy trì lâu dài.

Ví dụ:

  • Tạo đơn hàng hợp lệ trả về 201.
  • Response có orderId.
  • Token hết hạn trả về 401.
  • User không có quyền trả về 403.
  • Checkout flow truyền cartId từ bước tạo giỏ hàng sang bước thanh toán.
  • API vẫn khớp OpenAPI contract sau mỗi pull request.

Các test này nên chạy như quality gate trong CI vì chúng có tính xác định cao.

Ví dụ pipeline:

name: api-functional-tests

on:
  pull_request:
    branches:
      - main

jobs:
  apidog-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Apidog tests
        run: |
          apidog run --project-id ${{ secrets.APIDOG_PROJECT_ID }} \
            --env-id ${{ secrets.APIDOG_ENV_ID }}
Enter fullscreen mode Exit fullscreen mode

Nếu có data-driven test:

      - name: Run Apidog tests with CSV data
        run: |
          apidog run --project-id ${{ secrets.APIDOG_PROJECT_ID }} \
            --env-id ${{ secrets.APIDOG_ENV_ID }} \
            -d ./test-data/orders.csv
Enter fullscreen mode Exit fullscreen mode

2. Dùng Schemathesis cho lớp fuzzing tự động

Dùng Schemathesis để kiểm tra những input mà con người thường không viết thủ công.

Ví dụ:

schemathesis run openapi.yaml --base-url http://localhost:8000
Enter fullscreen mode Exit fullscreen mode

Nên chạy Schemathesis như một job riêng:

  • Chạy trên pull request nếu API nhỏ và fuzzing nhanh.
  • Chạy nightly nếu API lớn hoặc fuzzing tạo nhiều noise.
  • Chạy theo lịch trước release.
  • Chạy riêng để không làm chặn pipeline chức năng nếu team chưa triage hết lỗi fuzzing.

Ví dụ GitHub Actions chạy hằng đêm:

name: nightly-api-fuzzing

on:
  schedule:
    - cron: "0 2 * * *"

jobs:
  schemathesis:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Schemathesis
        run: pip install schemathesis
      - name: Run fuzzing
        run: |
          schemathesis run openapi.yaml \
            --base-url ${{ secrets.API_BASE_URL }}
Enter fullscreen mode Exit fullscreen mode

3. Dùng một schema làm contract chung

Điểm kết nối giữa hai công cụ là schema.

  • Apidog dùng OpenAPI spec cho thiết kế, mock và contract test.
  • Schemathesis dùng cùng spec đó để sinh input fuzzing.

Vì vậy, việc quan trọng nhất là giữ spec chính xác:

  • Cập nhật schema khi thêm/sửa endpoint.
  • Định nghĩa rõ required, minimum, maximum, enum, format.
  • Không để response thực tế khác tài liệu.
  • Review schema trong pull request.
  • Dùng contract test để phát hiện drift sớm.

Một schema tốt giúp cả Apidog và Schemathesis hiệu quả hơn. Một schema sai làm cả test có chủ đích lẫn fuzzing cho kết quả kém tin cậy.

Gợi ý pipeline thực tế

Một pipeline cân bằng có thể trông như sau:

name: api-quality

on:
  pull_request:
  schedule:
    - cron: "0 2 * * *"

jobs:
  functional-and-contract-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Apidog tests
        run: |
          apidog run --project-id ${{ secrets.APIDOG_PROJECT_ID }} \
            --env-id ${{ secrets.APIDOG_ENV_ID }}

  schema-fuzzing:
    if: github.event_name == 'schedule'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Schemathesis
        run: |
          pip install schemathesis
          schemathesis run openapi.yaml \
            --base-url ${{ secrets.API_BASE_URL }}
Enter fullscreen mode Exit fullscreen mode

Cách chia này giúp:

  • Pull request vẫn có gate nhanh bằng test chức năng/contract.
  • Fuzzing chạy định kỳ để tìm lỗi biên.
  • Cả hai cùng dựa trên một schema.
  • Không cần duy trì hai định nghĩa API khác nhau.

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

Apidog có phải lựa chọn thay thế cho Schemathesis không?

Chỉ một phần. Nếu bạn cần property-based fuzzing sinh từ schema, Apidog không phải thay thế trực tiếp vì Apidog không làm việc đó. Nếu bạn cần một nền tảng cho thiết kế API, test chức năng, contract test, mock, tài liệu và CI/CD, Apidog bao phủ nhiều phần hơn của vòng đời API. Cách nhìn thực tế là bổ sung, không phải thay thế. Xem thêm cách kiểm thử hợp đồng hoạt động trong Apidog.

Property-based API testing khác gì functional API testing?

Functional testing kiểm tra case cụ thể mà bạn viết trước:

Given payload hợp lệ
When gọi POST /orders
Then trả về 201 và có orderId
Enter fullscreen mode Exit fullscreen mode

Property-based testing kiểm tra thuộc tính tổng quát trên nhiều input được sinh tự động:

API không bao giờ được trả về 500
Response luôn phải khớp schema
Dữ liệu ngoài constraint không được trả về 2xx
Enter fullscreen mode Exit fullscreen mode

Functional testing xác minh hành vi đã thiết kế. Property-based testing tìm hành vi bạn chưa lường trước. Nên dùng cả hai.

Apidog có thực hiện fuzzing không?

Apidog có monkey testing, tức gửi input ngẫu nhiên. Nhưng đó không phải property-based fuzzing. Property-based fuzzing sinh input từ type và constraint trong schema, sau đó thu nhỏ lỗi thành case tối thiểu. Với nhu cầu đó, Schemathesis là công cụ phù hợp. Apidog mạnh hơn ở test có chủ đích, data-driven testing, contract testing, mock, tài liệu và CI/CD.

Có thể chạy Apidog và Schemathesis trong cùng CI không?

Có. Một setup phổ biến:

  • Chạy Apidog bằng apidog run trong pull request như gate bắt buộc.
  • Chạy Schemathesis trong job riêng hoặc nightly.
  • Dùng chung một OpenAPI/GraphQL schema.
  • Triage lỗi fuzzing riêng để tránh làm chậm workflow chính.

Kết luận

Schemathesis là công cụ property-based fuzzer mạnh cho API. Nó tìm lỗi biên và contract mismatch từ schema mà test viết tay thường bỏ sót.

Apidog là nền tảng bao quanh lớp đó: thiết kế API, mock endpoint, test chức năng, contract test, data-driven testing, tài liệu, CI/CD và hỗ trợ REST, gRPC, WebSocket, SSE, SOAP, GraphQL.

Cách triển khai thực tế:

  1. Giữ OpenAPI/GraphQL schema làm contract chung.
  2. Dùng Apidog cho test có chủ đích, mock, tài liệu và CI gate.
  3. Dùng Schemathesis cho fuzzing tự động.
  4. Chạy Apidog trong PR, chạy Schemathesis riêng hoặc nightly.

Nếu hiện tại bạn chỉ có fuzzing, hãy bổ sung lớp test chức năng/contract. Nếu hiện tại bạn chỉ có test viết tay, hãy bổ sung fuzzing dựa trên schema. Bạn có thể tải Apidog để xây dựng bộ test có chủ đích và lớp thiết kế API, dùng Schemathesis cho fuzzing, rồi để schema chung liên kết cả hai. Bạn cũng có thể dùng thử Apidog miễn phí; sau khi test chức năng đã nằm trong Apidog, việc kết nối vào CI chỉ cần một lệnh.

Top comments (0)