zoukankan      html  css  js  c++  java
  • Python接口测试课程(第二天)-接口测试快速实践

    目录

    Python接口测试课程(第一天)-Python基础
    Python接口测试课程(第二天)-接口测试快速实践
    Python接口测试课程(第三天)-接口安全验证,参数化及断言
    Python接口测试课程(第四天)-接口测试框架实现

    PDF下载:链接:https://pan.baidu.com/s/1x3_LYq23F_1LviGVbRNFXw 密码:xrcj

    更多学习资料请加添加作者微信:lockingfree获取

    第二天: Python接口测试(一)

    简单接口搭建(表单/REST)

    五步教会你写接口

    首先要安装flask包: pip install flask

    1. 从flask中导入Flask类和request对象: from flask import Flask, request
    2. 从当前模块实例化出一个Flask实例:app=Flask(__name__)
    3. 编写一个函数来处理请求
      1. 从请求对象中获取数据:a=request.values.get("a");b=request.values.get("b")
        • request.params: 字典格式,存储请求中的url参数
        • request.form: 字典格式,存储请求中的表单数据
        • request.values: 字典格式, 包含params和form中的值
        • request.json: 字典格式, 存储json类型的请求数据, 如果请求类型非json, 值为空
      2. 进行业务处理: sum = int(a) + int(b)
      3. 组装并返回响应数据: return str(sum) # http一般使用字符串传输数据
    4. 为接口指定接口地址和接受的方法:@app.route("/add/", methods=["GET"]) # 写到函数上面(装饰器)
    5. 运行接口:
      1. 最后添加:
    if __name__ == "__main__":
    app.run()
    
    2. 保存为```add.py```, 打开命令行,进入add.py所在目录,运行```python add.py```ß
    

    完整代码

    # 1. 导入包 
    from flask import Flask, request
    # 2. 实例化一个
    app = Flask(__name__)
    # 3. 编写一个接口处理方法
    @app.route("/add/", methods=["GET","POST"]) # 4. 挂载路由(指定接口的url路径), 声明接口接受的方法
    def add():  
    	# 3.1 从请求中获取参数
    	# request.values  {"a": "1", "b": "2"}
        a = request.values.get("a")
        b = request.values.get("b")
    	# 3.2 业务操作
        sum = int(a) + int(b)
    	# 3.3 组装响应并返回
        return str(sum)
    
    # 5. 运行接口
    if __name__ == '__main__':
    	app.run() # 默认5000端口,可以指定端口app.run(port=50001)
    
    

    REST类型接口实现

    from flask import Flask, request, jsonify
    
    app = Flask(__name__)
    
    @app.route("/api/sub/", methods=["POST"])
    def sub():
    	if not request.json: # 如果请求数据类型非json
    		return jsonify({"code": "100001", "msg": "请求类型错误", "data": None})
    
    	if not "a" in request.json or not "b" in request.json: # 如果参数中没有a或者没有b
    		return jsonify({"code": "100002", "msg": "参数缺失", "data": None})
    	
    	a = request.json.get("a")
    	b = request.json.get("b")
    	result = str(float(a) - float(b)) # 使用float支持浮点数相减
    	return jsonify({"code": "100000", "msg": "成功", "data": result}) # 使用jsonify将字典数据转换为json类型的相应数据
    
    if __name__ == '__main__':
    	app.run()
    

    使用Postman测试接口(Form/Json)

    编写接口文档

    接口测试基础

    接口测试概念

    接口测试是测试系统组件间接口的一种测试。
    接口测试主要用于检测外部系统与系统之 间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过 程,以及系统间的相互逻辑依赖关系等。

    接口测试目的

    • 核心:保证系统的稳定
    • 手段:持续集成
    • 目的:提高测试效率,提升用户体验,降低产品研发成本

    接口测试一般流程

    • 列出需求
    • 安排资源,编写接口用例 -> 用例评审
    • 编写接口测试代码 -> 代码评审codeReview
    • 执行接口测试

    接口测试关注点

    • 功能:功能实现,实现与设计一致, 接口通过性测试
    • 健壮性: 边界值,容错性
    • 性能: 并发及压测
    • 稳定性: 长期运行的稳定性
    • 安全性: SQL注入, session依赖, 数字签名, http接口的安全性

    常见接口种类

    • Http/Https接口: 通过http/https协议传送接口数据(通常按字符串/二进制传输), 如常见的网页表单, https安全性更好
    • RESTful Api: REST表述性状态传递. 一种设计风格,基于http/https协议, 把一切接口视为资源, 接口要分版本,在统一的域名下管理, 不同的方法(get/post..)做不同的事,通常请求及响应使用json格式
    • Web Service: SOAP简单面向对象协议, 基于http实现的一种RPC方案.接口返回一些对象,可以直接通过操作对象,实现我们需要的业务处理.使用xml格式传输数据
    • RPC接口: RPC为远程方法调用, 有不同的实现方案,基于TCP/Http协议的都有. RPC可以想我们本地导入和调用对象一样使用. Dubbo接口也是一种RPC接口.

    常见接口数据类型

    • 请求数据类型(Content-Type):
      • application/x-www-form-urlencoded: 常规只有文本的网页表单
      • application/json: RESTful Api常用格式, 结构清晰, 含有多层嵌套
      • multipart/form-data: 既有文本,又有上传文件或富文本框的混合数据表单
      • text/xml: xml格式, RPC接口常用格式
    • 响应数据类型
      • string/html: 返回字符串或网页源码
      • json: RESTful Api常用响应格式, 结构清晰
      • xml: RPC接口常用格式

    常见接口安全验证方式

    • Auth_1.0/Auth_2.0: 通用接口授权方式
    • Session依赖: 需要登录之后才能进行接口操作
    • Token验证: 先要使用自己的appid/appsecret通过获取token接口验证身份获取一个token(令牌,有一定有效期), 然后带着token访问接口
    • 数字签名: 将原本的参数按一定规则进行组合,配合时间戳或appsecret, 通过加密算法生成一个签名sign, 携带签名进行接口请求

    常见接口请求方法

    • GET: 获取资源
    • POST: 修改资源
    • PUT: 上传资源
    • DELETE: 删除资源
    • HEAD: 只请求页面首部
    • PATCH: 补丁
    • OPTIONS: 运行客户端查看服务器性能
      ......

    常见状态码(RESTful规范)

    • 200系: 成功
      • 200 OK - [GET]:获取资源成功
      • 201 CREATED - [POST/PUT/PATCH]:创建/修改成功
      • 202 Accepted - [*]:任务接受
      • 204 NO CONTENT - [DELETE]:删除成功
    • 300系: 重定向
      • 301 Moved Permanently: 永久重定向
      • 302 Found: 临时重定向
    • 400: 资源错误
      • 400 INVALID REQUEST - [POST/PUT/PATCH]:用户请求错误
      • 401 Unauthorized - [*]:没有权限(鉴权失败, 接口层)
      • 403 Forbidden - [*] 资源禁止访问(服务器层,没有访问权限)
      • 404 NOT FOUND - [*]:资源不存在
      • 405 Method Not Allowd: 访问的方法不允许, 如用POST访问只支持GET请求的接口
      • 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)
      • 410 Gone -[GET]:资源被永久删除
      • 422 Unprocesable entity - [POST/PUT/PATCH] 当创建对象时,发生验证错误
    • 500系: 服务器内部错误(接口崩溃或有Bug)
      • 500 INTERNAL SERVER ERROR - [*]:服务器发生错误

    接口业务类型

    • 返回数据型接口: 只从数据库读取数据
    • 业务操作型接口: 需要写数据库(接口测试需要要涉及参数化或环境清理)

    快速上手接口测试

    获取接口文档

    • Wiki
    • Word文档
    • Postman导出
    • 抽象接口定义
    • 接口管理平台

    接口文档分析

    • 功能分析: 是否能满足业务(是否缺少某个前端需要的参数), 是否能满足所有业务场景(是否有漏开发接口, 比如只开发了单品接口,没开发套餐接口)
    • 设计分析: 是否有不规范字段(如,nickname, passwd);不规范格式(如sex,用男,女而不是1,2);是否有易混淆字段(如amount和total);是否有单词拼错;是否有和数据库字段对应但名称不一样的(易错)
    • 接口分析: 协议类型(http要考虑安全);请求方法(是否规范);请求编码格式(表单/Json/xml, 很多接口文档不声明,导致测试调试不通);接口授权方式;接口业务类型(关系到是否需要做参数化或环境清理); 返回值类型及结构(关系到怎么断言)
    • 接口依赖: 需要什么环境准备和业务场景, 依赖那些接口, 有那些动态数据, 预备环境怎么保障
    • 参数分析: 各个参数的参数类型,组成规则,是否允许不传,是否可以为空, 是否允许多传参
    • 业务分析: 如price字段必须和数据库中的商品的price字段一致,才能校验通过
    • 非功能性: 接口的技术实现方案是否合理, 能否满足高并发的性能要求, 边界值/极限值的处理是否合适, 是否前后端都有数据格式校验等(如精确度为秒级的订单号生成器,在高并发下会导致生成同一订单号的问题)
    • 其他: 如反爬,对headers的一些限制和校验, ip等限制

    编写接口用例

    Excel/TestLink/禅道

    • 单接口用例: 正常数据/边界数据/异常数据(健壮性)/并发(一致性)/性能/安全性(抓包截取伪造/SQL注入/跨域请求)
    • 场景用例: 列出常见的用户场景, 用接口进行覆盖, 业务场景压测(寻找某个环节的性能瓶颈)
    TestCase Url Method DataType a b Excepted Actual Status
    test_add_normal /api/add/ GET Url 3 5 8
    test_add_zero /api/add/ POST FORM 0 0 0
    test_add_negetive /api/add/ POST FORM -3 5 2
    test_add_float /api/add/ POST FORM 3.2 5.2 8.4
    test_add_null /api/add/ POST FORM 0

    执行接口测试

    • Postman: 功能调试
    • Jmeter: 性能

    接口自动化实践

    五步教会你写接口自动化用例

    需要安装三方包:requests pytest pytest-htmlpip install requests pytest pytest-html

    1. 导入requests模块
      import requests
    2. 组装请求参数和数据
      url = 'http://127.0.0.1:5000/add/'
      params = {"a":3, "b":5} # get请求url参数, 字典格式
      data = {"a":3, "b":5} # post请求请求数据, 字典格式
    3. 发送请求得到response对象
      resp = requests.get(url=url, params=params)
      resp = requests.post(url=url,data=data)
    4. 解析response对象
      • resp.text # 获取响应文本
    5. 断言结果
      assert resp.text == '8'
      完整代码:
    # 1. 导入包
    import requests
    
    base_url = "http://127.0.0.1:5005"
    
    # 2. 组装请求
    def test_add_normal():
    	# url  字符串格式
        url = base_url + "/add/"
        
    	# data {} 字典格式
        data = {"a": "1", "b": "2"}
        # 3. 发送请求,获取响应对象
        response = requests.post(url=url, data=data)
    # 4. 解析响应
    # 5. 断言结果
        assert response.text == '3'
    

    REST类接口自动测试方法

    请求格式为json

    三处不同:

    1. 必须通过headers指定内容类型为application/json: ```headers={"Content-Type":"application/json"}
    2. 请求数据要转化为字符串: data=json.dumps(data) (使用json.dumps需要import json)
    3. json格式的响应数据,在接口调试通过和稳定的情况下可以使用response.json()解析为字典格式,进行断言

    完整代码:

    # 1. 导入包
    import requests
    import json
    
    base_url = "http://127.0.0.1:5005"
    
    def test_sub_normal():
        url = base_url + "/api/sub/"
        headers = {"Content-Type": "application/json"} # 1. 必须通过headers指定请求内容类型为json
        data = {"a": "4", "b": "2"}
        data = json.dumps(data) # 2. 序列化成字符串
        response = requests.post(url=url, headers=headers, data=data)
        # 3. 响应解析 # 响应格式为: {"code":"100000", "msg": "成功", "data": "2"}
        resp_code = response.json().get("code") 
        resp_msg = response.json().get("msg")
        resp_data = response.json().get("data")
        # 断言
        assert response.status_code == 200
        assert resp_code == "100000"
        assert resp_msg == "成功"
        assert resp_data == "2"
    

    补充1: 感受Python黑科技之exec()动态生成用例:

    数据文件: test_add_data.xls

    TestCase Url Method DataType a b Excepted Actual Status
    test_add_normal /api/add/ GET Url 3 5 8
    test_add_zero /api/add/ POST FORM 0 0 0
    test_add_negetive /api/add/ POST FORM -3 5 2
    test_add_float /api/add/ POST FORM 3.2 5.2 8.4
    test_add_null /api/add/ POST FORM 0
    import requests
    import xlrd
    
    base_url = 'http://127.0.0.1:5005'
    
    # 1.打开excel
    wb = xlrd.open_workbook("test_add_data.xls")
    # 2. 获取sheet
    sh = wb.sheet_by_index(0)  # wb.sheet_by_name("Sheet1")
    # 行数 sh.nrows 列数 sh.ncols
    # 获取单元格数据
    # print(sh.cell(1,0).value)
    # print(sh.nrows)
    tpl = '''def {case_name}():
        url = base_url + '/add/'
        data = {{"a": "{a}", "b":"{b}"}}
        response = requests.get(url=url, data=data)
        assert response.text == '{expected}'
    '''
    
    for row in range(1, sh.nrows):
        case_name = sh.cell(row,0).value
        a = sh.cell(row, 4).value
        b = sh.cell(row, 5).value
        expected = sh.cell(row, 6).value
        case = tpl.format(case_name=case_name, a=a, b=b, expected=expected)
        exec(case)
    

    动态生成的用例支持pytest发现和执行

    自动化接口用例运行

    1. 将自动化测试用例保存为test*.py,一个文件里可以写多个用例, 如上面两个接口保存为test_user.py
    2. 在自动化用例脚本所在目录打开命令行, 运行pytest(运行所有test开头的.py用例)或pytest test_user.py(只运行该脚本中用例)
    3. pytest一些参数
      • -q: 安静模式(不显示环境信息) pytest -q test_user.py
      • --html=report.html:执行完生成report.html报告(文件名可以自己指定)pytest test_user.py --html=test_user_report.html
      • --resultlog=test.log: 执行完成生成执行结果log文件pytest test_user.py --resultlog=run.log

    requests库详解

    请求方法

    • requests.get()
    • requests.post()
    • requests.delete()
    • .....
    • requests.session() # 用来保持session会话,如登录状态

    请求参数

    • url: 接口地址, str url="http://127.0.0.1:5000/add/"
    • headers: 请求头, dict headers={"Content-Type": "application/json"}
    • params: url参数, dict params={"a":"1":"b":"2"}
    • data: 请求数据, dict data={"a":"1":"b":"2"}
    • files: 文件句柄, dict files={"file": open("1.jpg")}
    • timeout: 超时时间,单位s, str, 超过时间会报超时错误```requests.get(url=url,params=params,timeout=10)

    响应解析

    • resp: 响应对象
    • resp.status_code: 响应状态码
    • resp.text # 响应文本
    • resp.json() # 响应转化为json对象(字典)-慎用:如果接口出错或返回格式不是json格式,使用这个方法会报错
    • resp.content # 响应内容, 二进制类型
  • 相关阅读:
    JS使用小记
    CSS使用小记
    POST Raw JSON提交
    获取当月的某天
    bootstrap-datetimepicker的中文显示问题
    学习总结——Selenium元素定位
    Android常用控件及对应Robotium API
    Junit4断言
    Junit3断言
    Robotium怎样判断测试结果
  • 原文地址:https://www.cnblogs.com/superhin/p/12737661.html
Copyright © 2011-2022 走看看