一、接口测试用例
1.1、测试用例设计方法
1)等价类
2)边界值
3)因果图
4)判定表
5)正交试验(筛选时)
6)流程覆盖
7)错误推测
1.2、接口测试用例怎么写
1.2.1、功能(自动化测试关注)
1、有效等价类(还要考虑前置条件、参数替换)
1)登录成功
2、无效等价类(还要考虑前置条件、参数替换)
1)手机号格式错误
2)手机号不存在
3)手机号为空
4)密码错误
5)密码为空
6)必填项字段的缺失
1.2.2、兼容性
1.2.3、性能
1.2.4、安全
1.2.5、UI/易用性
二、接口测试
2.1、怎么做好接口测试
1)了解熟悉公司的业务【核心业务】
2)了解接口相关的信息
3)了解接口协议类型
web:F12 app:抓包工具
4)核对接口文档和实际的抓包数据
5)设计接口测试用例
6)数据准备(requests去做单节口的测试):请求参数、断言数据(requests)
7)引入测试框架(unittest)
8)jenkins持续集成
2.2、自动化测试分类
1、只测单接口:测试单个接口有没有问题
定时任务,可放到单接口测试,也可放到流程测试中测试
2、流程测试:核心业务的流程
例如:用户:投资人、借款人、审核
投资人:登录、充值、随机选一个标的投资、提现
登录、实名认证、添加银行卡、设置密码、修改密码、修改提现卡
借款人:登录、实名认证、添加银行卡、提现、修改密码、设置密码、授信额度(风控决定)
登录、发起借款(不同借款期限利率不一样)
审核:登录、审核、驳回、分配业务员、背调(打标签)
定时任务,可放到单接口测试,也可放到流程测试中测试
2.3、分层设计:分类管理
1、excel表
1)管理测试用例
2)读取excel用例
3)拼接好请求参数
2、日志模块
3、业务逻辑
4、测试报告
5、日志文件
6、项目配置
7、unittest
8、ddt
9、框架入口
2.4、分层设计
2.4.1、tools:工具
1)封装excel:读取excel表测试用例
2)封装配置文件
3)封装日志文件
4)封装路径处理
1、excel用例数据os路径处理
2、配置conf文件的路径
3、配置文件添加excel的sheet_name
5)封装requests
1、根据项目鉴权方式,无需鉴权的接口(注册、登陆、项目列表)
2、需要鉴权:传入token,拿到token就添加到请求头中,再去发起请求
3、不需要鉴权:不传token,token设置一个默认值,请求头就不做处理,再去发起请求
4、收集日志
2.4.2、test_case:unittest+ddt
1)执行测试用例
2)编写测试用例
1、创建测试类(继承unittest.TestCase,类名称建议Test开头)
2、创建测试函数(必须test开头)
2.1)发起request请求
2.2)断言
2.4.3、配置conf:host、数据库
2.4.4、case_data:excel表(测试用例表)
2.4.5、report:测试报告——收集测试报告
2.4.6、logs:日志文件
2.4.7、main.py:框架入口
2.5、整体流程:持续集成Jenkins
三、手机号参数
3.1、Faker:生成随机数
详见:http://testingpai.com/article/1615615023407
1、安装
pip install faker
2、模块导入
from faker import Faker
3、创建实例
fk = Faker(locale='zh-CN') #locale='zh-CN':语言环境,默认的 en_US 语言环境,支持传多个 ['ja_JP','en_US','zh-CN']
4、常用四要素方法
1)姓名
name = fk.name()
2)身份证
id_card = fk.ssn()
3)手机号
phone = fk.phone_number()
4)银行卡(信用卡)
card = fk.credit_card_number()
5、确保随机数据唯一性:fk.unique.方法名()
[fk.unique.name() for i in range(10)]
3.2、pymysql:数据库校验库
import pymysql coon=pymysql.connect(host='api.lemonban.com', #主机名 port=3306, #端口 user='future', #用户名 password='123456', #密码 db='futureloan', #数据库名称 cursorclass=pymysql.cursors.DictCursor) #设置返回数据格式为dict,如果不设置默认返回元组
cur=coon.cursor() sql='select * from member where id < 20;' cur.execute(sql) result=cur.fetchone() result=cur.fetchall() result=cur.fetchmany(size=3) coon.commit() cur.close() coon.close()
3.2.1、数据库查询该手机号是否已注册,如果注册了,重新生成一个
3.2.2、安装
pip install pymysql
3.2.3、导入
import pymysql
3.2.4、步骤
1、创建数据库连接
import pymysql coon=pymysql.connect(host='api.lemonban.com', #主机名 port=3306, #端口 user='future', #用户名 password='123456', #密码 db='futureloan', #数据库名称 cursorclass=pymysql.cursors.DictCursor) #设置返回数据格式为dict,如果不设置默认返回元组
2、创建游标(相当于工具页面上的查询窗口)
cur=coon.cursor()
3、需要执行的sql语句
sql='select * from member where id < 20;'
4、执行sql语句
cur.execute(sql)
5、返回数据
1)返回查询到的第一条数据,数据为元组
result=cur.fetchone()
2)返回查询到的所有数据,一行数据为一个元组,返回嵌套元组
result=cur.fetchall()
3)根据设置,返回查询到的所有数据,一行数据为一个元组,返回嵌套元组
result=cur.fetchmany(size=3)
6、数据库提交,更新了数据库就必须要提交
coon.commit()
7、关闭游标
cur.close()
8、关闭数据库连接
coon.close()
3.3、使用生成的手机号,替换掉请求参数的手机号
3.3.1、请求参数替换
1.上一个接口或者历史接口返回值
2.数据库查询到数据
3.随机生成
3.3.2、发起请求
3.3.3、获取token,依赖参数
3.3.4、响应参数替换
四、参数替换思路
4.1、参数替换场景
1)从数据库获取
2)从配置文件
3)写死
4)原来类属性就有
4.2、参数替换实现思路
4.2.1、excel用例增加参数替换规则字段:replace_request_data
1、从数据库读取:{"mobile_phone":["db","select mobile_phone from member where type=0 order by id desc limit 1]}
2、从配置文件读取:{"mobile_phone":["conf"}
3、已经在全局变量存在的(类属性):{"mobile_phone":["attribute"]}
4、replace_request_data 字段为空,表示写死,不需要参数替换
4.2.2、创建一个类,用来存储全局变量(从数据库、配置文件)读取出来的值,用来做参数替换使用
五、db数据校验思路
在excel中新增字段:check_db={"actual_data":"select * from member where member_phone = #mobile_phone#;","expected_data":"1"}
1.获取到check_db这个字段的数据,通过actual_data获取到sql
2.替换掉sql里面的手机号
3.执行sql,获取sql执行结果
4.用这个sql执行结果替换掉actual_data结果的value
5.比对actual_data和expected_data的val
六、断言思路
6.1、接口返回断言
{"code": 0, "msg": "OK"}
6.2、数据库断言
6.2.1、接口请求之后,做数据库断言
6.2.2、接口请求前和请求后数据库断言
1、sql参数替换
2、多次数据库查询数据的运算
新增excel字段:check_db_many
{"first": ["db", "select leave_amount from member where mobile_phone='18820992515'"], "second": ["db", "select leave_amount from member where mobile_phone='18820992515'"], "expected_data": "first+second+100", "actual_data": ["db", "select leave_amount from member where mobile_phone='18820992515'"] }
七、jsonpath:原字符
$:表示根元素
@:当前元素
.or[]:子元素
..:递归搜索(不管当前路径,搜索符合条件的数据)
*:通配符,表示所有的元素
[]:子元素操作符
[,]:支持迭代器中做多选,多个key用逗号隔开
[start: end: step]:数组分割操作,等同于切片
?():应用过滤表示式
():脚本表达式,使用在脚本引擎下面