Pact là công cụ tham chiếu cho thử nghiệm hợp đồng dựa trên người tiêu dùng. Người tiêu dùng viết các bài kiểm thử đơn vị tạo ra một hợp đồng, nhà cung cấp chạy lại hợp đồng đó trên mã thực của họ, một Pact Broker lưu trữ kết quả, và can-i-deploy cho biết pipeline của bạn liệu một phiên bản có an toàn để triển khai hay không. Khi vòng lặp chạy, nó phát hiện các lỗi tích hợp mà các bài kiểm thử đơn vị độc lập không bao giờ làm được. Vấn đề nằm ở chính vòng lặp đó: các DSL kiểm thử theo ngôn ngữ trên mỗi đội người tiêu dùng, trạng thái nhà cung cấp cần viết kịch bản và duy trì, một broker để lưu trữ và quản lý phiên bản, và các bản dựng xác minh nhà cung cấp thất bại vì những lý do không ai có thể tái tạo cục bộ. Rất nhiều đội sử dụng Pact cho một tích hợp không ổn định và cuối cùng phải duy trì một nền tảng kiểm thử hợp đồng nhỏ.
Đây là câu trả lời trực tiếp, với phạm vi được nêu rõ ngay từ đầu: Apidog là lựa chọn thay thế Pact tốt nhất cho các đội có vấn đề thực sự là sự sai lệch lược đồ giữa nhà sản xuất và người tiêu dùng, đó là trường hợp của hầu hết các đội. Nó thay thế quy trình tạo pact bằng một đặc tả OpenAPI làm nguồn chân lý duy nhất, xác thực mọi phản hồi dựa trên lược đồ đó trong mỗi lần chạy thử nghiệm, cung cấp các mock thông minh từ đặc tả để người tiêu dùng xây dựng dựa trên hợp đồng trước khi nhà cung cấp triển khai, và chạy tất cả trong CI thông qua Apidog CLI. Điều nó không làm là tái tạo quy trình broker dựa trên người tiêu dùng của Pact: không có tệp pact, không có ma trận, không có can-i-deploy. Nếu bạn cần chính xác cơ chế đó trên nhiều đội triển khai độc lập, Pact vẫn giữ được vị thế của mình, và bài viết này sẽ nói rõ điều đó bên dưới.
Pact thực sự làm gì, và làm tốt điều gì
Tài liệu của Pact mô tả nó là một công cụ ưu tiên mã (code-first) để kiểm thử tích hợp HTTP và tin nhắn. Mô hình này là dựa trên người tiêu dùng: các bài kiểm thử của người tiêu dùng chạy với một nhà cung cấp mock của Pact và ghi lại các cặp yêu cầu/phản hồi cụ thể vào một tệp pact. Chỉ các trường mà người tiêu dùng sử dụng mới được ghi lại, do đó nhà cung cấp vẫn có thể tự do thay đổi bất cứ điều gì mà không ai phụ thuộc vào. Nhà cung cấp sau đó xác minh pact bằng cách chạy lại các yêu cầu đó trên cơ sở mã thực của mình, với các trạng thái nhà cung cấp thiết lập dữ liệu mà mỗi tương tác cần.
Pact Broker biến các artifact đó thành logic triển khai. Mỗi cặp phiên bản người tiêu dùng và nhà cung cấp đã được xác minh sẽ xuất hiện trong một ma trận, và can-i-deploy kiểm tra xem phiên bản bạn sắp triển khai có xác minh thành công với mọi thứ đã chạy trong môi trường mục tiêu hay không. Mã thoát 0 có nghĩa là triển khai, 1 có nghĩa là không.
Hệ sinh thái rất rộng lớn: các triển khai chính thức tồn tại trên hơn 10 ngôn ngữ, bao gồm JVM, JavaScript, Go, .NET, Python, Ruby, Rust, PHP và Swift, hầu hết chia sẻ một nhân Rust nguyên bản. Và vì việc tự host một broker là một công việc thực sự, SmartBear bán PactFlow, một broker được quản lý với cấp Starter miễn phí (2 tích hợp), cấp Team với giá 127 đô la mỗi tháng cho 50 tích hợp, và cấp Enterprise với giá tùy chỉnh, bao gồm SSO và các tùy chọn triển khai tại chỗ.
Nơi mà các nghi lễ chồng chất
Vấn đề là chi phí thực tế của việc “chạy vòng lặp”.
Mỗi đội người tiêu dùng viết mã DSL. Pacts được tạo ra từ mã kiểm thử, vì vậy mỗi đội người tiêu dùng phải học DSL của Pact cho ngôn ngữ của mình, và một tổ chức đa ngôn ngữ sẽ phải học nhiều DSL. Các quy tắc khớp và thiết lập mock là mã bạn viết, xem xét và tái cấu trúc mãi mãi.
Trạng thái nhà cung cấp là một bộ kiểm thử ẩn. Mỗi tương tác có thể yêu cầu một trạng thái (“người dùng 42 tồn tại với một hóa đơn chưa thanh toán”), và đội nhà cung cấp phải triển khai một trình xử lý để xây dựng trạng thái đó. Khi số lượng người tiêu dùng tăng lên, nhà cung cấp duy trì một danh mục các trình xử lý trạng thái cho các định dạng dữ liệu mà nó không kiểm soát.
Broker là cơ sở hạ tầng. Tự host, nó cần một cơ sở dữ liệu, nâng cấp, xác thực và webhook vào mọi hệ thống CI. Được quản lý, nó là một nhà cung cấp khác. Dù bằng cách nào, kỷ luật quản lý phiên bản (tên nhánh, bản ghi môi trường, pact đang chờ xử lý) phải được dạy cho mọi đội chạm vào nó.
Xác minh nhà cung cấp không ổn định. Xác minh chạy lại các yêu cầu do người tiêu dùng ghi lại trên một phiên bản nhà cung cấp đang hoạt động, điều này kéo theo toàn bộ môi trường chạy của nhà cung cấp: dữ liệu khởi tạo cơ sở dữ liệu, stub xác thực, các công việc nền. Khi bản dựng chuyển sang màu đỏ, bài kiểm thử thất bại đã được viết bởi một đội khác và chặn việc triển khai của họ thông qua can-i-deploy. Phiên gỡ lỗi giữa các đội đó là lúc các đội bắt đầu âm thầm bỏ qua việc kiểm tra.
Bản thân PactFlow cũng thừa nhận gánh nặng này. Tính năng kiểm thử hợp đồng hai chiều của nó loại bỏ bước chạy lại: nhà cung cấp công bố một tài liệu OpenAPI làm hợp đồng của mình, người tiêu dùng công bố các hợp đồng được tạo từ mock, và PactFlow so sánh tĩnh hai thứ này. Đó là một sự thừa nhận từ nhà cung cấp rằng đối với nhiều tích hợp, việc so sánh lược đồ là đủ. Và nếu đặc tả là hợp đồng, thì phần còn lại của bộ máy mang lại cho bạn điều gì? Chúng tôi đã phân tích lý do tương tự trong kiểm thử hợp đồng hai chiều.
Câu trả lời: Apidog
Apidog là một nền tảng phát triển API được hơn 500.000 nhà phát triển sử dụng. Nó đặt một đặc tả OpenAPI làm trung tâm và tạo ra mọi thứ khác từ đó: tài liệu, máy chủ mock, xác thực yêu cầu và các bài kiểm thử tự động. Là một giải pháp thay thế cho Pact, cách tiếp cận của nó là một lý thuyết khác về hợp đồng, lý thuyết mà chúng tôi đã trình bày trong kiểm thử hợp đồng API: biến đặc tả thành hợp đồng, sau đó thực thi nó một cách cơ học ở mọi nơi.
- Một hợp đồng, không DSL nào. Đặc tả là thỏa thuận giữa nhà sản xuất và người tiêu dùng. Không ai viết mã tạo pact bằng năm ngôn ngữ; các đội đọc và chỉnh sửa một tài liệu duy nhất, trực quan hoặc dưới dạng mã.
- Xác thực lược đồ trên mỗi lần chạy. Mọi yêu cầu bạn gửi trong Apidog, và mọi kịch bản kiểm thử trong CI, đều tự động xác thực phản hồi dựa trên đặc tả. Một trường bị đổi tên, một thay đổi kiểu dữ liệu, hoặc một thuộc tính bị loại bỏ sẽ làm hỏng quá trình chạy mà không cần ai viết một câu lệnh khẳng định. Đó chính là tính năng phát hiện sai lệch mà hầu hết các đội mua Pact vì nó.
- Người tiêu dùng phát triển dựa trên hợp đồng ngay từ ngày đầu tiên. Máy chủ mock thông minh cung cấp các phản hồi thực tế, được suy ra từ lược đồ ngay khi một endpoint được định nghĩa. Không cần kịch bản trạng thái nhà cung cấp; mock được tạo tự động, không phải xây dựng thủ công.
- Thực thi CI mà không cần broker.
apidog runthực thi các kịch bản kiểm thử trong bất kỳ pipeline nào. Một bản dựng nhà cung cấp vi phạm đặc tả sẽ làm hỏng CI của chính nó trước khi triển khai: cùng một kết quả “không triển khai thay đổi gây lỗi”, được thực thi tại nguồn thay vì tại ma trận.
Việc chuyển đổi diễn ra như thế nào, từng phần một
Bản thân hợp đồng
Trong Pact, hợp đồng là một tệp JSON được tạo ra từ các tương tác ví dụ; nó mô tả những gì một người tiêu dùng đã quan sát được. Trong Apidog, hợp đồng là đặc tả OpenAPI: kiểu dữ liệu, các trường bắt buộc, enum và định dạng lỗi cho mọi endpoint, được sở hữu tại một nơi với việc quản lý phiên bản dựa trên nhánh. Sự đánh đổi là rõ ràng: lát cắt theo người tiêu dùng của Pact cho nhà cung cấp biết chính xác những trường nào an toàn để thay đổi, và một đặc tả được chia sẻ không mang tín hiệu sử dụng đó. Thay vào đó, đặc tả mang lại một artifact mà tài liệu, mock, kiểm thử và client đều đồng ý; xem thêm về cách tiếp cận này trong hợp đồng API là gì.
Xác minh phía nhà cung cấp
Pact chạy lại các tương tác của người tiêu dùng trên nhà cung cấp đang hoạt động. Tương đương với Apidog là chạy các kịch bản kiểm thử trên triển khai thực tế với xác thực lược đồ được bật, trong CI thông qua CLI. Nhà cung cấp vẫn được xác minh dựa trên hợp đồng, mà không cần một danh mục các trạng thái do người tiêu dùng viết.
Phát triển phía người tiêu dùng
Pact cung cấp cho mỗi người tiêu dùng một nhà cung cấp mock bên trong các bài kiểm thử đơn vị của nó. Apidog cung cấp cho mọi người tiêu dùng một URL mock đang chạy được tạo từ đặc tả, có thể chia sẻ giữa các đội, với các kỳ vọng tùy chỉnh khi bạn cần dữ liệu cụ thể. Các đội frontend và downstream bắt đầu trước khi nhà cung cấp có dù chỉ một dòng triển khai; xem kiểm thử hợp đồng và máy chủ mock để biết cách các mock được điều khiển bởi đặc tả so sánh với các mock được xây dựng thủ công.
Kiểm soát triển khai
Đây là điểm mạnh nhất của Pact và Apidog không sao chép nó. Không có ma trận giữa các dịch vụ và không có can-i-deploy. Thay vào đó, Apidog kiểm soát ở cấp hợp đồng: một thay đổi của nhà cung cấp vi phạm đặc tả sẽ làm hỏng pipeline của nhà cung cấp, và một thay đổi đặc tả là một sự kiện rõ ràng, được xem xét, tái tạo mock và tài liệu cho mọi người tiêu dùng cùng lúc. Nơi các dịch vụ triển khai thông qua một số pipeline phối hợp, kiểm soát ở cấp hợp đồng là trường hợp chiếm 80%. Đối với hàng chục đội triển khai độc lập vào những thời điểm không xác định, kiểm soát ở cấp ma trận vẫn giữ vững giá trị của nó.
Pact và PactFlow so với Apidog: Tổng quan
| Pact + PactFlow | Apidog | |
|---|---|---|
| Artifact hợp đồng | Các tệp pact được tạo (theo từng người tiêu dùng) | Một đặc tả OpenAPI |
| Ai viết mã hợp đồng | Mỗi đội người tiêu dùng, DSL theo ngôn ngữ | Không ai; đặc tả được chỉnh sửa trực quan hoặc dưới dạng mã |
| Xác minh nhà cung cấp | Chạy lại các tương tác + trạng thái nhà cung cấp | Các kịch bản kiểm thử + xác thực lược đồ tự động |
| Mock của người tiêu dùng | Nhà cung cấp mock trong kiểm thử | Mock thông minh được host từ đặc tả, miễn phí |
| Phát hiện sai lệch | Trên các lần chạy xác minh | Trên mỗi yêu cầu và mỗi lần chạy CI |
| Kiểm soát triển khai | Ma trận broker + can-i-deploy | CI được kiểm soát bởi hợp đồng cho mỗi dịch vụ |
| Cơ sở hạ tầng | Broker (tự host hoặc PactFlow SaaS) | Không cần thêm; không gian làm việc đám mây được bao gồm |
| Tài liệu và thiết kế | Không thuộc phạm vi | Tài liệu tương tác, trình chỉnh sửa đặc tả trực quan |
| Chi phí | OSS miễn phí; PactFlow miễn phí cho 2 tích hợp, Team 127 đô la/tháng | Miễn phí cho tối đa 4 người dùng; trả phí từ 9 đô la/người dùng/tháng |
Chi phí và sự phù hợp, một cách trung thực
Các thư viện của Pact là mã nguồn mở và miễn phí vĩnh viễn. Điều bạn phải trả là chi phí phối hợp: việc host broker hoặc PactFlow (Team có giá 127 đô la mỗi tháng, khoảng 1.385 đô la thanh toán hàng năm), cộng với thời gian kỹ thuật mà các bài kiểm thử DSL, trình xử lý trạng thái và việc gỡ lỗi xác minh giữa các đội tiêu tốn. Thời gian đó là hóa đơn thực sự, và nó tăng lên theo số lượng tích hợp.
Gói miễn phí của Apidog bao gồm 4 người dùng với trình chỉnh sửa đặc tả, sử dụng máy chủ mock không giới hạn, các kịch bản kiểm thử, xác thực lược đồ và chạy CLI; các gói trả phí bắt đầu từ 9 đô la mỗi người dùng mỗi tháng. Vì vậy, sự so sánh không phải là phí cấp phép. Vấn đề là bạn muốn duy trì bộ máy kiểm thử hợp đồng hay áp dụng một nền tảng mà công việc hợp đồng đi kèm với client API mà bạn muốn (hợp nhất công cụ? bắt đầu từ lựa chọn thay thế Postman tốt nhất). Các đội chọn một stack ưu tiên đặc tả từ đầu có thể xem cách các thành phần phù hợp trong bộ công cụ phát triển ưu tiên hợp đồng.
Di chuyển từ Pact
Bạn không chuyển đổi các tệp pact; bạn nâng cấp đặc tả thành hợp đồng.
- Có một đặc tả OpenAPI thực sự. Nếu bạn có, hãy nhập nó vào Apidog; nó sẽ ngay lập tức trở thành tài liệu, mock và quy tắc xác thực trực tiếp. Nếu không, hãy tạo một đặc tả từ các chú thích mã, sử dụng các tệp pact của bạn làm danh sách kiểm tra các endpoint mà người tiêu dùng thực sự truy cập.
- Bật xác thực lược đồ trong CI. Xây dựng các kịch bản kiểm thử cho các endpoint của nhà cung cấp và chạy chúng với CLI trên mỗi bản dựng của nhà cung cấp. Điều này thay thế việc xác minh nhà cung cấp.
- Chỉ người tiêu dùng đến mock thông minh. Thay thế các thiết lập mock Pact theo từng người tiêu dùng bằng URL mock được host. Xóa mã DSL khi mỗi người tiêu dùng chuyển đổi.
- Kiểm soát thay đổi đặc tả, không phải triển khai. Biến các chỉnh sửa đặc tả thành các thay đổi được xem xét trên một nhánh, để các chỉnh sửa gây lỗi trở thành khác biệt rõ ràng trước khi chúng trở thành sự cố.
- Loại bỏ broker cuối cùng. Giữ
can-i-deploytrên bất kỳ tích hợp nào mà thời gian triển khai độc lập là một rủi ro thực sự; loại bỏ nó ở nơi nó chỉ là nghi lễ.
Khi Pact vẫn còn ý nghĩa
Nếu nhiều đội triển khai các dịch vụ một cách độc lập theo lịch trình riêng của họ, và bạn cần một câu trả lời có thể kiểm tra bằng máy cho câu hỏi “phiên bản X có thể đi vào sản xuất ngay bây giờ không dựa trên mọi thứ khác đang chạy ở đó,” thì ma trận broker của Pact và can-i-deploy được xây dựng riêng cho mục đích đó, và Apidog không sao chép chúng. Kiểm thử hợp đồng hàng đợi tin nhắn cũng là lĩnh vực của Pact. Chế độ hai chiều của PactFlow là bước trung gian nếu bạn muốn loại bỏ nghi lễ chạy lại mà không rời khỏi hệ sinh thái; nó chia sẻ tiền đề của Apidog rằng đặc tả có thể mang hợp đồng. Nhưng nếu vấn đề của bạn là sự sai lệch, mock, và kiểm tra CI thay vì sắp xếp triển khai giữa các đội, thì bạn đang trả toàn bộ chi phí của Pact cho một phần nhỏ lợi ích của nó.
Các câu hỏi thường gặp
Apidog có phải là một công cụ kiểm thử hợp đồng như Pact không?
Nó thực thi các hợp đồng khác nhau. Pact tạo ra các hợp đồng theo từng người tiêu dùng từ mã kiểm thử và chạy lại chúng trên các nhà cung cấp. Apidog biến đặc tả OpenAPI thành hợp đồng và xác thực mọi yêu cầu và lần chạy CI dựa trên nó, điều này bao gồm việc phát hiện sai lệch lược đồ mà không cần quy trình broker. Sự khác biệt được phân tích chi tiết trong kiểm thử hợp đồng API.
Apidog có hỗ trợ can-i-deploy hoặc Pact Broker không?
Không. Apidog không có ma trận xác minh hoặc cổng triển khai giữa các dịch vụ. Cổng của nó là hợp đồng: các bản dựng vi phạm đặc tả sẽ làm hỏng pipeline của chính chúng. Các đội cần kiểm soát cấp ma trận nên giữ Pact cho các tích hợp đó; tùy chọn trung gian là phương pháp so sánh tĩnh được đề cập trong kiểm thử hợp đồng hai chiều.
Apidog có thể thay thế mock của người tiêu dùng của Pact không?
Có, đối với hầu hết các trường hợp sử dụng. Máy chủ mock thông minh tạo ra các phản hồi chính xác về lược đồ từ đặc tả mà không cần thiết lập, cộng với các kỳ vọng tùy chỉnh cho các trường hợp cụ thể, do đó các đội người tiêu dùng mã hóa dựa trên một URL hợp đồng trực tiếp thay vì viết DSL nhà cung cấp mock. Xem kiểm thử hợp đồng và công cụ mock để biết bức tranh tổng thể về các công cụ.
Còn việc kiểm thử fuzzing nhà cung cấp dựa trên đặc tả thì sao?
Việc ghép nối các bài kiểm thử kịch bản của Apidog với một công cụ kiểm thử thuộc tính dựa trên đặc tả sẽ mang lại phạm vi phủ sóng lỗi rộng hơn so với việc chạy lại ví dụ. Chúng tôi đã so sánh tùy chọn hàng đầu trong Schemathesis là gì, và cùng một đặc tả điều khiển cả hai công cụ.
PactFlow có giá bao nhiêu so với Apidog?
Gói Starter của PactFlow miễn phí cho 2 tích hợp; gói Team có giá 127 đô la mỗi tháng (khoảng 1.385 đô la thanh toán hàng năm) cho 50 tích hợp; gói Enterprise là tùy chỉnh. Apidog miễn phí cho tối đa 4 người dùng, với các gói trả phí từ 9 đô la mỗi người dùng mỗi tháng, bao gồm các công cụ hợp đồng thay vì tính phí như một broker riêng biệt. Cũng so sánh các công cụ capture-replay? Xem lựa chọn thay thế Keploy tốt nhất.
Loại bỏ nghi lễ, giữ lại hợp đồng
Nếu thiết lập Pact của bạn tồn tại để phát hiện sự sai lệch lược đồ, bạn có thể nhận được sự đảm bảo đó từ một đặc tả duy nhất, được xác thực trên mỗi lần chạy, với các mock mà người tiêu dùng của bạn đã muốn. Nhập tệp OpenAPI của bạn, tích hợp apidog run vào CI và cung cấp URL mock. Tải xuống Apidog hoặc bắt đầu trong trình duyệt; một đội 4 người không phải trả gì, và broker mà bạn không còn phải duy trì nữa chính là điểm mấu chốt.
