接口测试平台-76: 多接口之 大用例:报告引入小用例内容+UI优化

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等所有请求数据,进行请求,然后再对返回值进行提取和断言,那么这个模块 基本就完成了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值