python测试-接口自动化测试

python测试-接口自动化测试

1
接口如果有很多参数的情况下,用程序模拟生成数据(数据驱动),使用工具或者框架加载数据自动化测试
1
接口测试往往连测试用例都不用提前写就可以测试

接口自动化的流程

自动化测试通过脚本(代码)模拟人工操作,自动化执行用例验证系统表现、并且输出结果。目的:

  • 测试效率
  • 准确率
  • 可重复性

实战经验总结

分析文档(分析需求)

  • 核心功能-用户端的体验
  • 次要功能
  • 辅助功能
  • 理解:有的接口有安全性要求:需要先登录再使用。有的任务id需要动态获取(接口关联,数据库查询)

设计用例

  • 用例标题:登录的账号可以删除任务
  • 前置条件:1.已登录(得到了身份信息) 2.有任务(已经创建待删除任务)
  • 测试步骤:1.得到任务ID 2.调用删除接口(结果1) 3.调用查询接口(结果2)
  • 断言(验证结果):1.结果1 成功 2.结果2 失败

数据准备

  • 可登录的账号
  • 可测试的任务
  • 数据驱动测试的数据文件

编写脚本

  • 纯脚本
  • 框架的用例

执行步骤

断言结束

python

接口客户端requests

HTTP协议客户端事实上的标准

劣势:1.不支持异步(测试不需要) 2.不支持HTTP2

1
2
3
import requests

resp = requests.get("xxxx")

推荐使用下面这种,上面的底层代码还是使用的下面这种:

1
2
3
import requests

resp = requests.request('get',"xxx")

requests.request的参数

  • method:http请求方法
  • url
  • params:附加到url的参数(以字典形式传参)
  • headers-添加请求头
  • auth-指定鉴权的方式
  • cookies-添加cookies
  • data-表单数据
  • files-上传文件
  • json-json字符串
json
1
2
3
4
5
import requests

resp = requests.request(method='get',url="xxx",json={'account':xxx,'password':xxx})

resp.status
data
1
2
3
4
5
6
7
8
import requests
url = "https://httpbin.org/post"
data = {
"username": "testuser",
"password": "123456"
}
response = requests.post(url, data=data)
print(response.text)
files
1
2
3
4
5
import requests
url = 'http://www.example.com/upload' # 上传文件的目标 URL
files = {'file': open('example.txt', 'rb')} # 打开文件并设置为二进制模式
response = requests.post(url, files=files) # 发送 POST 请求
print(response.text) # 打印服务器返回的响应
1
2
3
4
5
6
7
8
import requests
url = 'http://www.example.com/upload'
files = [
('file1', ('example1.txt', open('example1.txt', 'rb'), 'text/plain')),
('file2', ('example2.txt', open('example2.txt', 'rb'), 'text/plain'))
]
response = requests.post(url, files=files)
print(response.text)
1
2
3
4
5
6
import requests
url = 'http://www.example.com/upload'
data = {'username': 'test_user', 'age': '30'} # 附加参数
files = {'file': open('example.txt', 'rb')}
response = requests.post(url, data=data, files=files)
print(response.text)

resp = requests.request(xxxx)

resp.status_code resp.reason

resp.headers resp.cookies

  • content:二进制响应正文

  • text:文本响应正文

  • json():将json响应转换成dict(可能会失败,因为响应体可能本身不是json字符串)

1
2
3
resp.content
resp.text
resp.json()

requests.Session

session:(有多个请求构成)同一个对话过程

共享参数

如请求头(身份凭据)

共享网络

如:http协议基于tcp 需要3次握手、4次挥手,使用session可以之基于一次TCP连接

tcp/udp协议规定最大端口65535,每发起一次请求会在本地暂用一个端口,请求结束释放。如果同时请求本地端口数会占完,系统的其它功能也会受影响

共享cookies

自动合并多个请求的cookies

1
2
3
4
5
6
7
8
9
import requests

s = requests.Session()

resp = s.request(xxxx)

resp = s.get(xxxx)

# 两次请求都是共用一个session
关联请求

接口关联:使用另一个接口的响应内容,作为下一个接口的请求参数(如:1.登录后,后续接口需要用之前登录返回的内容 2.查出来id再删id这条数据)

  • 大部分接口都需要:共享参数(如身份凭据等信息)
  • 个别接口才需要:全局变量

针对一个接口返回的内容是json字符串时,提取方式:

  • 字典

  • jsonpath用法:1.针对字典 2.使用jsonpath语法 3.返回列表

  • 正则

1
2
3
4
5
6
7
8
9
# 这里这个一个案例,登录后响应体里有token
token = resp.json()['token_type']

token = jsonpath.jsonpath(resp.json(),"$.access_token")[0]

s.headers.update({"Authorization": f"bearer {token}"})
print(s.headers)

这里已经将token放到session的headers里了,后续可以直接用session进行测试需要登录后才能测试的接口

测试时如果遇到一个流程涉及多个用户进行验证时,可以创建多个session

pytest