接口自动化测试学习笔记1

接口自动化测试

概念

接口自动化测试:让程序代替人为对接口进行自动验证测试的过程

实现方式

  • 工具:jmeter、postman
  • 代码:python-requests

测试工具的缺点

  • 测试数据不好控制(无法直接读取或存储json格式)
  • 测试数据加密不方便
  • 扩展性不足(复杂业务逻辑、复杂断言)

Requests库

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。

Requests介绍

  • 使用python语言编写
  • 使用开源协议,基于 urllib 库做的二次封装
  • Requests 库中封装了相应接口测试方法

Requests库安装和验证

  • 安装:pip install requests
  • 验证:pip show requests (显示版本信息)

Requests库的使用

请求方式(6个)

  • GET : 获取
  • HEAD : 类似于 get ,但是返回的信息没有请求体,只有信息头,可以用于查看某资源是否存在
  • POST : 新增
  • PUT : 更新
  • DELETE : 删除
  • OPTIONS : 查看服务器支持哪些方法

GET请求

  • 方法

requests.get(url,params = None,**kwargs)

url : 拟获取页面的url链接

params : url中的额外参数,字典或字节流格式(可选)

**kwargs : 12个控制访问的参数(与request方法相比少了一个proxies参数)

  • 用例
"""
    功能:get请求测试
    url:www.baidu.com
    响应:
        1、相应对象 .url   #获取请求url
        2、相应对象 .status_code   #获取响应状态码
        3、相应对象 .text   #以文本形式显示响应内容
"""

# 1、导包
import requests

# 2、调用get
url = "http://www.baidu.com"
r = requests.get(url)   #r : 响应的数据对象

# 3、获取请求url地址
print("请求url地址 : ", r.url)

# 4、获取响应状态码
print("响应状态码 : ", r.status_code)

# 5、获取响应信息 以文本的形式
print("文本响应内容 : ", r.text)

请求带参数

"""
    不同带参数的方式
        1、http://www.baidu.com?id=1001
        2、http://www.baidu.com?id=1001,1002
        3、http://www.baidu.com?id=1001&kw=北京
    参数:
        requests.get(url,params)   params:字典或字符串(推荐使用字典)
"""

params = {"id":1001}
params = {"id":"1001,1002"}             
params = {"id":"1001","kw":"北京"}     # 多个键值使用方式

# 请求带参数params
r = requests.get(url,params=params)

POST请求

  • 方法

requests.post(url,data = None,json = None,**kwargs)

url : 拟获取页面的url链接

data : 字典、字节序列或文件,Request的内容

json : JSON格式的数据,Request的内容

**kwargs : 控制访问的参数,共11个

  • PS:

    • 在python中字典对象和json字符串长的一样,但是格式是不同的
    • 可以通过 json.dumps(字典对象) 将字典转为json字符串
  • 用例1:data和params传参的区别

"""
    功能:post请求使用
    参数:
        1、json : 传入json字符串
        2、headers : 传入请求信息头内容
    响应:
        1、响应对象.json
        2、响应对象.status_code
"""

# 导包
import requests
import json

# 调用 post
url = "xxxxx"       # 请求 url
headers = { "Content-Type":"application/json" }     # 请求 headers
# 请求json
data = {
  "account":"xxxxx",
  "password":"xxxxx",
  "nonce":xxxxx,
  "machine":"xxxxx"
}

# 传json参数
r = requests.post(url, json=data,headers=headers)

# 传data参数,需要用json.dumps转换数据格式
r = requests.post(url, data=json.dumps(data),headers=headers)

# 获取响应对象
print(r.json())

# 获取响应状态码
print(r.status_code)
  • 用例2:响应对象.text 和 响应对象.json 的区别
    • json():返回字典类型,可以通过键名来获取相应的值
    • text:返回字符串类型,无法通过键名来获取相应的值
# 获取响应对象
print("r_json : ", r.json())
print("r_json_type : ", type(r.json()))
print("r_json_key : ", r.json()['time'])

print("r_text : ",r.text)
print("r_text_type : ", type(r.text))
# print("r_text_key : ", r.json['time'])   # 报错


# 输出内容
# r_json :  {'data': 'XXXXX', 'success': True, 'time': TTT}
# r_json_type :  <class 'dict'>   字典类型,可以通过键名获取相对应的值
# r_json_key :  TTT
# r_text :  {"data":"XXXXX","success":true,"time":TTT}
# r_text_type :  <class 'str'>    string类型,无法通过键名获取相对应的值

PUT请求

  • 方法

requests.put(url,data = None,**kwargs)

url:拟获取页面的url链接

data:字典、字节序列或文件,Request的内容

**kwargs:控制访问的参数,共12个

  • 用例
# 导包
import requests

# 调用 put
# 请求 url
url = "XXXXXXXXX"
# 请求 headers
headers = {
    "Content-Type":"application/json",
    "X-Token":"XXXX"
}
# 请求json
data = {
    "extraInfo": [
        {
            "XXXX": "XX",
            "XXXX": "XXXXX",
            "XXX": "XXXXX"
        }
    ],
    "AAAAAA": "XXXXX",
}

r= requests.put(url, data = data , headers=headers)

# 获取响应对象
print("r_json : ", r.json())

DELETE请求

  • 方法

requests.delete(url,**kwargs)

url:拟获取页面的url链接

**kwargs:控制访问的参数,共13个(与request方法参数完全一样)

  • 用例
# 导包
import requests

# 调用 post
# 请求 url
url = "XXXXX"

# 请求delete
r= requests.delete(url)

# 获取响应状态码  delete无相应数据,只有状态码
print(r.status_code)

Response响应内容

  • response.status_code : HTTP请求返回的状态码
  • response.text : HTTP相应内容的字符串状态,即url对应的页面内容
  • response.encoding : 查看或设置响应的编码格式(如果header中不存在charset,则认为编码为ISO-8859-1)
  • response.headers : 获取服务器响应信息头,一般服务器返回的token或者session信息都在其中
  • response.cookies : 获取服务器产生的响应cookie信息
  • response.text : 文本形式的响应内容
  • response.content : 字节(二进制)形式的响应内容
  • response.json() : JSON形式的响应内容

用例

  • 获取请求编码
# 导包
import requests

# 调用 post
# 请求 url
url = "http://www.baidu.com"
r= requests.get(url)

# 获取默认请求编码
print(r.encoding)
print(r.text)


PS:默认编码下中文可能会乱码

  • 设置请求编码
# 导包
import requests

# 调用 post
# 请求 url
url = "http://www.baidu.com"
r= requests.get(url)

# 设置请求编码
r.encoding = "utf-8"

# 获取默认请求编码
print(r.encoding)


  • 来源:由服务器生成
  • 作用:区分同一请求客户
  • 获取:response.cookies
  • 设置
    • 设置 : cookie = {"获取的cookie键名":"获取出的值"}
    • 应用 : request.请求方法(url,cookies=cookie)
  • 验证码cookie产生及应用

session对象

  • 为什么使用session对象

    session 可以自动保存服务器产生的cookies信息,并且自动在下一条请求时附加上

  • 什么是session

    一次会话:从客户端和服务器创建连接开始,直到客户端和服务器断开连接结束

  • 使用

    • 创建session对象:session = requests.Session()

unitest框架

unitest和requests结合

  • 结构
    • setUp : test 开始方法执行之前,首先会被执行
      • 获取 session 对象
      • 设置登陆 url
      • 设置验证码 url
    • tesrDown : test 开始方法执行之后,会被执行
      • 关闭 session 对象
    • test_login_success : 登陆成功用例
      • 请求验证码(让 session 获取并记录 cookie 信息)
      • 请求登陆
      • 断言
    • test_username_not_exist : 登陆失败,账号不存在
    • test_password_error : 登陆失败,密码错误
  • 注意
    • 测试类必须继承 unittest.Testcast
    • 测试用例方法必须以 test 开头




文献引用

posted @ 2020-08-02 02:07  _Sleeping  阅读(283)  评论(0)    收藏  举报