1. 报告引入小用例
打开上节研发到一半的views.py和run函数:
# 运行大用例
def Run_Case(request):
Case_id = request.GET['Case_id']
Case = DB_cases.objects.filter(id=Case_id)[0]
steps = DB_step.objects.filter(Case_id=Case_id)
run(Case_id, Case.name, steps)
return HttpResponse('')
然后去 run_case.py中去写run函数:
输出一下,看看能不能正常传递过来:
看来是正常传递过来了。
紧接着要动态生成测试脚本函数。注意看下图中的红线部分,是一个小用例的demo 函数,这是unittest的标准写法。
正式运行时是要依靠这个demo的,然后根据传递过来的steps小步骤集合,来按照这个demo的格式循环生成真正的这些小用例函数。
首先把这个demo改动一下,让它不要叫test开头的函数(unittest框架只会运行test开头的小用例函数,所以避免这个demo母体被运行,就给它改个名字)
然后,下面顶格 新写一个函数,叫make_def,意思就是要给这个Test类 创造一些小函数了,它要接收steps,然后循环创造,比如有30个小step,它就要创造30个小函数:
def make_def(steps):
for i in range(len(steps)):
setattr(Test, "Test_" + str(steps[i].index).zfill(3), ...)
def run(Case_id, Case_name, steps):
make_def(steps)
在主要的run函数中 一开始就调用这个make_def函数来创造很多小用例函数。然后这个函数内是个for循环,利用python的setattr函数来给Test类创造子函数,setattr应该要传递三个值,第一个是类名,第二个是小函数的名字(小函数名为了避免重名,所以test开头的基础上加上了步骤的执行顺序-index来命名,而且unittest就是按照这个小用例函数名的字符串判断来确定执行顺序,所以为了避免 出现“12” 小于“5” 这个情况,就强行变成了"012">“005” ,这样才能保持执行顺序正确,而用法就是字符串.zfill(固定长度)。),第三个参数就是要创造的函数本体,必须要再新建一个函数,第三个参数就是调用这个新函数,而这个新函数 会返回一个 demo函数来作为本体。
所以在上面再创建一个新的 创造这个函数 的函数:
而这个函数需要什么作为参数呢?需要的就是我们的多个step中的正在要创造的这个单个step本体,因为它要去实际请求这个step了。
所以这么写:
def make_defself(step):
def tool(self):
Test.demo(self, step)
return tool
def make_def(steps):
for i in range(len(steps)):
setattr(Test, "Test_" + str(steps[i].index).zfill(3), make_defself(steps[i]))
那个tool就是真正创造的小用例函数本身,它调用或者说复制的就是Test里的那个demo函数,然后返回这个tool就对了。
这里也可以再用setattr函数来给这个小tool函数,加上__doc__属性,这个属性就是每个def函数都可以拥有的函数描述。在unittest里就会变成这个用例函数的用例名字。
所以创造这个tool的时候,可以指定它的名字,名字当然是从step中拿啊:
最后还有一步,就是要给这个demo函数 增加这个step的接收用的型参:接收到了这个step数据后,随便打印一下step的url,看看整个数据链条是否成功:
class Test(unittest.TestCase):
'测试类'
def demo(self, step):
print(step.api_url)
def make_defself(step):
def tool(self):
Test.demo(self, step)
setattr(tool, "__doc__", u"%s" % step.name)
return tool
def make_def(steps):
for i in range(len(steps)):
setattr(Test, "test_" + str(steps[i].index).zfill(3), make_defself(steps[i]))
def run(Case_id, Case_name, steps):
make_def(steps)
suite = unittest.makeSuite(Test)
filename = 'apitest/templates/Reports/%s.html' % Case_id
fp = open(filename, 'wb')
runner = HTMLTestRunner(fp, title='接口测试平台测试报告:%s' % Case_name, description='用例描述')
runner.run(suite)
重启服务,刷新页面,点击运行试一下,查看报告:
看到3条用例,3个点
2. UI优化
点击执行后,按钮太长,导致没装下,所以扩展一下操作的宽度,打开P_cases.html:改成了450px ,就好了
看看效果:
下一节就在里面直接提取url等所有请求数据,进行请求,然后再对返回值进行提取和断言,那么这个模块 基本就完成了。