课程标题
企业微信接口自动化实战
课程价值
- 了解 restful 接口
- 了解 https 协议基本格式
- 了解企业微信接口基本使用
- 接口测试数据
- 接口测试提速
- 接口封装
课程内容
什么是接口( restful api )测试
在客户端角度,向服务端发送数据,对回收的数据进行判断。
为什么要学接口测试
- 单元测试:pytest, python → 直接对代码进行测试(可以直观有效的反馈错误,代价最小)
- 接口测试:requests → 对服务器发送请求 (直接与服务器进行交互,代价中)
- UI测试:selenium, appium → 对存在 UI 界面的应用进行测试(以用户视角进行测试,代价最大)
接口测试举例
restful 结构
接口格式的规则
Roy_Fielding:https://en.wikipedia.org/wiki/Roy_Fielding
论文:https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
GET:获取资源. 参数信息放到请求头
POST:新建/更新资源. 参数信息放到请求体
PUT:更新资源
DELETE:删除资源
企业微信
- token原理
- 企业微信实战
- 编码问题:
代码
使用工具:requests
练习网站:
常用参数 | demo |
---|---|
json | 接收 python 数据结构,发送时放入到 data 和 json 字段中 |
data | 根据不同类型,存入不同的字段中,字符串 → data(如果是 json ,同时放入到 json 字段) ,字典 → form |
proxies | 采用 http , https 代理 |
verfify | 是否开启 ssl 代理 |
使用 charles 查看请求形式:
proxies = {"https": "http://127.0.0.1:8888",
"http" : "http://127.0.0.1:8888"}
r = requests.post("https://httpbin.org/post",data="xxx",proxies=proxies, verify=False)
企业微信接口初探:
import requests
def get_token():
r = requests.get(
'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wwe653983e4c732493&corpsecret=T72_Vgw9TaNS-FLDU2gJlw6AteerMXsuMval9kGNZbc')
token = r.json()['access_token']
return token
def test_defect_member():
get_member_url = f'https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={get_token()}&userid=kenan222'
r = requests.get(get_member_url)
print(r.json())
assert "小柯南" == r.json()['name']
def test_update_member():
update_member_url = f'https://qyapi.weixin.qq.com/cgi-bin/user/update?access_token={get_token()}'
data = {
"userid": "kenan222",
"name": "小柯南",
"mobile": "13800009999",
}
r = requests.post(url=update_member_url, json=data)
print(r.json())
def test_create_member():
create_member_url = f'https://qyapi.weixin.qq.com/cgi-bin/user/create?access_token={get_token()}'
data = {
"userid": "zhangsan00123",
"name": "张三hello",
"mobile": "+86 13812300000",
'department': [3]
}
r = requests.post(url=create_member_url, json=data)
print(r.json())
def test_delete_member():
delete_url = f'https://qyapi.weixin.qq.com/cgi-bin/user/delete?access_token={get_token()}&userid=zhangsan00123'
r = requests.get(delete_url)
print(r.json())
测试测试数据
数据清洗:如何清洗无用数据
- 当前接口受到脏数据影响,干扰正常功能。在测试前需要进行脏数据清洗。
- 以企业微信为例:当使用重复手机号
注意:在测试后进行清理,不是测试前
清理方法:
- 创建方法(成员添加,端口占用,多进程 id ,文件残留,文件篡改恢复):在 teardown 进行销毁
- 删除方法(删除文件,删除成员…):备份及恢复或伪数据
from test_requests_lagou.wework.address import Address
class TestAddress:
def setup(self):
self.address = Address()
self.user_id = "zhangsan00123"
self.name = "张三"
self.mobile = "+86 13812300000"
self.department = [1]
def test_create_member(self):
# 利用删除接口进行数据清理
self.address.delete_member(self.user_id)
r = self.address.create_member(self.user_id, self.name, self.mobile, self.department)
assert r.get('errmsg', "network error") == "created"
r = self.address.get_member_information(self.user_id)
assert r.get("name") == self.name
def test_get_member_information(self):
self.address.create_member(self.user_id, self.name, self.mobile, self.department)
r = self.address.get_member_information(self.user_id)
assert r.get("errmsg") == "ok"
assert r.get("name") == self.name
def test_delete_member(self):
self.address.create_member(self.user_id, self.name, self.mobile, self.department)
r = self.address.delete_member(self.user_id)
assert r.get("errmsg") == "deleted"
r = self.address.get_member_information(self.user_id)
assert r.get("errcode") == 60111
def test_update(self):
# 保证,成员一定是新添加的
self.address.delete_member(self.user_id)
self.address.create_member(self.user_id, self.name, self.mobile, self.department)
new_name = self.name + "tmp"
r = self.address.update_member(self.user_id, new_name, self.mobile)
assert r.get("errmsg") == "updated"
r = self.address.get_member_information(self.user_id)
assert r.get("name") == new_name
接口测试提速
考虑并行插件
https://github.com/pytest-dev/pytest-xdist
在用例后加入 -n auto,会根据 CPU 数(CPU逻辑数)进行并行。
注意:并行用例设计不要冲突,比如以下情况:
- 并行用例中存在数据相同(随机数:时间种子)
- 并行用例端口相同
- 并行用例本地的文件相同:进程锁
如何自行设计并行套件,可参考 pytest 的 hook:pytest_collection_modifyitems
使用 session
- session 原理
- session 保活提速
- session 应用:免 token 登陆
接口封装
- 封装基础 base 类
- 封装接口测试业务类
代码地址
时长
120分钟