DEV Community

Cover image for Tại sao Tài liệu Swagger và Postman Collections của bạn không đồng bộ (Và cách khắc phục)
Sebastian Petrus
Sebastian Petrus

Posted on • Originally published at apidog.com

Tại sao Tài liệu Swagger và Postman Collections của bạn không đồng bộ (Và cách khắc phục)

Sự sai lệch (drift) giữa Swagger và Postman xảy ra khi bạn lưu cùng một API contract ở nhiều nơi: openapi.yaml cho tài liệu, Postman collection cho kiểm thử, và đôi khi thêm một công cụ tài liệu khác. Khi một endpoint thay đổi trong collection nhưng đặc tả OpenAPI không đổi, tài liệu và test bắt đầu mô tả hai API khác nhau. Bài viết này chỉ ra nguyên nhân cấu trúc của vấn đề và cách chuyển sang mô hình “một nguồn chân lý”. Nếu bạn cần hướng dẫn tạo test từ đặc tả, xem thêm hướng dẫn tạo kiểm thử OpenAPI.

Dùng thử Apidog ngay hôm nay

💡 Các nhóm sử dụng Apidog có thể dùng tệp OpenAPI làm thành phần duy nhất điều khiển tài liệu, mock và kiểm thử. Cách xử lý không phải là thêm review thủ công, mà là loại bỏ bản sao thứ hai có thể bị lệch.

Tại sao hai tệp luôn tách rời nhau

Trong nhiều dự án, bạn có:

  • openapi.yaml trong Git.
  • Một Postman collection để QA hoặc backend chạy test.
  • Swagger UI render tài liệu từ YAML.

Vấn đề: các thành phần này mô tả cùng một API contract nhưng không có ràng buộc kỹ thuật nào bắt chúng đồng bộ.

Ví dụ:

  1. Backend thêm endpoint POST /payments/refund.
  2. Trường reason được thêm là bắt buộc.
  3. QA cập nhật Postman collection để test endpoint mới.
  4. Việc cập nhật openapi.yaml bị đưa vào backlog.
  5. Frontend đọc Swagger UI, gọi API thiếu reason, nhận lỗi 400.

Đây không phải là lỗi cá nhân. Đây là lỗi kiến trúc quy trình: Postman collection và OpenAPI spec là hai bản sao độc lập.

Thành phần Ai cập nhật Thời điểm cập nhật Xác thực
openapi.yaml API designer / tech lead Sprint tài liệu hoặc khi review PR Linter tùy chọn, ví dụ Spectral
Postman collection QA / backend developer Khi cần chạy test Thủ công hoặc không có
Swagger UI Render tự động từ YAML Chỉ khi YAML được cập nhật Phản ánh YAML, không phản ánh collection

Ngay cả khi bạn chạy Spectral, công cụ này chỉ phát hiện lỗi nội bộ trong YAML. Nó không biết Postman collection của bạn đang gửi request khác với đặc tả.

Vấn đề ba bản sao

Nếu nhóm dùng thêm một nền tảng tài liệu riêng như Stoplight, Swagger UI hoặc wiki nội bộ, bạn có thể có ba bản sao API contract:

  1. openapi.yaml trong Git.
  2. Postman collection trong workspace.
  3. Tài liệu render từ một công cụ riêng.

Mỗi bản sao có thể lệch theo cách riêng. Đặc tả OpenAPI là định dạng mô tả, không phải cơ chế đồng bộ runtime. Bạn có thể mô tả API trong YAML, nhưng không có gì ngăn collection gửi request khác.

Khi số lượng service và thành viên tăng lên, chi phí đồng bộ thủ công tăng rất nhanh:

1 service  x  2 bản sao  = dễ kiểm soát
10 services x 3 bản sao  = nhiều điểm lệch
50 services x 3 bản sao  = gần như không thể kiểm soát thủ công
Enter fullscreen mode Exit fullscreen mode

Cách drift âm thầm phá vỡ kiểm thử

Phần nguy hiểm nhất: test vẫn có thể pass dù đã sai.

Giả sử đặc tả được cập nhật lên v2:

# openapi.yaml - updated spec (v2)
paths:
  /payments/refund:
    post:
      summary: Initiate a refund
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - transaction_id
                - reason          # NEW required field added in v2
              properties:
                transaction_id:
                  type: string
                  example: "txn_8x9Ka21"
                reason:
                  type: string
                  enum: [duplicate, fraudulent, requested_by_customer]
                  example: "requested_by_customer"
      responses:
        '200':
          description: Refund initiated
          content:
            application/json:
              schema:
                type: object
                properties:
                  refund_id:
                    type: string
                  status:
                    type: string
Enter fullscreen mode Exit fullscreen mode

Nhưng Postman collection vẫn ở v1 và chỉ gửi:

{
  "transaction_id": "txn_8x9Ka21"
}
Enter fullscreen mode Exit fullscreen mode

Nếu backend tạm thời chấp nhận thiếu reason hoặc tự gán default value, test Postman vẫn pass. Tuy nhiên, đặc tả hiện tại nói reason là bắt buộc. Điều này tạo ra khoảng trống giữa:

  • Điều tài liệu nói.
  • Điều test kiểm tra.
  • Điều backend tạm thời chấp nhận.

Một trình xác thực OpenAPI có thể phát hiện lỗi schema trong đặc tả, nhưng không phát hiện được Postman collection đang lỗi thời.

Kiểm thử theo định hướng OpenAPI thực sự là gì

Kiểm thử theo định hướng OpenAPI nghĩa là:

  • OpenAPI spec là nguồn có thẩm quyền.
  • Test được suy ra từ spec.
  • Mock được suy ra từ spec.
  • Tài liệu được render từ spec.
  • Khi spec thay đổi, các đầu ra liên quan được cập nhật từ cùng một nguồn.

Điều này khác với “import Swagger vào Postman”.

Import chỉ là sao chép một lần:

openapi.yaml  ->  import  ->  Postman collection
Enter fullscreen mode Exit fullscreen mode

Sau khi import, hai đối tượng lại độc lập. Lần thay đổi tiếp theo trong YAML không tự động cập nhật collection. Bạn phải import lại hoặc sửa thủ công.

Một quy trình spec-first nên trông như sau:

  1. Lưu openapi.yaml trong Git.
  2. Review mọi thay đổi API thông qua pull request.
  3. Dùng một công cụ đọc trực tiếp spec.
  4. Sinh tài liệu, mock và test từ cùng spec đó.
  5. Không duy trì một collection riêng như nguồn chân lý thứ hai.

Spec-first workflow

Mô hình phát triển API theo định hướng đặc tả giải thích quy trình rộng hơn. Ở đây, trọng tâm là loại bỏ drift giữa tài liệu và kiểm thử.

Apidog là lớp thực thi trên một đặc tả duy nhất

Trong mô hình này:

Git / openapi.yaml
        |
        v
     Apidog
   /    |    \
Docs  Mock  Tests
Enter fullscreen mode Exit fullscreen mode

Bạn commit openapi.yaml. Apidog đọc đặc tả và tạo ra:

  • Tài liệu tương tác.
  • Mock server.
  • Bộ kiểm thử.

Chế độ Spec-First của Apidog, hiện đang trong giai đoạn beta, được thiết kế cho quy trình này. Bạn trỏ Apidog vào tệp OpenAPI, sau đó dùng cùng một đặc tả để điều khiển tài liệu, mock và test.

Kết quả: không còn Postman collection riêng để bị lệch. Quy trình đồng bộ hóa đặc tả OpenAPI mô tả cách các nhóm commit spec vào GitHub và giữ Apidog đồng bộ.

Trước khi di chuyển toàn bộ, nên chạy POC trong một sprint:

  • Kiểm tra schema phức tạp của API có được xử lý đúng không.
  • Kiểm tra test data-driven nếu nhóm đang dùng nhiều bộ dữ liệu.
  • Kiểm tra phân quyền báo cáo có phù hợp với tổ chức không.
  • So sánh kết quả giữa collection hiện tại và test sinh từ spec.

Mocking cũng quan trọng. Nếu mock và test cùng được suy ra từ một đặc tả, frontend gọi mock sẽ nhận response nhất quán với điều test xác thực. Xem thêm các trường hợp sử dụng API mocking.

Lộ trình di chuyển từ Swagger + Postman

Không cần thay thế “big-bang”. Bạn có thể di chuyển theo từng bước.

Bước 1: Audit collection và spec

Liệt kê endpoint từ openapi.yaml:

yq '.paths | keys' openapi.yaml
Enter fullscreen mode Exit fullscreen mode

Sau đó đối chiếu với Postman collection:

  • Endpoint nào có trong Postman nhưng thiếu trong OpenAPI?
  • Endpoint nào có trong OpenAPI nhưng không được test?
  • Method nào sai?
  • Request body nào khác schema?
  • Response nào chưa được mô tả?

Bước 2: Làm sạch OpenAPI spec

Cập nhật openapi.yaml để phản ánh API thực tế hiện tại.

Tối thiểu nên kiểm tra:

  • paths
  • requestBody
  • parameters
  • responses
  • required
  • enum
  • nullable
  • authentication scheme
  • error response chuẩn

Bước 3: Đưa spec vào Apidog

Import hoặc đồng bộ spec vào Apidog. Dùng Apidog để tạo bộ kiểm thử ban đầu từ cấu trúc đặc tả.

Nếu cần hướng dẫn chi tiết, xem tạo collection kiểm thử từ đặc tả OpenAPI.

Bước 4: Chạy song song trong một sprint

Trong một sprint, chạy cả:

  • Postman collection hiện tại.
  • Bộ test sinh từ OpenAPI spec.

So sánh kết quả:

Nếu Postman pass nhưng spec-based test fail:
=> collection có thể đang bỏ sót yêu cầu mới.

Nếu spec-based test pass nhưng Postman fail:
=> collection có thể lỗi thời hoặc đang test hành vi không còn hợp lệ.
Enter fullscreen mode Exit fullscreen mode

Bước 5: Lưu trữ collection cũ

Khi đã xác nhận bộ test mới bao phủ đủ các API quan trọng:

  • Không dùng Postman collection làm contract nữa.
  • Không yêu cầu team cập nhật collection song song.
  • Giữ openapi.yaml trong Git làm nguồn chuẩn tắc.
  • Dùng Apidog làm lớp thực thi cho docs, mock và test.

So sánh: bảo trì kép và đặc tả là nguồn

Khía cạnh Swagger + Postman OpenAPI là nguồn
Rủi ro drift Cao, vì hai thành phần được cập nhật độc lập Thấp, vì đầu ra được suy ra từ một spec
Độ chính xác test Phụ thuộc vào đồng bộ thủ công Theo sát thay đổi trong spec
Onboarding developer mới Phải hiểu nhiều công cụ và cách đồng bộ Tập trung vào một contract
CI/CD Collection cần export và version riêng CI có thể đọc spec trong Git
Mock Duy trì riêng hoặc import lại Suy ra từ cùng spec
Chi phí đổi schema Sửa spec, collection và mock Sửa spec một lần

Điểm này không phải là lỗi của Postman với tư cách công cụ. Postman mạnh cho kiểm thử dựa trên collection và kiểm thử thăm dò. Vấn đề xuất hiện khi collection trở thành một contract song song thay vì đầu ra được suy ra từ OpenAPI.

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

Tại sao import Swagger vào Postman không giải quyết drift?

Vì import chỉ tạo một bản sao tại một thời điểm. Sau khi import, openapi.yaml và Postman collection độc lập. Mỗi lần spec đổi, bạn phải import lại hoặc sửa collection thủ công.

Tôi có thể tiếp tục dùng Postman cho kiểm thử thăm dò không?

Có. Spec-first không cấm kiểm thử ngẫu hứng. Bạn có thể dùng Postman cho các request thử nhanh. Điều cần tránh là commit collection đó như nguồn chân lý cho kiểm thử hợp đồng hoặc regression suite.

Làm sao biết OpenAPI spec đã lệch khỏi triển khai thực tế?

Bạn cần kiểm thử hợp đồng ở runtime. API server nên được kiểm tra request và response so với OpenAPI spec trong môi trường test hoặc staging. Spectral giúp kiểm tra tính nhất quán nội bộ của spec, nhưng không xác minh backend thực tế có tuân thủ spec hay không.

Apidog có thay thế hoàn toàn Postman không?

Tùy workflow của nhóm. Apidog hỗ trợ thiết kế, mocking, kiểm thử và tài liệu trong một workspace. Nếu Postman chủ yếu được dùng cho contract test và regression test, Apidog có thể đảm nhiệm phần đó. Nếu nhóm có script phức tạp trong Postman collection runner hoặc pipeline CI đã phụ thuộc vào Postman, bạn có thể đánh giá song song trong một sprint. Xem thêm kiểm thử với Postman.

Nếu openapi.yaml của tôi đã lỗi thời thì sao?

Bạn cần đối chiếu lại spec trước. Không có lối tắt an toàn. So sánh spec với hành vi API thực tế, cập nhật YAML, sau đó mới dùng nó làm nguồn chuẩn tắc cho tài liệu, mock và test.

Kết luận

Swagger docs và Postman collection bị lệch vì chúng là hai bản sao độc lập của cùng một API contract. Đây là vấn đề cấu trúc của quy trình bảo trì kép, không chỉ là vấn đề kỷ luật cập nhật tài liệu.

Cách xử lý thực tế:

  1. Đưa openapi.yaml vào Git.
  2. Review mọi thay đổi API qua PR.
  3. Dùng một công cụ đọc spec để tạo docs, mock và test.
  4. Loại bỏ collection riêng như nguồn chân lý thứ hai.

Tải xuống Apidog và nhập đặc tả OpenAPI hiện có của bạn. Bạn có thể kiểm tra trong một phiên cách một tệp duy nhất thay thế tài liệu Swagger và Postman collection, với mock, test và docs cùng đọc từ một nguồn. Nếu đang đánh giá Chế độ Spec-First, xem trang Chế độ Spec-First của Apidog để biết phạm vi tính năng hiện tại và chi tiết truy cập.

Top comments (0)