Python 应用闭包思路动态生成unittest执行脚本---分析问题,解决问题,记录填坑。

  至于为什么要动态生成unittest执行脚本,以及设计思路,代码阅读参考前文,传送门。好了,本文我们就上一篇文章中的问题做一下分析,记录一下填坑之路吧,这个坑真特么深,挣扎了好久才出来。

  首先我们先说一下问题在哪,因为使用了闭包,闭包会绑定变量无法清除无法更改,假如我第一次运行testall函数循环两次,第一次是正常的,第二次运行testall函数循环一次,那么生成的报告就会出现问题,会出现第一次运行的结果。即是:后一次循环运行只要比前一次循环少,那么report一定会出现前一次的结果,必先的bug。

  好了,我们聊一下前文动态生成unittest执行脚本的坑有多深吧,主要涉及闭包,又因为闭包循环调用unittest的Test类添加方法组成suite,大家都知道Python的闭包会绑定变量,无法清除无法改变,我们把相关代码贴出来吧,方便看。

 1 class Test(unittest.TestCase):  # TestCase类
 2     "测试类"
 3
 4     def begin_req(self, apidata):  # 类方法
 5         back = run_single_testcase(apidata)  # 调用请求
 6         YQ = 200  # 结果对比
 7         SJ = back.status_code
 8         self.assertEqual(SJ, YQ)
 9
10 def demo(apidata):  # 闭包
11     def tool(self):
12         Test.begin_req(self, apidata)  # 调用Test方法
13
14     setattr(tool, ‘__doc__‘, u‘测试%s‘ % str(apidata[‘name‘]))
15     return tool
16
17 def testall(apidata): # 循环调用闭包
18     for i in range(len(apidata)):
19         setattr(Test, ‘test_‘ + str(i + 1), demo(apidata[i]))
20
21 def suite(Apidata):  # 调用testall拼装Test类,组装suit
22     testall(Apidata)
23     suit = unittest.makeSuite(Test)
24     return suit

代码释义: 类Test继承unittest.TestCase没啥好说的,方法demo闭包内部函数tool,tool方法的第一个参数self是Test类(我理解为指针指向Test类),函数testall循环调用闭包,函数suite我上面注释写的很清楚了

  这个坑有很大的迷惑性,我有很大一部分时间都在关注闭包函数,我认为是闭包导致的,一直在研究闭包哪里出错了,还有要如何更改闭包函数的参数,用了很多方法,什么容器装参数,后面删除容器成员啥的,全用上了...MMP...结果确实是闭包导致的,但是问题没有出在闭包函数处,要理解闭包请参考其他文章,传送门,我们就不白话了,上解决的代码吧

 1 def testall(apidata):
 2     nameList = []
 3     for i in range(len(apidata)):
 4         name = ‘test_‘ + str(i + 1)
 5         setattr(Test, name, demo(apidata[i]))
 6         nameList.append(name)
 7     return nameList
 8
 9 def suite(Apidata):
10     nameList = testall(Apidata)
11     suites = unittest.TestSuite()
12     for i in nameList:
13         suites.addTest(Test(i))
14     return suites

  主要修改了testall函数和suite函数,其实问题出在suite函数里,原有函数如下代码

1 def suite(Apidata):  # 调用testall拼装Test类,组装suit
2     testall(Apidata)
3     suit = unittest.makeSuite(Test)
4     return suit

   第三行中makeSuite函数,是指一次性添加Test类的方法到suite,结果闭包绑定的对象(python一切皆对象)在Test里,第一次运行组装的Test类方法被闭包绑定,后一次运行如果比前一次少,那么就会有没有被覆盖的方法,就会出现错误,所以修改makeSuite函数为addTest函数,问题就解决了,我研究了很久的闭包啊,结果问题出在了Test类上,真心心累。文笔太差..见谅..多谢..

原文地址:https://www.cnblogs.com/fengyca/p/8434630.html

时间: 2024-10-21 07:37:33

Python 应用闭包思路动态生成unittest执行脚本---分析问题,解决问题,记录填坑。的相关文章

Selenium 2自动化测试实战33(带unittest的脚本分析)

带unittest的脚本分析 #test.py #coding:utf-8 from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select from selenium.common.exceptions import N

[搬运自我的CSDN博客] python抓取javascript动态生成HTML内容的实践

<注:CSDN博客在美国访问特别卡,所以转移到cnblogs来发文章> 本实验在Ubuntu14.04上完成.使用的浏览器是火狐(Firefox 33.0),python版本是2.7.6. 大家都知道用urllib配合正则表达式抓取静态HTML的内容很方便,但是如果网页中有javascript动态生成的内容,urllib就无能为力了. 此时我们要借助一个额外的工具:selenium.它的工作原理是操纵(火狐)浏览器浏览目标网页,等待网页中的javascript全部执行完毕后再对HTML源码进行

python爬取ajax动态生成的数据 以抓取淘宝评论为例子

在学习python的时候,一定会遇到网站内容是通过ajax动态请求.异步刷新生成的json数据的情况,并且通过python使用之前爬取静态网页内容的方式是不可以实现的,所以这篇文章将要讲述如果在python中爬取ajax动态生成的数据. 至于读取静态网页内容的方式,有兴趣的可以查看博客内容. 这里我们以爬取淘宝评论为例子讲解一下如何去做到的. 这里主要分为了四步: 一 获取淘宝评论时,ajax请求链接(url) 二 获取该ajax请求返回的json数据 三 使用python解析json数据 四

web项目之BBS---从数据库查询动态生成版块信息问题分析和小结

前期学习了 html5.0   css3   javascript, jsp 页面也已经入门,老师通过BBS 的web项目来给我们讲述这些知识点在实际项目中的应用. 具体的注册.登陆都只是简单的业务层逻辑问题,不予说明.项目开始的第二天,老师布置了作业: 想清楚动态生成版块信息的流程,给的提示如下: 这是 board表的字段:boardid.name.和一个父版块id 用 map 来存入,map 的键就是父版块编号,值就是 List<Board>,这个 parentid 下面的所有Board

web项目--BBS之从数据库查询动态生成版块信息问题分析和小结

前期学习了 html5.0   css3   javascript, jsp 页面也已经入门,老师通过BBS 的web项目来给我们讲述这些知识点在实际项目中的应用. 具体的注册.登陆都只是简单的业务层逻辑问题,不予说明.项目开始的第二天,老师布置了作业: 想清楚动态生成版块信息的流程,给的提示如下: 这是 board表的字段:boardid.name.和一个父版块id 用 map 来存入,map 的键就是父版块编号,值就是 List<Board>,这个 parentid 下面的所有Board

unittest执行脚本的几个方法(python+selenium)

最近搭建框架的教程http://blog.csdn.net/u011541946/article/category/6788788 addTest 可以加载不同类里面的不同测试函数 # coding = utf-8 import unittest import testsuites from testsuites.test_baidu_search import BaiduSearch from testsuites.test_get_page_title import GetPageTitle

带unittest的脚本分析.py

import unittestfrom selenium import webdriverclass BaiduTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.driver.implicitly_wait(30) self.base_url = "http://www.baidu.com" """ 接下来定义空的verificationErro

Log4j2 - 动态生成Appender

功能需求 项目里将User分成了各个区域(domain),这些domain有个标志domainId,现在要求在打印日志的时候,不仅将所有User的日志都打印到日志文件logs/CNTCore.log中,还需要另外再打印到对应domain的日志文件logs/{domainId}/CNTCore.log. 比如User A的domainId是RD2,那么除了logs/CNTCore.log外,还需要将该User A的日志额外打印到logs/RD2/CNTCore.log中. 实现思路 将所有User

一个冷备份的自动执行脚本

花了一天多时间,捣鼓出一个SQL 脚本,用于执行ORACLE自动冷备份.记录如下: set echo off                               --关闭命令回显,但会显示执行后的命令. set serveroutput on                        --返回结果,如果关闭,将无法把结果传到下一个文件. set escape on                              --打开转义符功能,否则遇到/无法进行. set headin