Python接口测试实战5(下) - RESTful、Web Service及Mock Server

这篇具有很好参考价值的文章主要介绍了Python接口测试实战5(下) - RESTful、Web Service及Mock Server。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本节内容

  • REST及RESTful API

  • Web Service

  • XML解析

  • Mock Server

REST及RESTful API

REST:表述性状态转移或表现层状态转移,“表现”及每个接口地址(URI)都表现为(视为)一个资源对象(文本资源、图片资源、服务资源),状态转移指通过POST/PUT方法发送完整的新状态信息来更改资源对象的状态

如某https://api.***.com/user资源状态为{"name": "Kaka", "age": 30},我们通过POST/PUT请求发送新状态{"name": "Kaka", "age": 18}来更新对象信息,完成状态转移

URI 与URL的区别:URL值包含协议的链接,如 https://www.baidu.com, 还有一种相对链接叫URN,如/doc/1.html,这两种都能唯一定位一个资源,URI(统一资源定位符)包含URL和URN

RESTful API是一种接口设计风格或规范,主要有以下特点:

  • 统一使用https协议

  • 接口使用专用的api域名 https://api.example.com/

  • 接口分版本管理 https://api.example.com/v1/

  • 路径又称"终点"(endpoint),表示API的具体网址,路径中只能包含名词(代表资源对象),可以使用复数来代表多个一个资源集合https://api.example.com/v1/zoos

  • 同一个接口提供多种请求方法,GET获取资源信息,POST新建或更新资源,PUT/PATCH更新资源,DELETE删除资源

  • 可以通过url参数过滤信息 https://api.example.com/v1/zoos?limit=10 # 获取前10个

  • 尽量使用JSON, 避免使用XML

  • 身份认证推荐使用OAuth2.0,或Basic Auth,token等,避免使用Cookie和Session(RESTful强调无状态的设计)

示例:

https://api.github.com

授权 Basic Auth (superhin001, ***) 或 Oauth 2.0 Access Token: 1c4f679300f29ee4e7041028d49e504b9da145b1

GET https://api.github.com/user 获取用户信息

Python接口测试实战5(下) - RESTful、Web Service及Mock Server

POST/PATCH https://api.github.com/user 修改用户信息

Python接口测试实战5(下) - RESTful、Web Service及Mock Server

POST/PATCH 数据

Copy{"login":"superhin001","id":21163682,"node_id":"MDQ6VXNlcjIxMTYzNjgy","avatar_url":"https://avatars3.githubusercontent.com/u/21163682?v=4","gravatar_id":"","url":"https://api.github.com/users/superhin001","html_url":"https://github.com/superhin001","followers_url":"https://api.github.com/users/superhin001/followers","following_url":"https://api.github.com/users/superhin001/following{/other_user}","gists_url":"https://api.github.com/users/superhin001/gists{/gist_id}","starred_url":"https://api.github.com/users/superhin001/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/superhin001/subscriptions","organizations_url":"https://api.github.com/users/superhin001/orgs","repos_url":"https://api.github.com/users/superhin001/repos","events_url":"https://api.github.com/users/superhin001/events{/privacy}","received_events_url":"https://api.github.com/users/superhin001/received_events","type":"User","site_admin":false,"name":"我是韩老师","company":null,"blog":"","location":null,"email":"superhin@126.com","hireable":null,"bio":null,"public_repos":3,"public_gists":0,"followers":0,"following":0,"created_at":"2016-08-22T01:12:32Z","updated_at":"2018-09-14T02:33:43Z","private_gists":0,"total_private_repos":0,"owned_private_repos":0,"disk_usage":45430,"collaborators":0,"two_factor_authentication":false,"plan":{"name":"free","space":976562499,"collaborators":0,"private_repos":0}}

GET https://api.github.com/user/keys 获取用户所有SSH-Key信息

Python接口测试实战5(下) - RESTful、Web Service及Mock Server

POST https://api.github.com/user/keys 新建Key

Python接口测试实战5(下) - RESTful、Web Service及Mock Server

POST 数据

Copy{"id":30742411,"key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDfsTJs7mNWstJ+tO6O1jQHKdDdnldqlqkO0gAune9EH7oqICD1hP7c1duNZwvNnvyGa7SyqamIpNXmSYv303FEVAXzPsb9MzCChG16gzevQtbIX4Qt7vFOsHNSCikSCD/s6DMa0Koryiu7Yju5mW9UUnjVM+a1P80SOiK7p2UBQPFVKRrUtr0htV3U6a2rdP51Vzm2UCjChTUa4q7L3m4C7oB9aSvUsNTk+PmuJlAer4oOd7FsNPqD1Or3lRKAmgxbTX4xTaOkwibK0t2eYkh/VTUPMQ9wDwpa4hZLiEq9qSew3McCwsl70k4H0H4F/VwV2sSCXqZu274YmNDT5Hl3 hanzhichao@hanzhichao01","title":"test3","verified":true,"created_at":"2018-09-14T09:54:51Z","read_only":false}

Web Service

Web Service 是一种跨平台(Java对象,Python也可以调用)RPC(远程方法调用)解决方案。

基于SOAP协议,使用XML这种跨平台语言传输对远程方法的调用信息及返回结果,并提供WSDL接口描述服务

  • SOAP:简单面向对象协议, 基于XML语言,使用HTTP协议传输

  • XML: 可扩展标记语言,同JSON一样是一种跨平台语言

  • WSDL: Web Service服务描述语言,提供远程对象的调用描述信息(类似于接口文档,XML格式)

SOAP格式

SOAP协议基于XML语言, SOAP消息体首先必须有个信封(Enelope),信封中可以有信息头(Header)和信息体(Body),其中Body中还可以包含错误信息(Fault)

基本格式如下:

Copy<!-- 信封固定格式 指定命名空间为soapenv --><soapenv:Envelopexmlns:soapenv="http://www.w3.org/2001/12/soap-envelope"soapenv:encodingStyle="http://www.w3.org/2001/12/soap-encoding"><soapenv:Header><!--信息头 可选,可写成但标签-->
        ......
    </soapenv:Header><soapenv:Body><!--信息体 实际调用内容-->
        ......
    </soapenv:Body></soap:Envelope>
SOAP详细教程: http://www.runoob.com/soap/soap-header.html

使用SoupUI

示例接口: http://115.28.108.130:4000/?wsdl

由于Postman等不具备将wsdl接口信息解析成对象描述的功能,我们使用另一个SOAP接口专用的测试工具SoupUI

SoupUI下载地址: http://www.wmzhe.com/soft-32815.html

1.新建项目

Python接口测试实战5(下) - RESTful、Web Service及Mock Server
Python接口测试实战5(下) - RESTful、Web Service及Mock Server
Python接口测试实战5(下) - RESTful、Web Service及Mock Server

2.发送接口

Python接口测试实战5(下) - RESTful、Web Service及Mock Server
Python接口测试实战5(下) - RESTful、Web Service及Mock Server

使用Fiddler抓包,查看raw格式:

CopyPOSThttp://115.28.108.130:4000/ HTTP/1.1Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8SOAPAction: "addUser"Content-Length: 370Host: 115.28.108.130:4000Connection: Keep-AliveUser-Agent: Apache-HttpClient/4.1.1 (java 1.5)

<soapenv:Envelopexmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:user="UserService">
   <soapenv:Header/><soapenv:Body><user:addUser><!--Optional:--><user:name>范冰冰</user:name><!--Optional:--><user:password>123456</user:password></user:addUser></soapenv:Body>
</soapenv:Envelope>

使用Postman发送SOAP接口

Python接口测试实战5(下) - RESTful、Web Service及Mock Server
text/xml 和 application/xml的区别: 当你<?xml version='1.0' encoding='UTF-8'>指定编码的时候,使用application/xml会安装xml指定的编码传输,而使用text/html会默认使用us-ascii编码编码传输数据

使用Python操作Web service接口

pip install suds-jurko
Copyfrom suds.client import Client

service = Client("http://115.28.108.130:4000/?wsdl").service  # 获取远端服务对象
result = service.addUser("范冰冰", "123456")  # 向本地方法一样调用print(result)  # 输出 用户已存在

使用requests库发送

Copyimport requests

url = 'http://115.28.108.130:4000/'

data = '''<soapenv:Envelopexmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:user="UserService"><soapenv:Header/><soapenv:Body><user:addUser><!--Optional:--><user:name>张三</user:name><!--Optional:--><user:password>123456</user:password></user:addUser></soapenv:Body></soapenv:Envelope>
'''.encode('utf-8')

res = requests.post(url=url,data=data)
print(res.text)

结果:

Copy<?xml version='1.0' encoding='UTF-8'?><soap11env:Envelopexmlns:soap11env="http://schemas.xmlsoap.org/soap/envelope/"xmlns:tns="UserService"><soap11env:Body><tns:addUserResponse><tns:addUserResult>用户已存在</tns:addUserResult></tns:addUserResponse></soap11env:Body></soap11env:Envelope>

XML解析

XML: 可扩展标记语言,使用标签,多级树状结构,多用来存储和传输数据,如:

Copy<bookstore>
	<bookcategory="COOKING">
		<titlelang="en">Everyday Italian</title>
		<author>Giada De Laurentiis</author>
		<year>2005</year>
		<price>30.00</price>
	</book>
	<bookcategory="CHILDREN">
		<titlelang="en">Harry Potter</title>
		<author>J K. Rowling</author>
		<year>2005</year>
		<price>29.99</price>
	</book>
	<bookcategory="WEB">
		<titlelang="en">Learning XML</title>
		<author>Erik T. Ray</author>
		<year>2003</year>
		<price>39.95</price>
	</book></bookstore>
  • 根元素(根节点),父元素,子元素,同级元素:bookstore为根元素,book是title的父元素,title是book的子元素,title和author是同级元素

  • 标签,属性,文本:bookstore boot title等为标签(元素节点),boot中category="COOKING" category为属性,COOKING为属性值,之间的Everyday Italian为文本

Python解析XML

  1. 加载元素树(ElementTree)得到根节点

  1. 从根节点使用xpath查找其他节点

Copyfrom xml.etree import ElementTree
d = '''<bookstore>
	<bookcategory="COOKING">
		<titlelang="en">Everyday Italian</title>
		<author>Giada De Laurentiis</author>
		<year>2005</year>
		<price>30.00</price>
	</book>
	<bookcategory="CHILDREN">
		<titlelang="en">Harry Potter</title>
		<author>J K. Rowling</author>
		<year>2005</year>
		<price>29.99</price>
	</book>
	<bookcategory="WEB">
		<titlelang="en">Learning XML</title>
		<author>Erik T. Ray</author>
		<year>2003</year>
		<price>39.95</price>
	</book></bookstore>
'''
root = ElementTree.fromstring(d) # 加载元素树(ElementTree)得到根节点

print(root.find("."))  # 选择当前节点
print(root.find("book"))  # 选择标签为book的子节点
print(root.find("book[2]"))  # 选择标签为book的第三个子节点
print(root.find("book[@category='COOKING']"))  # 选择标签为book切标签属性为category="COOKING"
print(root.find("./book/[title='Harry Potter']"))  # 选择标签为book的节点中包含子标签title 切title的文本内容为Harry Potter

结果:

Copy<Element'bookstore' at 0x000002406B666688>
<Element'book' at 0x000002406B6666D8>
<Element'book' at 0x000002406B8600E8>
<Element'book' at 0x000002406B6666D8>
<Element'book' at 0x000002406B8600E8>
find()返回的是节点对象,可以通过.tag获取标签名,.attrib获取属性字典,.text获取文本

XPath选择器

  • 路径: 按路径选择

  • 标签名: 选定所有该名的标签

  • *: 选定所有元素

  • . : 选择当前节点

  • ..: 选择上级节点

  • //: 选择当前元素下所有级别的元素

  • [@属性名]:选择所有具有当前属性的元素

  • [@属性名=属性值]: 选择属性=属性值的元素

  • [子标签名]:选择具有当前子标签的元素

  • [子标签名='文本']: 选择子标签文本的元素

常用的三种定位元素方法

  1. 从根节点按路径选择: root.find("./book[3]/title")

  1. 按属性并结合相对路径选择: root.find(book[@category='WEB']/title)

  1. 按所包含的独特子标签选择: root.find(book[title='Harry Potter']/title)

Mock Server

Mock 即模拟,就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法,其最大的优势就是降级前后端耦合度,使前端工程师可以不依赖后端返回数据,先开发前端样式以及逻辑处理

简单来说: Mock是用了解决依赖问题的,将复杂的/不稳定的/还未建立的依赖对象用一个简单的假对象来代替

Mock Server 即Mock接口服务器,可以通过配置快速Mock出新的接口

Mock Server的使用范围

  • 前后端分离项目

  • 所测接口依赖第三方系统(还未具备)

  • 所测接口依赖复杂或依赖的接口不稳定,并不作为主要验证对象

同时在接口还未开发好时,提供Mock接口(假接口)会比只有接口文档更直观,并能有效减少沟通成本和一些文档理解bug

Postman的Mock Server功能

Python接口测试实战5(下) - RESTful、Web Service及Mock Server
Python接口测试实战5(下) - RESTful、Web Service及Mock Server
Python接口测试实战5(下) - RESTful、Web Service及Mock Server
Python接口测试实战5(下) - RESTful、Web Service及Mock Server
Postman还可以基于Collection建立Mock Server,这里不再详述

Python+Flask自己搭建Mock接口

使用Flask包我们可以快速搭建Mock接口

pip install flask
Copyfrom flask import Flask, request, jsonify, abort
import random

app = Flask(__name__) # 实例化一个Flask对象@app.route("/api/user/reg/", methods=["POST"])defreg():
    ifnot request.json ornot'name'in request.json ornot'password'in request.json:
        abort(404) 
    res = [
              {
                "code": "100000",
                "msg": "成功",
                "data": {
                  "name": "李六",
                  "password": "e10adc3949ba59abbe56e057f20f883e"
                }
              },
              {
                "code": "100001",
                "msg": "失败,用户已存在",
                "data": {
                  "name": "李六",
                  "password": "e10adc3949ba59abbe56e057f20f883e"
                }
              },
              {
                "code": "100002",
                "msg": "失败,添加用户失败",
                "data": {
                  "name": "李六",
                  "password": "e10adc3949ba59abbe56e057f20f883e"
                }
              }
          ]

    return jsonify(random.choice(res))

if __name__ == '__main__':
    app.run()
Python接口测试实战5(下) - RESTful、Web Service及Mock Server
高效学习,快速掌握Python自动化所有领域技能
同步快速解决各种问题
配套实战项目练习

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!!文章来源地址https://www.toymoban.com/news/detail-410779.html

Python接口测试实战5(下) - RESTful、Web Service及Mock Server

到了这里,关于Python接口测试实战5(下) - RESTful、Web Service及Mock Server的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • web应用模式、API接口、接口测试工具postman、如何在浏览器中测试、restful规范、序列化反序列化、基于Django原生编写五个接口、drf介绍和快速使用、drf之APIView源码分析

    web应用模式、API接口、接口测试工具postman、如何在浏览器中测试、restful规范、序列化反序列化、基于Django原生编写五个接口、drf介绍和快速使用、drf之APIView源码分析

    目录 一、web应用模式 二、API接口 三、接口测试工具postman postman介绍 postman下载与使用 四、如何在浏览器中测试 五、restful规范(重要) 六、序列化反序列化 七、基于Django原生编写五个接口 八、drf介绍和快速使用 概念 特点(了解一下) 安装 使用drf编写五个接口 九、drf之API

    2024年02月05日
    浏览(19)
  • Spring Boot单元测试使用MockBean注解向Service注入Mock对象

    我们在测试时有一个Service,我们需要测试Service,但Service内部依赖ServiceA、ServiceB,此时我们希望Mock ServiceA,ServiceB 注入真实对象。 在Spring Boot Test中使用@Spy注解标记Service对象,但是其余真实对象无法注入,因为@Spy注解只能部分模拟对象,而无法注入真实对象。在这种情况下

    2024年02月13日
    浏览(14)
  • 15.Spring Boot单元测试(Service、Mock、Feign、Http Rest API)

    15.Spring Boot单元测试(Service、Mock、Feign、Http Rest API)

    Spring Boot专栏目录(点击进入…) **test**表示依赖的组件仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包包含进去;spring-boot-starter-test是Spring Boot提供项目测试的工具包,内置了多种测试工具,方便我们在项目中做单元测试、集成测试。 引入spring-boot-star

    2024年02月04日
    浏览(24)
  • Restful接口开发与测试—接口测试

    Restful接口开发与测试—接口测试

    开发完接口,接下来我们需要对我们开发的接口进行测试。接口测试的方法比较多,使用接口工具或者Python来测试都可以,工具方面比如之前我们学习过的 Postman 或者 Jmeter ,Python脚本测试可以使用 Requests + unittest 来测试。 测试思路 功能测试:数据的增删改查 异常测试:未

    2024年02月06日
    浏览(7)
  • 7、单元测试--测试RestFul 接口

    7、单元测试--测试RestFul 接口

    – 测试用例类使用@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)修饰。 – 测试用例类会接收容器依赖注入TestRestTemplate这个实例变量。 – 测试方法可通过TestRestTemplate来调用RESTful接口的方法。 测试用例应该定义在和被测试类位于同一个包位置。 解释: 注意点1: 涉及注解:

    2024年02月14日
    浏览(7)
  • Go 单元测试之mock接口测试

    Go 单元测试之mock接口测试

    目录 一、gomock 工具介绍 二、安装 三、使用 3.1 指定三个参数 3.2 使用命令为接口生成 mock 实现 3.3 使用make 命令封装处理mock 四、接口单元测试步骤 三、小黄书Service层单元测试 四、flags 五、打桩(stub) 参数 六、总结 6.1 测试用例定义 6.2 设计测试用例 6.3 执行测试用例代码

    2024年04月22日
    浏览(15)
  • Mock接口测试

    Mock接口测试

    什么是mock? 测试桩,模拟被测对象的返回,用于测试 通常意义的mock指的就是mock server, 模拟服务端返回的接口数据,用于前端开发,第三方接口联调 为什么要mock? 1. 解决依赖问题: 当我们测试一个接口或者功能模块的时候,如果这个接口或者功能模块依赖其他接口或其他模

    2024年02月09日
    浏览(9)
  • 接口抓包分析与Mock实战

    接口抓包分析与Mock实战

    如何定位 Bug 是前端产生还是后端产生的? 没有接口文档的时候,如何获取接口信息? 代理功能:HTTP/HTTPs、SOCKS5。 请求模拟工具:拼装请求、重放请求,重复请求。 网络环境模拟:限速、超时、返回异常。 Mock:请求修改、响应修改。 Fake:用测试环境替代真实环境。 工具

    2024年02月08日
    浏览(12)
  • java对接web service接口遇到的坑,postman测试代码报错415Unsupported Media Type,程序中报错org.xml.sax.SAXException: Bad en

    对接web service接口,soapUI工具接口调用成功,但是postman调用报错 415Unsupported Media Type ,程序中报错 org.xml.sax.SAXException: Bad envelope tag: Fault ,经过调查,是请求头信息,然后深究之后发现是web Service 的soap协议问题,网上大部分解决方案提供的都是spap1.1协议的,但是我的接口提供

    2024年02月05日
    浏览(10)
  • 【Fiddler】Fiddler实现mock测试(模拟接口数据)

    【Fiddler】Fiddler实现mock测试(模拟接口数据)

    软件接口测试过程中,经常会遇后端接口还没有开发完成,领导就让先介入测试,然后缩短项目时间,有的人肯定会懵,接口还没开发好,怎么介入测试,其实这就涉及到了我们要说的mock了。 一、mock原理 mock测试其根本任务就是能够模拟后端服务器接口数据。 其实就是提供

    2024年02月17日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包