Python Python接口测试课程

Python接口测试课程(第二天)-接口测试快速实践

2018-06-19  本文已影响410人  韩志超

目录

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

更多学习资料请加QQ群: 822601020获取

第二天: 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)

编写接口文档

接口测试基础

接口测试概念

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

接口测试目的

接口测试一般流程

接口测试关注点

常见接口种类

常见接口数据类型

常见接口安全验证方式

常见接口请求方法

常见状态码(RESTful规范)

接口业务类型

快速上手接口测试

获取接口文档

接口文档分析

编写接口用例

Excel/TestLink/禅道

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

执行接口测试

接口自动化实践

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

需要安装三方包: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库详解

请求方法

请求参数

响应解析

上一篇 下一篇

猜你喜欢

热点阅读