接下来,我们创建一个用例参数序列化组件,它包含3个部分:
1. 接口的参数序列化
2. Get和Post请求发送
3. 结果收集和分析
一.本章的重点:
设计一个良好的序列化结构,将我们要在接口请求里携带发送的数据参数化保存,也就是对接口和参数进行剥离
通过学习第1篇教程,我们已经知道:
1.登录接口get_login的入参有2个,分别是user、password
2.用户名:user有3种可能值:[正确、错误、空]
3.登录密码:password有3种可能值:[正确、错误、空]
通过以上分析:
- 接下来我们对登录接口设计一个测试用例:
登录接口的参数中:user值是[正确]、password值也是[正确],该用例的预期即为“登录成功”。接口请求结束后,如果我们得到的panda_http_server返回的"result"字段值的确为200,就可得出结论:
Pass————接口登录逻辑验证正确,该用例测试通过!- 如果返回的"result"字段值为502,这个结果代表登录失败,和这条用例的预期完全不同,那么可得出结论:
Fail————接口登录逻辑验证异常,该用例测试失败!
此时,你意识到哪里出问题了?是panda_http_server服务器的密码验证逻辑代码错误导致的bug?还是你的接口参数的确填错人为问题呢?不妨仔细思考一下吧~
二.代码实现
# -*- coding: utf-8 -*-
"""
@version: 1.0
@author: TerryJay
@license: Apache Licence 2.0
@file: panda_parameter_sequence.py
@time: 2018/5/26 22:15
"""
import panda_request_test
import requests
"""
参数提取器:
1.按传入的param_number值来取出对应的字段
比如:serialize(0) 返回结果即为{"user":"panda","password":"12345"}
"""
def serialize(param_number):
# 上一章可看到:get_login接口里"user"字段的所有可能值如下,为了简单演示,本次是直接写在函数里,在实际投入项目使用时,可以将其储存在数据库,方便管理
user_params = {"user": [
{"user-0": "panda"},
{"user-1": "terry"},
{"user-2": ""}]}
# "password"字段的所有可能值
password_params = {"password": [
{"password-0": "12345"},
{"password-1": "54321"},
{"password-2": ""}]}
if param_number == 0 or param_number < len(user_params["user"]):
# 将user和password拼装起来,按字段param_number的值,依次返回对应的值,让接口执行器逐一读取执行
return {
"user": user_params['user'][param_number]["user-%s" % param_number],
"password": password_params['password'][param_number]["password-%s" % param_number]
}
else:
return None
def auto_get(get_url, get_body, get_headers):
panda_get = requests.get(url=get_url, params=get_body, headers=get_headers)
if panda_get.json()['result'] == '200':
return True
else:
return False
def auto_post(post_url, post_data, get_headers):
panda_post = requests.get(url=post_url, params=post_data, headers=get_headers)
if panda_post.json()['result'] == '200':
return True
else:
return False
# 以下是我对自己写的组件所做的单元测试,这也同时验证了panda_http_server服务的登录逻辑是否正确
if __name__ == '__main__':
# 我们设计的参数一共有3组
interface_args = 3
# 创建一个用来保存“执行成功,接口的返回值和预期相同”的变量——success,它的初始值是0
success = 0
# 创建一个用来保存“执行失败,接口的返回值和预期不同”的变量——fail,它的初始值也是0
fail = 0
# 用for循环,逐个读取我们上面的设计好的序列化参数,取一次参数就立即发送给post_login登录接口,并且获取返回值
for i in range(interface_args):
param = serialize(i)
# 判断一下读取到的参数是不是空的,如果是空就停止程序
if param is None:
print("您预设的接口参数个数'interface_args'不符实际!请修改正确后重试~")
exit()
else:
# 判断auto_get函数执行结果,如果为True,就表示这条用例执行成功了,success自增1
if auto_get(panda_request_test.panda_get_url, param, panda_request_test.panda_get_headers) is True:
success += 1
else:
fail += 1
print("总用例数-------", interface_args)
print("Pass用例个数---", success)
print("Fail用例个数---", fail)
"""
备注:
这个专门保存参数的组件就初步完成了,以后在主控制函数里就可以直接import进去调用,后续还会进行功能扩展:
如:
1.加入多进程模式即可进行接口压测;
2.加入SQL组件将执行结果提交到数据库保存等,大家可以试着自行扩展,有问题请在下方留言
"""
执行结果:
总用例数------- 3
Pass用例个数--- 1
Fail用例个数--- 2
如果你已经能独立完成这2章的内容,那么,接口自动化已经正式向你敞开大门了,在这之后,你甚至可以加入一个炫酷的前台H5界面,在本地或者远程浏览器里来控制执行你的测试方案,是不是很诱人?在这个小项目里实现你的想法吧,行动起来总是会有收获,下一章继续更新!
传送门:渐入佳境——python接口自动化测试之实现mysql访问器(3)
版权归作者@TerryJay所有,转载请注明出处