企业微信接口测试实战与答疑

课程标题

企业微信接口自动化实战

课程价值

  • 了解 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:删除资源

企业微信

  1. token原理
  2. 企业微信实战
  3. 编码问题:

代码

使用工具:requests

练习网站:

https://httpbin.org/

常用参数 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())

测试测试数据

数据清洗:如何清洗无用数据

  1. 当前接口受到脏数据影响,干扰正常功能。在测试前需要进行脏数据清洗。
  2. 以企业微信为例:当使用重复手机号

注意:在测试后进行清理,不是测试前

清理方法:

  1. 创建方法(成员添加,端口占用,多进程 id ,文件残留,文件篡改恢复):在 teardown 进行销毁
  2. 删除方法(删除文件,删除成员…):备份及恢复或伪数据
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逻辑数)进行并行。

注意:并行用例设计不要冲突,比如以下情况:

  1. 并行用例中存在数据相同(随机数:时间种子)
  2. 并行用例端口相同
  3. 并行用例本地的文件相同:进程锁

如何自行设计并行套件,可参考 pytest 的 hook:pytest_collection_modifyitems

使用 session

  1. session 原理
  2. session 保活提速
  3. session 应用:免 token 登陆

接口封装

  1. 封装基础 base 类
  2. 封装接口测试业务类

代码地址

https://github.com/ceshiren/

时长

120分钟