Python结合Requests与Unittest构建API接口自动化测试方案
本文详解如何利用Python、Requests库及Unittest框架实现API接口自动化测试。通过集中管理正常与异常参数,动态生成多维度的测试用例组合,并循环执行请求以验证接口健壮性。文章提供了从参数配置到脚本执行的完整代码示例,适用于需要覆盖边界值、SQL注入及类型错误的接口测试场景。
检索网络上的接口测试资料,多数方案侧重于数据驱动模式,即将测试用例维护在文本文件或表格中,却鲜少涉及如何自动生成所需用例的具体方法。
核心问题:
在测试接口时,若需验证参数a(涵盖不传、为空、整形、浮点、字符串、object、过短、超长、sql注入等情形),每种情形对应一条用例。关键在于确保参数b和c保持正确,从而排除其他参数错误对参数a测试结果的干扰。
解决思路:
符合接口规范的参数可通过手动填写或预先在代码库中准备。对于不符合规范的参数(如不传、为空、整形、浮点、字符串、object、过短、超长、sql注入等),同样可预先在库中定义为常量,以便反复调用。
主要实现的功能点:
1.将API参数整理至字典结构中,便于组合参数以生成用例。
2.对生成的用例进行循环执行。
3.封装部分代码以提升使用的便捷性与可维护性。
源码分析:
canshuxinxi.py文件用于存储API接口信息。采用字典形式存放,通过API_ALL['登录接口'][url]的方式获取数据,结构直观,清晰标识所取接口的具体信息部分。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-06-09 14:09
# canshuxinxi.py
# 接口信息
API_ALL = {
'登录接口': {
'number': '1',
'url': 'http://www.baidu.com',
'leixing': 'post',
'head': {
'aa': 'bb',
'cc': 'dd',
},
'canshu': {
'username': 'Wbfxs001',
'password': '111111Qq',
'grant_type': 'password',
},
'qiwang': {
'code': 200,
'name': 'Wbfxs001',
},
},
'退出接口': {
'number': '1',
'url': 'http://www.baidu.com',
'leixing': 'get',
'canshu': {
'username': 'Wbfxs001',
'password': '111111Qq',
'grant_type': 'password',
}
}
}
changliang.py文件用于存储非常规参数(可能导致接口响应异常的参数),同样采用字典存储以便维护。例如,后续若需新增SQL注入代码段,可直接在字典后追加。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-06-09 14:09
# changliang.py
# 常用参数不传,为空,整形,浮点,字符串,object,过短,超长,sql注入
objects1 = 'xxxx'
objects2 = 'ssss'
ZHCS = {
'为空': [''],
'整形': [10, 23, 44, 88, 99],
'浮点': [1.11, 2.342, -1.03],
'字符串': ['aaaa', 'bbbb', 'cccc','dddd'],
'object': [objects1, objects2],
'过短': ['1', '0'],
'超长': ['11111111111111111111111111111111111111111111111'],
'sql注入': [';and 1=1 ;and 1=2', ";and (select count(*) from sysobjects)>0 mssql", ";and 1=(select IS_SRVROLEMEMBER('sysadmin'));--"],
}
gongju.py作为工具类,封装了相关方法以便调用。其实现了对参数进行组合,生成不同组合的字典类型参数,并将这些字典参数保存至列表中,方便后续取用。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-06-09 14:11
# gongju.py
# 生成不同组合的参数
class gj():
def listalls(self, csTrue, csFalse):
fzgcs = [] # 得到cycanshu的key,将所有非正规参数放在一个list中
listall = [] # 保存参数dict 为 list
zhcs = dict(csTrue)
listall.append(csTrue)
aaa = list(csFalse.keys())
for i in aaa:
bbb = csFalse[i] # 得到具体参数list
for k in bbb:
fzgcs.append(k) # 便利每一个参数加入fzgcs列表
zhcskey = list(zhcs.keys()) # 拿到将要进行组合的参数
for i in zhcskey:
a = zhcs[i] # 保留原有的参数值,下面替换完后复原正确参数
for k in fzgcs:
zhcs[i] = k
listall.append(str(zhcs))
# 循环完后复原正确参数
zhcs[i] = a
return listall
jiaoben.py文件作为脚本类,负责对组合好的参数进行循环执行,依次带入组合参数发起请求。目前仅实现了请求发送和响应信息打印,后续可加入对响应结果的断言逻辑。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-06-09 14:22
# jiaoben.py
from changliang import ZHCS
from canshuxinxi import API_ALL
from gongju import gj
import requests
# 脚本类,组合工具参数进行请求
gj = gj()
def jball():
apikeys = API_ALL.keys()
print(apikeys)
for key in apikeys:
apiname = key
url = API_ALL[key]['url']
number = API_ALL[key]['number']
leixin = API_ALL[key]['leixing']
canshus = gj.listalls(API_ALL[key]['canshu'], ZHCS)
if leixin == 'post':
print("======="+" api名称:"+apiname+"=======")
for cs in canshus:
mp = requests.post(url=url, data=cs)
fhcode = str(mp.status_code)
xysj = str(mp.elapsed.microseconds)
print("=响应=api编号:"+number+" 响应code:"+fhcode+" 响应时间:"+xysj)
if leixin == 'get':
print("======="+" api名称:"+apiname+"=======")
for cs in canshus:
mp = requests.get(url=url, data=cs)
fhcode = str(mp.status_code)
xysj = str(mp.elapsed.microseconds)
print("=响应=api编号:"+number+" 响应code:"+fhcode+" 响应时间:"+xysj)
jball()
tesone.py文件作为用例执行文件。熟悉unittest框架的读者可知其原理,此处主要利用该类控制脚本执行,结合unittest框架后,便于后续功能的扩展。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-06-09 8:53
# tesone.py
import requests
import unittest
import time
from jiaoben import jball
class testclassone(unittest.TestCase):
def setUp(self):
print(111)
pass
def test_1(self):
jball() # 执行脚本
pass
def tearDown(self):
print(333)
pass
if __name__ == '__main__':
unittest.main()
最后附上用例执行后的效果图:

以上这篇python+requests+unittest API接口测试实例(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













