一个小型库,用于验证我们的数据是否符合合同。
项目描述
契约式
contractpy 是一个小型库,用于根据合同验证数据。
基本用法
您可以简单地创建一个合同对象并验证您的数据是否符合合同。
from pycontract import Contract, Types
my_contract = {
'name': Types.STRING,
'id': Types.INTEGER
}
contract = Contract(my_contract)
assert contract.verify({'name': 'Captain America': 'id': 12345}) is True
是的,就是这么简单。
此外,它适用于复杂的数据,如嵌套的 dict 对象(dict 对象中的值可以是另一个 dict 对象或 dict 对象列表)。在这种情况下,它将递归迭代内部字典并根据合同验证它们。请查看以下示例,
my_contract = {
'name': Types.STRING,
'id': Types.INTEGER,
'orders': [
{
'orderId': Types:INTEGER,
'price': Types:FLOAT,
}
],
comments: [Types.String]
}
data = {
'name': 'Hazel Grace',
'id: 57331,
'orders': [
{
'orderId': 1,
'price': 420.45
},
{
'orderId': 2,
'price': 750.38
}
],
comments: ["I really liked the product!", "I am completely satisfied."]
}
assert Contract(my_contract).verify(data) is True
如果要为任何字段指定列表,请使用字段中指定的方括号 ( [ ] ) data。在这种情况下,它将根据列表中存在的合同验证所有值。
您还可以使用此库对 REST API 进行合同测试。这种 API 合约测试在微服务架构中会更有用。例如,
def test_users_api_conforms_the_contract():
user_api_contract = {
'page': Types.INTEGER,
'per_page': Types.INTEGER,
'total': Types.INTEGER,
'total_pages': Types.INTEGER,
'data': [
{
'id': Types.INTEGER,
'name': Types.STRING,
'year': Types.INTEGER,
'color': Types.STRING,
'pantone_value': Types.STRING
}
],
'ad': {
'company': Types.STRING,
'url': Types.STRING,
'text': Types.STRING
}
}
response = requests.get('https://reqres.in/api/user?page=1')
assert response.status_code == 200
assert Contract(user_api_contract).verify(response.json()) is True
注意:这里的测试 api 由reqres.in提供支持