之前采用JMeter进行接口测试,每次给带新人进行培训比较麻烦,干脆用Python实现,将代码和用例分离,易于维护。
项目背景
公司的软件采用B/S架构,进行数据存储、分析、管理
工具选择
python开发的速度很快,且容易上手,丰富的第三方库,大大加快了开发速度和难度,自己开发一个简单的框架,优点是足够灵活,可以随时根据需求进行变更
框架思路(unittest)
考虑可重用性和可维护性,针对测试人员编写测试用例的方便性,采用数据驱动的设计方式,将数据分层出来,与业务逻辑剥离,测试人员就可以通过数据文件专注的写测试用例,不用关注代码编写,提高了效率
将测试的结果生成HTML格式的测试报告
模块介绍
# 封装的方法
Package
Base.py 请求(POST、GET)
Unit.py 工具类(断言、获取response数据)
# 测试报告
Report
# 接口场景用到的资源(图片、视频)
Resource
# 测试用例
Test_case
TestCase_**.py
…
TestCase_**.py
# unittest框架
all_test.py (包括生成html格式的测试报告)
# 实现在外部配置文件中配置请求接口URL、参数
pageMessage.py
代码介绍
封装的POST请求,代码如下:
def r_get(url, payload={}):
""" GET 请求 url:接口,payload:参数 """
response = ''
try:
# 根据传入的参数长度判断是否发送参数
if payload.__len__() == 0:
r = s.get(url, headers=heads)
else:
r = s.get(url, params=payload, headers=heads)
response = json.loads(r.text)
except Exception as err:
print err
return response
封装的GET请求,代码如下:
def r_post(url, payload={}, tp=''):
""" POST 请求 url:接口,payload:参数 ,tp:类型"""
try:
# 根据传入的参数长度判断是否发送参数
if payload.__len__() == 0:
r = s.post(url, headers=heads)
else:
# 根据传入的参数类型判断是否发送json格式的
if tp == 'json': # json数据
r = s.post(url, data=json.dumps(payload), headers=heads)
else:
r = s.post(url, data=payload, headers=heads)
response = json.loads(r.text)
except Exception as err:
print err
return response
获取response响应数据,代码如下:
def get_message(text, key):
""" 获取返回报文的数据 text:报文内容,key: 获取参数关键字 """
value = ''
try:
data = text['data']
# print '报文格式:', type(data)
if type(data) == list:
da = data[0] # 报文格式
value = da[key]
else:
value = data[key]
value = str(value)
print 'Message: ' + key + '=' + value
except Exception as err:
print "Error:", (err)
return value
断言,代码如下:
def assert_case(url, text, cod, mes):
""" 断言,判断 code 和 message """
code, message = '', ''
try:
code = text['code']
message = text['message']
assert_that(str(cod)).is_equal_to(str(code))
assert_that(str(mes)).is_equal_to(str(message))
except Exception, e:
print url + ' code: ' + str(code) + ' message:' + str(message) + ' ' + str(e)