前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实现接口的契约测试

实现接口的契约测试

作者头像
赵云龙龙
发布2020-09-24 15:48:48
1.4K0
发布2020-09-24 15:48:48
举报
文章被收录于专栏:python爱好部落python爱好部落

在当前微服务和前后端分离大行其道的行业背景下,越来越多的团队采用了前后端分离和微服务的架构风格。 A团队开发某服务并提供对应API服务,B团队是A团队的使用者调用A团队的API。A团队埋头苦干,B团队也争分夺秒,两边都开发完了,往往一联调,就出现很多问题。

问题和困境 API调用方对API提供方的变更经常需要通过对API的测试来感知。 直接依赖真实API的测试效果受限与API提供方的稳定性和反应速度。

解决方案 解决方式首先是依赖关系的解耦,去掉直接对外部API的依赖,而是内部和外部系统都依赖于一个双方共同认可的约定—“契约”,并且约定内容的变化会被及时感知;其次,将系统之间的集成测试,转换为由契约生成的单元测试,例如通过契约描述的内容,构建测试替身。这样,同时契约替代外部API成为信息变更的载体

契约测试也叫消费者驱动测试。 两个角色:消费者(Consumer)和 生产者(Provider) 一个思想:需求驱动(消费者驱动) 契约文件:由Consumer端和Provider端共同定义的规范,包含API路径,输入,输出。通常由Consumber生成。 实现原理:Consumer 端提供一个类似“契约”的东西(如json 文件,约定好request和response)交给Provider 端,告诉Provider 有什么需求,然后Provider 根据这份“契约”去实现。

我们可以通过SCHEMA来实现接口的契约测试。

API测试:通过FAKER生成测试数据,通过SCHEMA检查返回结果

image

需求

假定有如主图相同的http请求。我们一般的做法是,用postman去抓取http请求,然后修改request的body或者header里的数据,点击send按钮,检查返回的response的body是否正确。

对于输入。一般来说,我们会纯手工,或者半自动的,设计测试用例。例如使用边界值分析,等价类划分等方法,用在我们的输入参数中。比如我参数中的configname最多200个参数,我测试输入201个参数。

对于输出。一般来说,我们大部分时候是肉眼检查,或者写代码,通过jsonpath取参数,然后判断是否存在来检查。

这里我打算用一个新的方法来降低测试的手工特性,让他更自动化一点。以下想法还处于调试阶段,用于大规模使用,暂时不行。

设计

输入修改方案:引入faker库和jsonschema库。通过这两个库,我们可以产生随机的json串

faker是我无意之间发现的,能按照规律产生随机字的库,例如

fake.name()

是产生一个随机的名字,只要加入适当的providers,就能按照需要的规则产生随机字

jsonschema这个用的人很多,这里就不介绍了,下面推荐一个网站,能把json请求转换为schema格式

https://www.liquid-technologies.com/online-json-to-schema-converter

schema中会注明每个字段的规则,例如是string类型还是integer。

输出修改方案:使用jsonschma的validate方法来检查(这种检查方法目前有一些检查不充分,但是已经可以让测试人员减少一些工作量了)

jsonschema.validate(response, schema)

使用方案

1.去postman抓取http请求,并且记录下所需要的输入json和输出json

2.打开https://jsonschema.net/ 把输入json和输入json 转换成jsonschema

3.把输入jsonschema文件,输出文件jsonschema放入相应的目录,自己写一个用于生成随机requestbody的provider和一个测试用的主函数

4.运行测试主入口文件,打印一下发送的json文件,看是不是随机化了,结果是确实随机化了。

代码

测试主入口test_json_from_schema.py

#!/usr/bin/env python

# -*- coding: UTF-8 -*-

import  json

import  faker

import  jsonschema

import  requests

from  jsonschema.exceptions  import  ValidationError

import  jsonprovider

def  generate_request(request_json_schema):

    '''

    通过schema生成随机测试数据

    :param request_json_schema:

    :return:

    '''

    fake  =  faker.Faker()

    fake.add_provider(jsonprovider.JSONProvider)

    request_body  =  fake.json(json.load(open(request_json_schema)))

    print(request_body)

    return  request_body

def  check_json_schema(response,  schema):

    '''

    通过json_schema检查返回的json串

    :param response:

    :param schema:

    :return:

    '''

    result  =  True

    try:

        jsonschema.validate(response,  schema)

    except  ValidationError,  e:

        print("fail")

        result  =  False

    return  result

if  __name__  ==  '__main__':

    # 生成request body

    body  =  generate_request("schema_file/create_config_request_schemas.json")

    # 使用request库发送post请求

    url  =  "https://dev.honcloud.honeywell.com.cn:8080/dashboard/clustercentre/configmng/newconfig/addconfig"

    headers  =  {"Content-Type":  "application/json",  "authorization":  "48a5eb61-914e-4b3a-a7a3-0b25f72d06d7"}

    response  =  requests.post(url,  data=body,  headers=headers)

    print(response.json())

    response_json=response.json()

    response_schema="schema_file/create_config_response_schemas.json"

    # 用生成的response的schema来检查

    result=check_json_schema(response_json,response_schema)

    print(result)

其实定义好了契约,用mock来测试消费者,也是很方便的。 python的faker包,就能很好的实现Mock数据。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python粉丝团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 需求
  • 设计
  • 使用方案
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档