python测试框架untest怎么循环执行_unittest如何在循环遍历一条用例时生成多个测试结果...-程序员宅基地

技术标签: python测试框架untest怎么循环执行  

引用自: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中没有类似的方法,当我们需要遍历测试数据的时候怎样更好的去查看结果生成报告呢?

目前我没有找到比较好的第三方组件,唯一的方式是自己来改写,参看下面的代码

import unittest

class DataProviderSupport(type):

def __new__(meta, classname, bases, classDict):

# method for creating our test methods

def create_test_method(testFunc, args):

return lambda self: testFunc(self, *args)

# look for data provider functions

for attrName, attr in classDict.items():

if attrName.startswith("dataprovider_"):

# find out the corresponding test method

testName = attrName[13:]

testFunc = classDict[testName]

# the test method is no longer needed

del classDict[testName]

# generate test method variants based on

# data from the data porovider function

i = 1

for args in attr():

classDict[testName + str(i)] = create_test_method(testFunc, args)

i += 1

# create the type

return type.__new__(meta, classname, bases, classDict)

这里其实用到了元类的概念,也就是,我们重写的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,结果如下:

95c226b29a7eb4552022d88498fcbcca.png

元类的概念,请参考:

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29655587/article/details/113514116

智能推荐

Struts2拦截器和文件上传_struts2拦截了ofd附件-程序员宅基地

文章浏览阅读195次。 拦截器首先需要创建一个拦截器OneInterceptor可以实现implements Interceptor接口 也可以继承extends AbstractInterceptor类注意这里用的是xwork2包下面的package zking.web;import com.opensymphony.xwork2.ActionInvocation;import com..._struts2拦截了ofd附件

C++:异常处理基本语法——throw和 try...catch_如果在try块中用“throw“error”;”语句抛掷一个异常,则参数类型是()的catch-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏4次。转载于http://c.biancheng.net/view/422.htmlC++ 通过 throw 语句和 try…catch 语句实现对异常的处理。throw 语句的语法如下:throw 表达式;该语句拋出一个异常。异常是一个表达式,其值的类型可以是基本类型,也可以是类。try…catch 语句的语法如下:try { try块}catch(异常类型) { “..._如果在try块中用“throw“error”;”语句抛掷一个异常,则参数类型是()的catch

HDLbits错题_error (10734): verilog hdl error at mca_out_ctrl.v-程序员宅基地

文章浏览阅读401次。1.BCDadd100参考HDLBits Day5 Bcdadd100变量下标中有变量的情况注意大小端表示步骤 注意整个工程大小端必须一致1.定义的变量是大端还是小端模式2.看升序(+:)还是降序(-:)3.看位宽并进行转换定义reg [31:0] big_vect;reg [0:31] little_vect;解释big_vect [0 +: 8] 从0 开始,升序,位宽为8 ======》》》》》big_vect [7 :0]little_vect _error (10734): verilog hdl error at mca_out_ctrl.v(16): p is not a constant

python编程,从入门到实践:第七章_python大学生刘海在唐人街开了一间餐馆用编程帮助刘海点菜和结账-程序员宅基地

文章浏览阅读355次。python编程,从入门到实践:第七章7-1 汽车租赁 汽车租赁 :编写一个程序,询问用户要租赁什么样的汽车,并打印一条消息,如“Let me see if I can find you a Subaru”。7-2 餐馆订位 餐馆订位 :编写一个程序,询问用户有多少人用餐。如果超过8人,就打印一条消息,指出没有空桌;否则指出有空桌。 7-3 10的整数倍 的整数倍 :让用户输入一个数字,并指出..._python大学生刘海在唐人街开了一间餐馆用编程帮助刘海点菜和结账

解决SpringCloud客户端启动报错:“Field XXX required a bean of type XXX that could not be found”_升级springcloud required a bean of type interface th-程序员宅基地

文章浏览阅读920次。消费方调用提供方的方法@EnableFeignClients //添加fegin注解,调用其他服务方法_升级springcloud required a bean of type interface that could not be found.

JAVA-数组例题(随机排名)_某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。-程序员宅基地

文章浏览阅读997次,点赞4次,收藏5次。题目:猜数字游戏要求:(1)游戏后台随机生成1-20之间的5个数(无所谓是否重复),然后让大家来猜数字, 为猜中_某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。

随便推点

lgo软件许可号许可码_软件是许可的还是出售的?-程序员宅基地

文章浏览阅读1.5k次。lgo软件许可号许可码Selling software is a legal minefield. When you purchase a digital product, you’re not buying the CD/DVD and packaging, but a license to use the software. The license is a legally-binding a..._lgo许可号

查看FreeBSD的进程_freebsd 查看进程-程序员宅基地

文章浏览阅读2.7k次。FreeBSD是一个多任务的操作系统,也就是说同时可以执行多个程序。一个执行中的程序就是进程。每个进程都有一个由系统临时分配的唯一标识,称为进程ID(可从1分配到99999),或PID。绝大多数的进程都有一个父进程,即用来启动该进程的进程。但是,在系统中有一个叫做init的进程,其PID始终为1,该进程在FreeBSD启动时由内核自动启动。例如,用户在shell中执行指令ls,则ls对应的进程就是_freebsd 查看进程

使用 Richfaces/Ajax4Jsf 创建 Web 应用-程序员宅基地

文章浏览阅读118次。周 进光 ([email protected]), 软件工程师, 舜联软件科技2007 年 11 月 30 日本文简要介绍如何运用 Richfaces/A4J 来构建 JSF 应用,包括如何定义配置文件、控件使用等。 概念介绍 JSF和 Ajax 概念大家一定不陌生,二者结合起来衍生出 A4J(Ajax4..._richfaces org.ajax4jsf.skin

数字IC验证系列之objection mechanism_obj genericimm-程序员宅基地

文章浏览阅读380次。UVM中,component的task phase是消耗仿真时间的,各个components的task phase之间需要完成同步。只有在所有components的相同task phase结束之后,才能进入下一个task phase。UVM中通过objection mechanism中的raise/drop objection来控制phase的开始和停止。当仿真器进入某个消耗时间的task phase时,首先会收集所有component**提起(raise)的objection,然后按顺序执行所有com_obj genericimm

HttpPrinter说明文档(web打印中间件,web打印插件)_httpprinter oem.lic-程序员宅基地

文章浏览阅读8.5k次。一、入门1、启动HttpPrinter双击 HttpPrinter_latest/HttpPrinter.exe 即可启动2、怎样调用在 调用实例 文件夹下 有各种调用demo我们常用的 web打印 在 js 目录下3、token 干嘛用的token你可以理解为密码 发送的 token值 要 在 httpprinter的token列表里面token列表的查看步骤:系..._httpprinter oem.lic

Java智力题_两柱香 编程-程序员宅基地

文章浏览阅读4.4k次。智力题,每个正式的笔试、面试都会出,而且在面大企业的时候必然会问到,笔者曾在很多面试中,都被问到过,不过答得都不是很好,因为时间很短,加上我们有时候过于紧张,所以做出这类问题,还是有一定的难度,从这篇文章中我会总结一些常见的智力题1、农民分金条问题题目:你让农民为你工作7天,给他的回报是一根金条。金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金_两柱香 编程

推荐文章

热门文章

相关标签