unittest如何在循环遍历一条用例时生成多个测试结果
引用自:http://blog.csdn.net/kaku21/article/details/42124593
参考网址:http://programmaticallyspeaking.com/test-data-provider-using-python-metaclass.html
使用TestNG进行测试的时候,允许使用外部数据源来驱动测试方法的执行,举个例子:
我们有一个测试方法,而这个测试方法对应有10条测试数据,如果我们在测试方法中使用循环遍历这十条数据的话,很可能出现的问题是:
1.测试中的断言 assert 遇到一条数据执行结果错误时,退出测试方法
2.剩余的数据无法继续执行,产生的数据报告不完整
解决上述问题的方法,利用TestNG的dataprodvider在测试类中获取外部数据,然后传给测试方法,这样做到每一条数据驱动一次测试方法的执行,测试方法按数据量自动产生方法序号,报告测试结果。当某一条数据执行结果错误的时候,该方法对应的产生一次失败信息,但不影响下一条数据的执行。
在测试报告中,看到的是某一个方法,然后产生了多少条报告。
关于TestNG数据驱动的详情可以参考 http://testng.org/doc/documentation-main.html#parameters-dataproviders
我们要说的是,在python的unittest中没有类似的方法,当我们需要遍历测试数据的时候怎样更好的去查看结果生成报告呢?
目前我没有找到比较好的第三方组件,唯一的方式是自己来改写,参看下面的代码
<pre><span class="kn">import</span> <span class="nn">unittest</span> <span class="k">class</span> <span class="nc">DataProviderSupport</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">__new__</span><span class="p">(</span><span class="n">meta</span><span class="p">,</span> <span class="n">classname</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">classDict</span><span class="p">):</span>
<span class="c"># method for creating our test methods</span>
<span class="k">def</span> <span class="nf">create_test_method</span><span class="p">(</span><span class="n">testFunc</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
<span class="k">return</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">:</span> <span class="n">testFunc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="c"># look for data provider functions</span>
<span class="k">for</span> <span class="n">attrName</span><span class="p">,</span> <span class="n">attr</span> <span class="ow">in</span> <span class="n">classDict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="k">if</span> <span class="n">attrName</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">"dataprovider_"</span><span class="p">):</span>
<span class="c"># find out the corresponding test method</span>
<span class="n">testName</span> <span class="o">=</span> <span class="n">attrName</span><span class="p">[</span><span class="mi">13</span><span class="p">:]</span>
<span class="n">testFunc</span> <span class="o">=</span> <span class="n">classDict</span><span class="p">[</span><span class="n">testName</span><span class="p">]</span>
<span class="c"># the test method is no longer needed</span>
<span class="k">del</span> <span class="n">classDict</span><span class="p">[</span><span class="n">testName</span><span class="p">]</span> <span class="c"># generate test method variants based on</span>
<span class="c"># data from the data porovider function</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">args</span> <span class="ow">in</span> <span class="n">attr</span><span class="p">():</span>
<span class="n">classDict</span><span class="p">[</span><span class="n">testName</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)]</span> <span class="o">=</span> <span class="n">create_test_method</span><span class="p">(</span><span class="n">testFunc</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
<span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> <span class="c"># create the type</span>
<span class="k">return</span> <span class="nb">type</span><span class="o">.</span><span class="n">__new__</span><span class="p">(</span><span class="n">meta</span><span class="p">,</span> <span class="n">classname</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="n">classDict</span><span class="p">)</span>
这里其实用到了元类的概念,也就是,我们重写的type元类的__new__函数
验证一下:
class TestStringLength(unittest.TestCase):
__metaclass__ = DataProviderSupport def dataprovider_test_len_function(): # no self!
yield ("abc", 3)
yield ("", 0)
yield ("a", 1) def test_len_function(self, astring, expectedLength):
self.assertEqual(expectedLength, len(astring))
运行 python的unittest,结果如下:

元类的概念,请参考:
http://www.ibm.com/developerworks/cn/linux/l-pymeta/
http://blog.csdn.net/b2b160/article/details/4161189
这个函数能够返回当前类的类名称,类字典,同时可以创建测试方法 即 create_test_method
当有多个测试数据对应一个测试方法时,我们把测试方法增加了序号,如果在后续引用测试方法时,需要在测试方法名称后面添加序号
例如 suite.addTest(Testdriver(methodname+sn))
http://www.cnblogs.com/fnng/p/8185172.html
unittest如何在循环遍历一条用例时生成多个测试结果的更多相关文章
- pybot执行多条用例时,某一个用例执行失败,停止所有用例的执行
问题: pybot执行多条用例时,某一个用例执行失败,停止所有用例的执行 解决办法: pybot -exitonfailure E:\robot\呼送项目\测试用例\基本流程\主流程.txt 参考文章 ...
- mysql存储过程查询结果循环遍历 判断 赋值 游标等基本操作
一.首先说下本篇博客所实现功能的背景和功能是怎样的: 背景:因为公司项目开始迁移新平台项目,所以以前的平台老数据以及订单信息需要拆分表,而且需要业务逻辑来分析以前的订单表,来拆分成另外的几个新表,包括 ...
- IT兄弟连 Java语法教程 数组 使用foreach循环遍历数组元素
从JDK5之后,Java提供了一种更简单的循环:foreach循环,也叫作增强for循环,这种循环遍历数组和集合更加简洁.使用foreach循环遍历数组和集合元素时,无需获得数组或集合的长度,无需根据 ...
- MS SqlServer 2008R2- Sql语句循环遍历生成百条随机数
Sql语句,循环遍历生成区间5~20的随机数语句如下: are @i int DECLARE @Result INT DECLARE @Upper INT DECLARE @Lower INT ) ) ...
- php用压栈的方式,循环遍历无限级别的数组(非递归方法)
php用压栈的方式,循环遍历无限级别的数组(非递归方法) 好久不写非递归遍历无限级分类...瞎猫碰到死老鼠,发刚才写的1段代码,压栈的方式遍历php无限分类的数组... php压栈的方式遍历无限级别数 ...
- Objective-C 高性能的循环遍历 forin - NSEnumerator - 枚举 优化
Cocoa编程的一个通常的任务是要去循环遍历一个对象的集合 (例如,一个 NSArray, NSSet 或者是 NSDictionary). 这个看似简单的问题有广泛数量的解决方案,它们中的许多不乏 ...
- 关于js中循环遍历中顺序执行多个嵌套ajax的问题
就是业务上需要完成一个功能,这个功能需要依次调用四个接口,后面接口的参数都依赖于前一个接口的返回值. 类似这样: var objArr = "从其他逻辑获得"; for(var n ...
- for循环和foreach循环遍历集合的效率比较
先上代码 package com.test; import java.util.ArrayList; import java.util.LinkedList; import java.util.Lis ...
- C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例
C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...
随机推荐
- 新iPhone上市会让富士康迎来新一轮的“用工荒”吗?
新iPhone上市,在接下来的几个月内,中国制造会迎来一段非常忙碌或者说忙乱的日子,之所以说忙碌,是在于苹果的订单量常常大得吓人,而之所以说忙乱,则在于连同富士康.和硕.绿点科技等制造业巨头都可能遭遇 ...
- android studio 黑屏问题
AVD配置不对,打开AVD从新配置
- 写excel文件-xlsxwriter包的使用
# encoding: utf8 from xlsxwriter.utility import xl_rowcol_to_cell import pandas as pd def df_to_exce ...
- Go语言-并发模式-资源池实例(pool)
Go语言并发模式 利用goroutine和channel进行go的并发模式,实现一个资源池实例(<Go语言实战>书中实例稍作修改) 资源池可以存储一定数量的资源,用户程序从资源池获取资源进 ...
- PROOF|ADOBE READER
样稿PROOF,最后是印刷样张. 修改校样是最后一次修改错误. 每一版editor不一样,任务不同. 不能修改工作单位,但是可以加一个标注. 最好使用ADOBE READER中的COMMENT& ...
- 我读《DOOM启世录》——成为一个真正厉害的人
序言 谈到游戏, 你的当然会想到几乎统治游戏市场多年的英雄联盟,你可能还会想起前段时间风头大盛的王者荣耀手游,你应该还会想起正在冲击着游戏市场的"吃鸡"类型游戏. 那么, 大家是否 ...
- 1. react 基础 简介 及 环境搭建
一.简介 由 Facebook 推出 2013 年 开源 的 函数式编程的 使用人数最多的 前端框架 拥有健全的文档与完善的社区 ( 官网 ) react 16 称为 React Fiber ( 底层 ...
- Java中static变量作用和用法详解
static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...
- np.newaxis 为 numpy.ndarray(多维数组)增加一个轴
>> type(np.newaxis) NoneType np.newaxis 在使用和功能上等价于 None,其实就是 None 的一个别名. 1. np.newaxis 的实用 > ...
- 三阶平面魔方(BFS)
有一个 3×3 的平面魔方,在平面魔方中,每个格子里分别无重复地写上 1 - 9 这 9 个数字.一共有 4 种对平面魔方的操作: 选择某一行左移. 选择某一行右移. 选择某一列上移. 选择某一列下 ...