Django接口平台开发问题记录(六)(HTMLTestRunnerCN生成测试报告,unittest批量执行测试用例)

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文件夹下的报告文件:
在这里插入图片描述
在这里插入图片描述
初步实现功能,细节还需要修改,如有建议或问题可私信!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值