pact的python实现(http://pact.io/)
pact-test的Python项目详细描述
python的pact测试
此存储库包含Pact的python实现。契约是 消费者驱动的合同测试。有关pact项目、合同测试、优缺点和 有用的资源请参考Pact website。
消费者驱动的契约测试有两个阶段:消费者建立契约(它是消费者驱动的 毕竟!),供应商将予以尊重。但是,在此之前…
安装
pact测试通过PyPi分发,因此它可以很容易地包含在
requirements.txt
文件或通常与pip
一起安装:
$ pip install pact-test
提供者测试(set the contracts)
消费者运行提供者测试以创建契约并在 他们和服务提供商。使用pact测试的python客户机示例如下 可在here购买。消费者定义 所有与供应商的交互方式如下:
@service_consumer('PythonEats')@has_pact_with('PyzzaHut')classPyzzaHutTest(ServiceProviderTest):@given('some pizzas exist')@upon_receiving('a request for a pepperoni pizza')@with_request({'method':'get','path':'/pizzas/pepperoni/'})@will_respond_with({'status':200,'body':{'id':42,'type':'pepperoni'}})deftest_get_pepperoni_pizza(self):pizza=get_pizza('pepperoni')assertpizza['id']==42assertpizza['type']=='pepperoni'
此测试针对模拟服务器验证预期的交互,并创建 json文件(the pact)将存储在本地,并发送到 契约经纪人,如果有的话。可以为同一个定义多个测试 例如,为了验证所有感兴趣的场景,我们可以 测试不愉快的情况:
@given('some pizzas exist')@upon_receiving('a request for an hawaiian pizza')@with_request({'method':'get','path':'/pizzas/hawaiian/'})@will_respond_with({'status':404,'body':{'message':'we do not serve pineapple with pizza'}})deftest_get_hawaiian_pizza(self):pizza=get_pizza('hawaiian')assertpizza.status_code==404assertpizza.json()['message']=='we do not serve pineapple with pizza'
契约助手
pact测试使用这个helper类在测试前后启动和停止web应用程序。它还定义了 要由测试使用的端口和终结点。下面是pact助手的示例:
classRestaurantPactHelper(PactHelper):process=Nonedefsetup(self):self.process=subprocess.Popen('gunicorn start:app -w 3 -b :8080 --log-level error',shell=True)deftear_down(self):self.process.kill()
帮助程序有几个规则:
- 它必须从
pact_test
扩展PactHelper
类 - 它必须定义一个
setup
方法 - 它必须定义一个
tear_down
方法
也可以覆盖默认url(localhost)和端口(9999):
classRestaurantPactHelper(PactHelper):test_url='0.0.0.0'test_port=5000
状态
当消费者制定一个协议时,它定义了某些州。状态基本上是测试的先决条件。以前 为了遵守协议,提供者需要定义这样的状态。例如:
@honours_pact_with('UberEats')@pact_uri('http://Kalimaha.github.io/src/pacts/pact.json')classUberEats(ServiceConsumerTest):@state('some menu items exist')deftest_get_menu_items(self):DB.save(MenuItem('spam'))DB.save(MenuItem('eggs'))
在本例中,提供者将一些测试数据存储在其db中,以便使系统准备好接收模拟调用 从消费者那里,因此核实协议。
配置
pact测试的默认配置假定以下值:
- 消费者测试路径:
tests/service_consumers
- 提供程序测试路径:
tests/service_providers
- pact_broker_uri:
None
可以通过在项目根目录中创建名为.pact.json
的文件来覆盖这些值。以下
是有效配置文件的示例:
{"consumer_tests_path":"mypath/mytests","provider_tests_path":"mypath/mytests","pact_broker_uri":"http://example.com/"}
所有字段都是可选的:只有指定的字段将覆盖默认配置值。
开发
设置
python3 setup.py install
测试
可以使用docker通过以下命令在本地运行测试:
$ ./bin/test
默认情况下,此命令根据Python3.6测试库。可以按如下方式指定python版本:
$ ./bin/test <ENV>
env的可用值为:py27
、py33
、py34
、py35
和py36
。它也是
可以使用:
$ ./bin/test all
上传新版本
$ python3 setup.py sdist upload
$ python3 setup.py sdist bdist_wheel $ twine upload dist/*