如何用Pact进行微服务集成测试(二)_from pact import consumer-程序员宅基地

我们的例子:

我们会测试2个小服务的集成。

服务provider是我们在jenkins plugin例子里使用过的相同的服务。它叫’bringon‘,是用Go写的一个是用mongoDB的保存软件构建信息的注册表。

我们的consumer是一个很薄的python客户端,它只知道从bringon是用构建编号来获取构建信息的。

在CDC里consumer先开始 - 我们从这来。

consumer代码现在由一个带有2个函数的client.py文件组成。我们只关注叫’build‘的函数 - 它是我们要测试的函数。

import requests

…

def getbuild(host, port, buildnum):
    """Fetch a build by number ."""
    uri = 'http://'   host   ':'   port   '/builds/'   str(buildnum)
    return requests.get(uri).json()

为了为它生成pact - 我们写一个叫build_test.py的测试文件:

import atexit
import unittest
import client

from pact import Consumer, Provider

pact = Consumer('buildReader').has_pact_with(Provider('bringon'))
pact.start_service()
atexit.register(pact.stop_service)

class GetBuildInfoContract(unittest.TestCase):
  def test_get_build(self):
    true = True
    expected = {
      u'name':u'#3455',
      u'completed': true, #boolean
      u'info':{
        u'coverage':30,
        u'apiversion':0.1,
        u'swaggerlink':u'http://swagger',
        u'buildtime':230}
    }

    (pact
     .given('build 3455 exists')
     .upon_receiving('a request for build 3455')
     .with_request('get', '/builds/3455')
     .will_respond_with(200, body=expected))

    with pact:
      result = client.build(3455)

    self.assertEqual(result, expected)

这很直接 - 我们建了一个mock的service,定义了一个期望的http reponse和body, 并调用client.build()来保证交互是按期望进行的。

如果一切正常 - 一个叫buildreader-bringon.json的pact文件会写入到我们的工作目录。

现在我们可以将这个文件发给bringon的开发,让他们可以用这个pact来测试他们的服务。

这可以用pact-go来完成 - Golang的框架。测试看起来会是这样:

func TestPact(t *testing.T) {
    go startInstrumentedBringon()
    pact := createPact()
    // Verify the Provider with local Pact Files
    log.Println("Start verify ", []string{filepath.ToSlash(fmt.Sprintf("%s/buildreader-bringon.json", pactDir))},
        fmt.Sprintf("http://localhost:%d/setup", port), fmt.Sprintf("http://localhost:%d", port), fmt.Sprintf("%s/buildReader-bringon.json", pactDir))
    err := pact.VerifyProvider(types.VerifyRequest{
        ProviderBaseURL:        fmt.Sprintf("http://localhost:%d", port),
        PactURLs:               []string{filepath.ToSlash(fmt.Sprintf("%s/buildReader-bringon.json", pactDir))},
        ProviderStatesSetupURL: fmt.Sprintf("http://localhost:%d/setup", port),
    })

    if err != nil {
        t.Fatal("Error:", err)
    }

}

记住这需要一点额外的工作。我们需要需要实现startInstrumentedBringon()方法,它使用额外的'/setup' endpoint来定义服务状态并启动我们的服务。在我们的场景这用于创建一个入口点来满足我们消费者的期望。我们也需要创建一个Pact客户端对象来校验所有交互动作。像这样:

func createPact() dsl.Pact {
    // Create Pact connecting to local Daemon
    log.Println("Creating pact")
    return dsl.Pact{
        Consumer: "buildreader",
        Provider: "bringon",
        LogDir:   logDir,
        PactDir:  pactDir,
    }
}

一个使用pact-go的缺点是需要你在后端运行一个常驻进程。这个进程控制服务的初始化,关闭和pact校验。

这在容器内运行一个独立临时进程不太合适。

所以如果我们需要的是用pact测试我们的服务 - 我们可以使用pact-go包中的轻量级pact-provider-verifier工具。

像这样:

pact-provider-verifier --pact-urls <path_to>/buildreader-bringon.json --provider-base-url http://localhost:8091 --provider-states-setup-url http://localhost:8091/setup

请记住在这个例子里我们需要实现和构建'/setup' endpoint作为我们服务的一部分。这在我们想让我们的服务可测试时是个好主意。

服务的代码可以在我们的Github找到:

bringon(也就是Provider):https://github.com/codefreshdemo/bringonbuildreader(也就是消费者)https://github.com/antweiss/cdc-pact-demoPact源码和例子:https://github.com/pact-foundation

在这个博客的下篇我们会展示如何让运行合约测试作为你的Codefresh(译者注:codefresh.io是一个CI/CD提供商) 流水线的一部分。

本文来自祝坤荣(时序)的微信公众号「麦芽面包,id「darkjune_think」转载请注明。交流Email: [email protected]

文章来自微信平台「麦芽面包」微信公众号「darkjune_think」转载请注明。微信扫一扫关注公众号。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/darkjune/article/details/103950231

智能推荐

date的before方法_Java Date before()方法与示例-程序员宅基地

文章浏览阅读1.7w次。date的before方法 日期类before()方法 (Date Class before() method)before() method is available in java.util package. before()方法在java.util包中可用。 before() method is used to check whether this date is before the g..._java date before

HTML5+CSS3小结_css text break-程序员宅基地

文章浏览阅读444次。【【【【【【【【【【【【【【【【【【【【【【【HTML5】】】】】】】】】】】】】】】】】】】】】】】】】】】】】-------------------------------------------------------------------------------------------------------------不允许写的结束符的标签:area、basebr、col、co_css text break

逻辑回归python实现_python 逻辑回归-程序员宅基地

文章浏览阅读4.1w次,点赞15次,收藏147次。1.问题使用线性回归怎么解决分类问题?这就是逻辑回归要做的事情,并且逻辑回归可以计算出概率2.模型以及求解(线性)给出一组m个样本数据,每个样本数据有n个特征,并且带有标记0或者1,代表属于哪一类,为了把输入的参数代入到预测函数后始终是一个0到1之间的数,这样我们可以把0,1看做两个类别, 引入sigmod函数 1/(1+e^-t) 这个函数的函数值始终是在0到1之间让s..._python 逻辑回归

TS解扰速率计算公式备忘_lc ts 解扰-程序员宅基地

文章浏览阅读1.7k次。 今天经理想了解解扰速率的计算方式,自己用笔在草纸上划了半天才回忆起来。把推导的过程记录下来,做为备忘。 解扰器的输入时钟一共2个,分别为27MHz的TS_IOCLK和81MHz的TS_DCLK。前者是解扰器接收TS输入的时钟,每一个有效的时钟周期接收一个字节的数据;后者是解扰器对TS数据进行解扰的时钟,之所以取值81MHz是因为在实现过程中要使用FPGA的PLL倍频获得较高速的解扰时钟,故选用27MHz*3。 为了满足45Mbps的解扰速率,要计算一下_lc ts 解扰

AIX5.3安装ssh _ssh for aix5.3-程序员宅基地

文章浏览阅读826次。AIX5.3安装ssh 我实在不能理解为何aix竟然不把ssh作为缺省配置的软件,还要自己独立安装,而且ibm的网站竟然还不提供相关软件(需要到sourceforge.net/projects/openssh-aix下载)。 好在安装倒也不是难事。1、下载 需要如下四个包(我的版本是下面文件) _ssh for aix5.3

FCSC 2020 CTF 代码混淆逆向题 Keykoolol 的 writeup_xn--%20%20%20%20%20%20%20%20%20mc-c%20-cccc-c-%20c-程序员宅基地

文章浏览阅读1.1k次。通过基于虚拟机的混淆保护了keygenme,这是一种基于Miasm动态符号执行(DSE)的解决方案,可自动反汇编VM字节码。几周前,我参加了法国网络安全挑战赛(简称FCSC)。由法国国家网络安全局(ANSSI)组建的Jeopardy CTF,以选择将在2020年底参加欧洲网络安全挑战赛(ECSC)的法国团队。在提出的挑战(加密,反向,pwn,网络,取证,硬件)中,我真的很喜欢做一个名为keykoolol的反向追踪。挑战的目的是分析一个以用户名和序列作为输入的二进制文件,并为其编写一个密钥。然后,_xn--%20%20%20%20%20%20%20%20%20mc-c%20-cccc-c-%20c%20ccf%20cccoolollllll

随便推点

无法同步谷歌日历_安卓手机的日历App之选择、使用(附记:纪念日App)-程序员宅基地

文章浏览阅读1.8k次。=======友好提醒=======★本文为不负责任的自我主观测评,仅代表本人颜控日常需求。★本文涉及的ios系统(兼)App,不代表本人的ios日历App择用。★本文涉及的App排序不代表排名,但个人喜好突出。★本文所用的App无下载链接,均来自于自带手机的应用市场。★本文涉及的App多、内容多、图片多(极力缩减合并同类项了),无流量的,请慎看。★本文涉及的vivo手机和App仅代表本...

学习Python和机器学习的几个不错网址_学习python的网站-程序员宅基地

文章浏览阅读5.8k次,点赞6次,收藏32次。为了理解和应用机器学习技术,你需要学习 Python 或者 R。这两者都是与 C、Java、PHP 相类似的编程语言。但是,因为 Python 与 R 都比较年轻,而且更加“远离”CPU,所以它们显得简单一些。相对于R 只用于处理数据,使用例如机器学习、统计算法和漂亮的绘图分析数据, Pthon 的优势在于它适用于许多其他的问题。因为 Python 拥有更广阔的分布(使用 Jango 托管网站,自_学习python的网站

Dataset和DataLoader;pytorch-lightning、pytorch训练代码大概流程_dataset pytorch lightning-程序员宅基地

文章浏览阅读3.3k次。1、Dataset和DataLoader1)Dataset类,构建数据,需要重写__len__和__getitem__这两个函数2)DataLoader,迭代器,加载Dataset数据把分batch用作模型输入import torchimport torch.utils.data.dataset as Dataset#引入DataLoader:import torch.utils.data.dataloader as DataLoaderimport numpy as np Data = _dataset pytorch lightning

[蓝桥] 算法训练 P0505-程序员宅基地

文章浏览阅读155次。时间限制:1.0s 内存限制:256.0MB  一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5!=12345..._castles蓝桥

Jenkins:Linux下安装部署步骤-程序员宅基地

文章浏览阅读909次。Jenkins:Linux下安装部署步骤 【转载:https://www.cnblogs.com/code-juggler/p/9177805.html】1. 准备环境  首先,需要jdk是必须要安装好的。本人使用的linux是centos,直接使用yum安..._shutting down jenkins [failed] starting jenkins running from: /usr/share/jav

HDU 2620 Ice Rain 余数的性质_ice rain------i was waiting for a girl, or waiting-程序员宅基地

文章浏览阅读149次。Problem DescriptionIce Rain------I was waiting for a girl, or waiting for been addicted to the bitter sea. Love for irrigation in silence. No one considered whether the flowers came out or wither. L..._ice rain------i was waiting for a girl, or waiting for been addicted to the