【Python】pact-python模块进行契约测试

2023-11-10 18:52

本文主要是介绍【Python】pact-python模块进行契约测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Pact是一个契约测试框架,有多种语言实现,本文主要介绍模块pact-python进行契约测。
官网:https://docs.pact.io/implementation_guides/python/readme

安装命令:pip install pact-python  
安装过程中如果报错,安装失败,需要进如pact包下载官网,找到对应的ZIP包自行下载,
https://github.com/pact-foundation/pact-ruby-standalone/releases 
放到pact\bin目录下,再重新用命令pip install pact-python  安装

此外需要安装另外两个依赖包:pip install requests 和pip install Flask

Step 1: 写一个 customer:customer_success.py

import requestsheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0',"Content-Type": "application/json",
}
data={"data": {"transactionType": "C",  # "brnNo": "9998199930",   #"taxInvoiceNumber": "202106161221150000000001", "supplierBrnNo":"9998199954","creationDate": "20210616",     #"taxInvoiceType": "11",  # "supplyPrice": 75000000000,     #"taxAmount": 320000000,         # "buyerBrnNo": "9998199916",# 非必填"mainItems": "전산장비","remark1": "하드웨어 10종","remark2": "소프트웨어 30종","supplierCmpName": "서울데이터시스템","buyerCmpName": "종각은행"},"header": {"chanlId": "IDC","grpId": "GROUPID001","messageTimeStamp": '2021-05-17T20:00:20.123Z',"trackingId": "ABC123DEF456"}
}
url = 'http://127.0.0.1:8080'def OLTP_inquiry():api = '/api/v2/coperator/taxInvoice'f_url = url + apiprint("请求接口:",f_url)json_data = dataprint("请求参数:",json_data)resp = requests.post(f_url, json=json_data,headers=headers)print("响应参数:",resp.json())if __name__ == '__main__':OLTP_inquiry()


Step 2: 写一个 customer:customer_error.py

import requestsheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0',"Content-Type": "application/json",
}
data={"data": {"transactionType": "C",  # C-create,目前只支持C"brnNo": "9998199930",   # BRN"taxInvoiceNumber": "202106161221150000000000",  # BRN"supplierBrnNo":"9998199954","creationDate": "20210616",     #"taxInvoiceType": "11",  # 11-Electronic Tax Invoice,21-Electronic Tax Invoice(Exempt from taxation),31-Electronic Tax Invoice(Customs)"supplyPrice": 75000000000,     # Supply Price in KRW"taxAmount": 320000000,         # Tax Amount in KRW"buyerBrnNo": "9998199916",# 非必填"mainItems": "전산장비","remark1": "하드웨어 10종","remark2": "소프트웨어 30종","supplierCmpName": "서울데이터시스템","buyerCmpName": "종각은행"},"header": {"chanlId": "IDC","grpId": "GROUPID001","messageTimeStamp": '2021-05-17T20:00:20.123Z',"trackingId": "ABC123DEF456"}
}
url = 'http://127.0.0.1:8080'def OLTP_inquiry_error():api = '/api/v2/coperator/taxInvoice'f_url = url + apiprint("请求接口:",f_url)json_data = dataprint("请求参数:",json_data)resp = requests.post(f_url, json=json_data,headers=headers)print("响应参数:",resp.json())if __name__ == '__main__':OLTP_inquiry_error()


Step 3: 写一个 provider:oltp_service.py

from flask import Flask,request
app = Flask(__name__)@app.route('/api/v2/coperator/taxInvoice',methods=["POST"])
def create_tax_invoice():resp_success  ={"result": {"trackingId": "test","messageTimeStamp": "2021-06-16T15:45:59.123Z","chanlId": "IDC","grpId": "group id"},"data": {"ackSignal": "0"}}resp_error ={"result": {"trackingId": "test","messageTimeStamp": "2021-06-16T15:45:59.123Z","chanlId": "IDC","grpId": "group id"},"data": {},"error": {"code": "1234modulenm","description": "사업자번호가 존재 하지 않습니다.","descriptionKr": "Not Exist Business Registration Number"}}data = request.get_json()print(data)resp_success['result'] = data['header']resp_error['result'] = data['header']tax_no = data['data']['taxInvoiceNumber']if tax_no[-1:]=='0':return resp_errorelse:return resp_successif __name__ == '__main__':app.run(port=8080)


Step 4: 获取预期结果
先运行oltp_service.py文件启动provider服务,然后分别运行customer_success.py和customer_error.py
最终得到正常类和异常类两种预期结果。
Step 5: 写一个正常类和一个错误类案例
根据上面两个预期结果编写两个对应的测试用例
正常类测试用例:invoice_tax_pact.py

import atexit
import requests
import unittest
from pact.consumer import Consumer
from pact.provider import Provider
from pact import Like# 定义一个pact,消费者是ModuleB,生产者是ModuleA,契约文件存放在pacts文件夹下
pact = Consumer('customer_success').has_pact_with(Provider('oltp_service'), pact_dir='../pacts')
# 启动服务
pact.start_service()
atexit.register(pact.stop_service)# 测试用例
class UserTesting(unittest.TestCase):def test_service(self):post_data = {"data": {"transactionType": "C","brnNo": "9998199930","taxInvoiceNumber": "202106161221150000000001","supplierBrnNo": "9998199954","creationDate": "20210616",  #"taxInvoiceType": "11","supplyPrice": 75000000000,"taxAmount": 320000000,"buyerBrnNo": "9998199916","mainItems": "전산장비","remark1": "하드웨어 10종","remark2": "소프트웨어 30종","supplierCmpName": "서울데이터시스템","buyerCmpName": "종각은행"},"header": {"chanlId": "IDC","grpId": "GROUPID001","messageTimeStamp": '2021-05-17T20:00:20.123Z',"trackingId": "ABC123DEF456"}}# 消费者定义的期望结果expected = {"result": {"trackingId": "test","messageTimeStamp": "2021-06-16T15:45:59.123Z","chanlId": "IDC","grpId": "group id"},"data": {"ackSignal": "0"}}# 消费者定义的契约的实际内容。包括请求参数、请求方法、请求头、响应值等(pact.given('test service.').upon_receiving('post request for oltp_service').with_request(method='post', path='/api/v2/coperator/taxInvoice',body=post_data,headers={'Content-Type': 'application/json'})# 具体校验内容.will_respond_with(200, body={'data': {"ackSignal": "0"},"result": {"trackingId": Like('hello world'),  # string类型"chanlId": "IDC","grpId": "GROUPID001"},}))# pact自带一个mock服务,端口 1234,用requests向mock接口发送请求,验证mock的结果是否正确with pact:res = requests.post("http://localhost:1234/api/v2/coperator/taxInvoice",json=post_data).json()self.assertEqual(res['data'], expected['data'])if __name__ == "__main__":ut = UserTesting()ut.test_service()


Step 5: 运行测试案例获取契约文件
运行上面的invoice_tax_pact.py文件后,会在对应pacts目录生成契约文件
Step 6: 运行服务和测试案例
先启动第三步创建的服务oltp_service.py
然后打开终端,进入契约文件目录,运行命令
pact-verifier --provider-base-url=http://127.0.0.1:8080 --pact-url=customer_success-oltp_service.json

这篇关于【Python】pact-python模块进行契约测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384625

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

Python进行JSON和Excel文件转换处理指南

《Python进行JSON和Excel文件转换处理指南》在数据交换与系统集成中,JSON与Excel是两种极为常见的数据格式,本文将介绍如何使用Python实现将JSON转换为格式化的Excel文件,... 目录将 jsON 导入为格式化 Excel将 Excel 导出为结构化 JSON处理嵌套 JSON:

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统