> 文章列表 > 接口文档总结

接口文档总结

接口文档总结

描述一下Http协议

http协议又叫做超文本传输协议,在做网络请求的时候,我们基本上是使用http协议。
http协议包括请求和响应。
请求中包括:请求地址,请求方式,请求方式包括get请求和post请求,get和post区别是get请求是在地址栏后边跟随请求参数,但是请求参数大小是有限制,不同浏览器是不同的。一般是4KB。post请求主要用于向服务器提交请求参数。post请求的参数是放到请求实体内容中的,相对get请求较为安全一些。
另外,请求中会有各种请求头信息,比如支持的数据类型,请求的来源位置,以及Cookie头等相关头信息。
响应,主要包含响应的状态码,像200(),404(),500(),304(),307()
还有各种响应头信息,比如设置缓存的响应头,Content-Type内容类型,设置cookie头信息。

get、post这两种请求方法的区别?

get和post请求都是客户端向服务器提交的一种请求方式 
get是明文传输参数、倾向于请求服务器资源。比如打开网站 
post传输数据不可见,安全性高,倾向于向服务器提交数据,比如注册等

session鉴权

cookie鉴权:登陆接口的响应头当中,有set-cookie
在登陆之后其它业务请求当中,请求头会带上登陆返回的cookie
Session类 - 自动带上cookies
1、实例化Session类

token鉴权:token值 一般都是放在登陆接口的响应数据当中,需要提取出来。
在登陆之后其它业务请求当中,可能是在请求头当中带上token,也可能是在请求体当中带上token
看接口的开发者如何定义

接口测试的过程:

1)准备接口地址
2)选择接口提交方式(get/post)
3)准备参数
4)通过客户端发送请求
5)获取并分析响应数据

接口测试:

1、使用的是postman测试工具
2、接口的类型是HTTP、它的数据转递格式 json格式
3、获取接口信息来开发给的接口文档,
然后设计测试用例是:

common:

my_requests.py   -- 根据项目特色去封装的请求,比如请求头定制/鉴权处理
my_excel.py  -- 数据驱动,需要从excel当中读取数据。文件路径,根据指定去读取整个表单的测试用例数据
mylogger.py  -- 日志封装--要记录接口的请求过程,含测试数据、响应结果、断言表达以及比对。
my_mysql.py  -- 封装数据库连接,数据库操作,关闭。 数据库连接参数配置在Conf目录下
myConf.py  -- 配置文件读取:日志配置、数据库配置、服务器地址配置
my_path.py -- 框架结构当中,不同的目录路径配置。框架内部层级路径封装、可移植。
handle_phone.py -- 手机号码生成。faker生成,用mysql去确认是否已注册。
my_assert.py -- 响应结果的断言封装。

断言

	1、从响应结果当中,提取表达式2、期望结果3、比对方式 = 相等...1、从响应结果当中,提取表达式 -- jsonpath2、如何从响应果当中,通过jsonpath表达式,提取出要比对的数据。

Conf:
配置文件

testcase:
pytest版的测试用例

tesdata:
测试数据 - excel文件

outputs:
logs
reports

===== day7 =====
响应断言、占位符替换

===== day8 =====

数据库断言封装

疏理了接口测试流程

1、在excel中准备测试数据 - 登陆接口
2、从excel当中读取测试数据 - 登陆接口
3、定义一个测试类TestLogin,使用参数化(数据驱动)
4、在类内部:
4.1 如果有要替换的占位符,那么先要替换掉占位符。 – 也要准备占位符对应的数据。
4.2 把替换之后的请求数据(json格式的字符串),转换成一个字典
4.3 发起请求,并接收响应结果
4.4 定义空列表,存放响应断言和数据库断言的最终结果
4.5 处理响应结果断言
4.6 处理数据库断言
4.6 最后看4.4的列表中是否有False,有就AssertionError
优化:
接口url改进了一下。
base_url做成配置化,然后在封装的my_requests当中去拼接。

======= day9 ==============
充值接口的用例编写、自动化用例设计
前置:登陆
获取登陆的返回结果里的 token,用户id,用户余额

步骤:充值

接口依赖/关联处理:

1、将上一个接口的响应数据,提取出来(jsonpath/dict方式)之后,将它设置为全局变量(设置Data类的类属性)
2、下一个接口的请求数据,若要替换,直接从全局变量中读取(获取Data类的类属性值)

处理接口关联:
第一步:提取值
通过jsonpath从响应结果中提取,然后设置为全局变量。我的框架中Data类用来存储全局变量的。
如何通过jsonpath去提取的呢?可能会提取1个值?可能会提取多个值?框架通用性,所有接口通用。
1)在excel当中添加了一列:extract。如果当前这一行的请求,有需求要从响应中提取。
那么就在extract列对应的位置,写上表达式。
形式是字典形式,key-value.key就是变量名,value就jsonpath提取表达式。
2)定义了一公共的提取方法:
解析excel当中extract列,然后从响应结果中提取,然后设置为Data类的属性。
3)在测试框架的接口自动化用例当中,通过判断extract列有没有值,来自动提取。

第二步:替换值

====== day10 ===========
1、定义一个全局变量类Data, 不设置任何属性。它的属性是动态设置的
第一步:提取值
通过jsonpath从响应结果中提取,然后设置为全局变量。我的框架中Data类用来存储全局变量的。
如何通过jsonpath去提取的呢?可能会提取1个值?可能会提取多个值?框架通用性,所有接口通用。
1)在excel当中添加了一列:extract。如果当前这一行的请求,有需求要从响应中提取。
那么就在extract列对应的位置,写上表达式。
形式是字典形式,key-value.key就是变量名,value就jsonpath提取表达式。
2)定义了一公共的提取方法:
解析excel当中extract列,然后从响应结果中提取,然后设置为Data类的属性。
3)在测试框架的接口自动化用例当中,通过判断extract列有没有值,来自动提取。

提取的值,如何与Data类全局变量关联起来的?
提取表达式是以key-value的形式写的。key就是Data类的全局变量名。

======== day11 =========

第二步:替换值

直接从Data类当中取属性值为替换。
Data类的属性从哪里来呢? day10的提取。

正则表达式

0、一条测试用例数据当中,你怎么知道哪些要替换的? #全局变量名#

1、一条测试用例数据当中,url、data,assert要替换的话,你是怎么处理的呢?
一条用例,从excel当中读取出来是一个字典
把字典转成字符串,统一从字符串找所有的标识符。

 怎么找的呢?正则表达式  #(\\w+)#  python的re模块里有findall方法,可以获取所有匹配的结果,放在列表当中。

2、一条测试用例数据当中,要替换多个不同的数据,你是怎么处理的?
怎么样一口气把所有要替换的mark找出来
不同的mark,通过正则表达式,全部都找到了并且放在了列表当中。
遍历标记符mark列表,如果mark是全局变量的属性名,那么就将mark替换为真实的值。

3、你是如何将用例中要替换的标识,与Data全局变量关联起来的?
#标识符#,要与Data类属性名匹配。

=========== day12 =============
1、封装了替换方法。数据来自Data类、生成手机号码的脚本
2、在测试用例当中,调用替换方法
3、在数据库断言封装当中,添加了,对于sql查询数据的比对。
db_type=eq
执行sql语句得到了字典数据
对字典数据进行了比较(在excel的数据库断言当中,expected也换成了字典形式)
处理了Decimal类型的数据

=============== day13 ==========
Data类,是所有的测试类共享的全局变量。所有的测试类,都是向Data类存数据,取数据。
如果是多接口并发的(有2-3个接口用例同时执行), 同时向Data类存数据就会出现问题
为了在多并发的情况下,不影响各个接口类的执行,
每一个接口类,都使用一个Data类的实例化对象来存数据,取数据。
1、定义了一个conftest.py中,class级别的fixture
2、在提取方法、替换方法,都添加一个参数:Data类对象。
提取方法当中,是去向Data类对象设置属性和值
替换方法当中,向Data类对象当中,取属性值
3、在测试类当中:
调用class级别的fixture,接收它的返回值
在调用的提取方法、替换方法当中,传参,传Data类对象

requests文件上传: http://testingpai.com/article/1611909535724

============= day14 =================

数据清理:

自动化对业务系统进行操作。产生数据-业务系统操作
1)数据库有定期清理操作 -
2)如果数据库没有定期清理 - 调用接口删除的/写清理脚本

1、添加了随机数生成(添加项目接口 - 项目的title)
2、添加了前置sql的执行(审核项目接口 - 修改项目的不同状态,然后去审核)

3、mock 虚假/模拟 - 屏蔽掉不稳定的因素
1、要与第三方的接口通信,要等到第三方的接口返回信息给你。
要用你,要你的返回信息,测试测试自己的系统,对于不同的返回信息是否有不同的处理。
2、开发做单元测试
3、TDD - Test Driven Develop – 测试人员写接口测试代码/开发人员写业务代码
4、微服务 - 契约测试(文章)

向mock服务发起请求,才能得到模拟的返回结果。
单元测试框架都有 - unittest,pytest
在线的mock平台
公司内部的mock平台
作用:根据不同的请求,模拟不同的返回数据。
使用它,添加你想要的返回数据。

框架当中集成mock请求:

1、在fastmock当中,制造接口响应数据
2、在excel的用例当中,如果有用例要使用mock服务,则在url列当中,添加#mock_url#
3、在Data类当中,添加mock_url
4、在封装的http请求类当中(MyRequests),__deal_url当中,对于https开头进行处理

RSA加密:

非对称加密   一对钥匙(公钥、私钥)
客户端(公钥加密)    服务端(私钥解密)作为客户端: 要知道公钥(不同的项目都不一样)

框架当中集成RSA加密: emonban.v3

  1. 在common当中添加了rsa_encrpt.py文件。
    里面有generate_sign函数,是依据接口文档当中定义的加密规则去生成加密之后sign
    里面有rsaEncrypt函数,主要就是使用python的rsa模块,完成对msg的rsa加密。里面的公钥也是项目提供 的。

  2. 在封装的my_requests.py当中,做了以下修改:
    2.1 在__init__当中,将headers的X-Lemonban-Media-Type改成了lemonban.v3
    2.2 在send_requests方法当中:

    # 如果是v3版本,则添加向请求体当中,添加timestamp和sign字段if self.headers.get("X-Lemonban-Media-Type") == "lemonban.v3" and token:logger.info("使用RSA加密。")# 生成sign,和timestampsign,timestamp = generator_sign(token)data["sign"] = signdata["timestamp"] = timestamp