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生成的报告是真的丑,不过又不是我用,我就不管了,你要是感觉受不了这么丑的...可以美化一下,我懒得搞了。

  具体参考上述代码吧,如果你看不懂可以在评论区问我,我不一定会回答。

posted @ 2018-02-07 11:22  fengyca  阅读(499)  评论(2编辑  收藏  举报