Python 语言 微服务接口契约测试 Pact 实战

Python阿木 发布于 1 天前 3 次阅读


Python 微服务接口契约测试(Pact)实战

在微服务架构中,各个服务之间通过API进行交互。接口契约测试是确保服务之间交互正确性的重要手段。Pact 是一种契约测试工具,它允许服务提供者和消费者在无需直接集成的情况下进行接口测试。本文将围绕 Python 语言,详细介绍如何使用 Pact 进行微服务接口契约测试的实战。

Pact 简介

Pact 是一种契约测试工具,它允许服务提供者和消费者在无需直接集成的情况下进行接口测试。Pact 的核心思想是服务提供者和服务消费者各自编写测试,并使用 Pact 来确保双方对接口的期望是一致的。

环境搭建

在开始之前,我们需要搭建一个适合进行 Pact 测试的环境。以下是所需的步骤:

1. 安装 Pact Python 客户端:
bash
pip install pact-python

2. 安装 Pact 提供者和服务消费者所需的依赖:
bash
pip install requests

3. 安装 Pact 提供者和服务消费者所需的测试框架(如 pytest):
bash
pip install pytest

服务提供者测试

以下是一个简单的服务提供者测试示例,该服务提供者返回一个用户列表。

python
provider_service.py
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/users', methods=['GET'])
def get_users():
return jsonify([{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}])

if __name__ == '__main__':
app.run()

接下来,编写 Pact 提供者测试:

python
provider_test.py
import requests
import pytest
from pactlib import Pact

with Pact("http://localhost:5000") as provider:
provider.add_consumer("consumer_service", "http://localhost:5001")
provider.add_interaction(
description="Get users",
upon_receiving="a request for users",
with_request={
"method": "GET",
"path": "/users"
},
will_respond_with={
"status": 200,
"headers": {"Content-Type": "application/json"},
"body": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
}
)

response = requests.get("http://localhost:5000/users")
assert response.status_code == 200
assert response.json() == [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]

运行测试:

bash
pytest provider_test.py

服务消费者测试

现在,我们将编写一个服务消费者测试,该消费者调用上述服务提供者。

python
consumer_service.py
import requests

def get_users():
response = requests.get("http://localhost:5000/users")
return response.json()

if __name__ == '__main__':
users = get_users()
print(users)

接下来,编写 Pact 消费者测试:

python
consumer_test.py
import requests
import pytest
from pactlib import Pact

with Pact("http://localhost:5000") as consumer:
consumer.add_provider("provider_service", "http://localhost:5000")
consumer.add_interaction(
description="Get users",
upon_receiving="a request for users",
with_request={
"method": "GET",
"path": "/users"
},
will_respond_with={
"status": 200,
"headers": {"Content-Type": "application/json"},
"body": [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
}
)

users = get_users()
assert users == [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]

运行测试:

bash
pytest consumer_test.py

总结

通过以上实战,我们了解了如何使用 Pact 进行 Python 微服务接口契约测试。Pact 允许服务提供者和消费者独立编写测试,确保双方对接口的期望一致,从而提高微服务架构的稳定性和可维护性。

扩展阅读

- [Pact 官方文档](https://github.com/pact-foundation/pact-python)
- [Flask 官方文档](https://flask.palletsprojects.com/)
- [pytest 官方文档](https://docs.pytest.org/en/latest/)

希望本文能帮助您更好地理解和使用 Pact 进行微服务接口契约测试。