Django接口平台开发问题记录(六)
Django框架下接口平台怎么使用HTMLTestRunnerCN生成测试报告,自动生成用户所选用例.py文件使用discover()批量执行
场景:如何使用HTMLTestRunnerCN生成测试报告,生成unittest用例文件并批量执行
思路:使用HTMLTestRunnerCN需要unittest来对用例进行操作,将获取到需要执行的用例数据后,将每条用例都单独生成一个.py文件,这个文件可以是配置好模版的,只需将数据传入对应位置即可使用。然后通过discover()方法遍历文件夹下的所有用例文件,然后生成报告,具体实现如下
HTMLTestRunnerCN原创地址可点击下载
上图为在目录下创建了两个文件夹,report存放HTMLTestRunnerCN生成的测试报告,File下存放的为Get和Post模版具体代码如下(目前只支持这两种类型的接口)
# -*- coding: utf-8 -*-
import sys
import unittest
import requests
class test_${ClassName}(unittest.TestCase):
def setUp(self):
pass
def test_${ClassName}(self):
res = requests.get(url='${UrlName}', params='${Params}')
self.assertEqual(200,res.status_code,'失败')
def tearDown(self):
pass
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(test_${ClassName})
unittest.TextTestRunner(verbosity=2).run(suite)
# -*- coding: utf-8 -*-
import sys
import unittest
import requests
import json
class test_${ClassName}(unittest.TestCase):
def setUp(self):
pass
def test_${ClassName}(self):
res = requests.post(url='${UrlName}', data='${Data}',
json=json.dumps('${Data}'))
self.assertEqual(200,res.status_code,'失败')
def tearDown(self):
pass
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(test_${ClassName})
unittest.TextTestRunner(verbosity=2). run(suite)
如复制以上代码,可忽略红线报错,需注意unittest中用例def需要以‘test_’为开头,切记!切记!切记
变量名${ClassName}可自拟
模版准备好后可以编写主函数了 view.py:
def Report(request):
if request.method == "POST": # 点击生成报告,全选需要生成报告的接口,将接口数据传递到这,进行处理
arr = request.POST.get('arr')
data = json.loads(arr)
for i in data:
if i['in_type'].upper() == 'POST':
# 需要将以下地址换成本地地址
tplFilePath = r'……/File/Template_Post.py'
path = r'……/templates/File/'
ClassNameList = []
UrlList = []
DataList = []
ClassNameList.append(i['in_mname'])
UrlList.append(i['in_url'])
DataList.append(i['in_data'])
for className in ClassNameList:
for urlName in UrlList:
for dataList in DataList:
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
filename = 'test_' + str(className) + '.py' # 必须要以test为开头
tplFile = open(tplFilePath)
gFile = open(path + filename, "w")
lines = []
tpl = Template(tplFile.read())
lines.append(tpl.substitute(
now=now,
ClassName=className,
UrlName=urlName,
Data=dataList,
))
gFile.writelines(lines)
tplFile.close()
gFile.close()
print('%s文件创建完成' % filename)
continue
elif i['in_type'].upper() == 'GET':
# 需要将以下地址换成本地地址
tplFilePath = r'/……/templates/File/Template_Get.py'
path = r'/……/templates/File/'
ClassNameList = []
UrlList = []
DataList = []
ClassNameList.append(i['in_mname'])
UrlList.append(i['in_url'])
DataList.append(i['in_data'])
for className in ClassNameList:
for params in DataList:
for urlName in UrlList:
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
filename = 'test_' + str(className) + '.py' # 必须要以test为开头
tplFile = open(tplFilePath)
gFile = open(path + filename, "w")
lines = []
tpl = Template(tplFile.read())
lines.append(tpl.substitute(
now=now,
ClassName=className,
Params=params,
UrlName=urlName,
))
gFile.writelines(lines)
tplFile.close()
gFile.close()
print('%s文件创建完成' % filename)
continue
# 需要将以下地址换成本地地址
test_dir = '/……/templates/File'
filepath = '/……/report/TestReport.html'
def allcase():
discover = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
# discover方法筛选出来的用例,循环添加到测试套件中
suite = unittest.TestSuite()
suite.addTest(discover)
print(discover)
return suite
fp = open(filepath, 'wb')
# 定义测试报告的标题与描述
runner = HTMLTestRunnerCN.HTMLTestReportCN(stream=fp, title=u'测试报告', description=u'测试报告描述')
runner.run(allcase())
fp.close()
return render(request, 'Page/Perform_Result.html')
arr是前端页面返回过来记录用户选择执行的数据列表,如有疑问可看上篇文章Django接口平台开发问题记录(五)
discover()可不用一条一条用例添加到测试套件中,变相实现了批量执行功能
Report函数路由指向前端生成报告按钮就可以,点击按钮跳转到view.py中的Report函数
前提:在点击生成报告前需要用户将要生成报告的用例进行勾选,之后才可以点击按钮,原因是需要获取用户的数据,这一块儿还需要改进,来看下效果:
点击生成报告后,File文件夹下会自动创建对应的接口用例:
查看report文件夹下的报告文件:
初步实现功能,细节还需要修改,如有建议或问题可私信!