Python 应用闭包思路动态生成unittest执行脚本---有问题!后文上解决方案!
我们先说需求,在web化的通用接口自动化平台执行case时,你可能一次只执行一个case或者多个case,另外case也不是固定的,那么我们在采用unittest框架作为执行case并生产HTML report,那么我们就需要动态的生成unittest的testcase,经过研究我发现一个好思路,就是应用闭包思路动态生成unittest脚本,废话不多直接说上代码吧。
这个demo呢,不能直接集成到web框架中,还要做一些修改,另外还有一些地方需要优化,比如结果对比这块还有很多可以优化的地方。
运行环境 Python2.7.13
1 # coding=utf8 2 import HtmlTestRunner 3 import sys 4 import unittest 5 6 import requests 7 8 reload(sys) 9 sys.setdefaultencoding('utf-8') 10 11 12 def run_single_testcase(testcase): 13 if type(testcase) != dict: 14 testcase = eval(testcase) 15 req_kwargs = testcase['request'] 16 try: 17 url = req_kwargs.pop('url') 18 method = req_kwargs.pop('method') 19 except Exception as e: 20 raise e 21 22 resp_obj = requests.request(url=url, method=method, **req_kwargs) 23 return resp_obj 24 25 26 class Test(unittest.TestCase): 27 28 '怎么传入这个值呢?' 29 30 def setUp(self): 31 pass 32 33 def begin_req(self, apidata): 34 back = run_single_testcase(apidata) 35 YQ = 200 # 输入预期的值 36 SJ = back.status_code # 设置实际返回,如果需要传入TOKEN等header,请务必填写! 37 self.assertEqual(SJ, YQ) 38 39 40 def demo(apidata): 41 def tool(self): 42 Test.begin_req(self, apidata) 43 44 setattr(tool, '__doc__', u'测试%s' % str(apidata['name'])) 45 return tool 46 47 48 def testall(apidata): 49 for i in range(len(apidata)): 50 setattr(Test, 'test_' + str(i + 1), demo(apidata[i])) 51 52 53 def suite(Apidata): 54 testall(Apidata) 55 suit = unittest.makeSuite(Test) 56 return suit 57 58 59 def run(Apidata): 60 filepath = 'D:\\pyresult.html' 61 fp = file(filepath, 'wb') 62 # 定义测试报告的标题与描述 63 runner = HtmlTestRunner.HTMLTestRunner(stream=fp, title=u'我是测试报告的标题', description=u'我是测试报告的描述') 64 runner.run(suite(Apidata)) 65 fp.close() 66 67 68 if __name__ == "__main__": 69 """Apidata = []""" 70 api1 = {u'request': {u'url': u'http://127.0.0.1:8000/localresponse/test1?param=1', 71 u'headers': {}, 72 u'json': {}, 73 u'method': u'get' 74 }, 75 u'name': u'fengyca', 76 u'response': {u'body': {u'msg': u'user created successfully.', u'success': True}, 77 u'headers': {u'Content-Type': u'application/json'}, 78 u'status_code': 200 79 } 80 } 81 Apidata = [api1] 82 run(Apidata)
生成的日志如下图,HtmlTestRunner生成的报告是真的丑,不过又不是我用,我就不管了,你要是感觉受不了这么丑的...可以美化一下,我懒得搞了。
具体参考上述代码吧,如果你看不懂可以在评论区问我,我不一定会回答。