ddt源码修改:HtmlTestRunner报告依据接口名显示用例名字

背景是这样的:

  自己写了一套接口自动化的框架,其中使用unittest + ddt + excel作为数据驱动模式的应用,使用HtmlTetstRunner来生成测试用例。

一切看起来很完美。

但是,发现测试报告中,测试用例名称都是:test_api_index.index表示用例的编号,从1开始,递增。比如:test_api_01、test_api_02......test_api_0N

希望能在不同的用例名称当中,显示相应的接口用例名字。比如登陆接口的成功登陆用例:测试报告中用例名称显示为test_login_success。密码错误的用例名称为:test_login_wrongPasswd

这样,我直接从报告中就可以知道是哪个接口的哪个用例失败了,一目了然。

于是,就开始琢磨这事儿了。。。

======================================背景分割线==================================

一琢磨就琢磨到ddt源码上去了。心中有一个疑惑:

1、为什么我的测试用例名称是这样的??

查看了ddt源码之后,发现有个函数是用来生成测试用例名字的。这个函数叫:mk_test_name

  它是如何来生成测试用例名字的呢?

它接受两个参数:name 和 value.

name:为单元测试中,测试用例的名字。即test_api.

value:为测试数据。ddt是处理一组测试数据。而这个value就是这一组数据中的每一个测试数据。

对value的值是有限制的:要么就是单值变量,要么就是元组或者列表并且要求元组和列表中的数据都是单值变量。如("name","port") 、["name","port"]

如果传进来的测试数据,不符合value的要求,那么测试用例名字为:name_index。

如果传进来的测试数据,符合value的要求,那么测试用例名字为:name_index_value。如果value为列表或者元组,那么将列表/元组的每个数据依次追加在末尾。

比如传进来的name值为test_login,value值为["name","port"]。那最终的测试用例名字是:test_login_01_name_port。

如果传进来的name值为test_login,value值为{"name":"login","port":2204},那最终的测试用例名字为:test_login_01。因为它不支持对字典类型的数据处理。

很不巧,我的接口自动化框架中,ddt处理的数据是一列表:列表当中每个数据都为字典。ddt一遍历整个列表,那传给value的值刚好是字典。。

so。。。我得到的测试用例名称就是:test_api_01,test_api_02,test_api_03..........test_api_0N

ddt源码如下(红色粗体部分标识):

 1 def mk_test_name(name, value, index=0):
 2     """
 3     Generate a new name for a test case.
 4
 5     It will take the original test name and append an ordinal index and a
 6     string representation of the value, and convert the result into a valid
 7     python identifier by replacing extraneous characters with ``_``.
 8
 9     We avoid doing str(value) if dealing with non-trivial values.
10     The problem is possible different names with different runs, e.g.
11     different order of dictionary keys (see PYTHONHASHSEED) or dealing
12     with mock objects.
13     Trivial scalar values are passed as is.
14
15     A "trivial" value is a plain scalar, or a tuple or list consisting
16     only of trivial values.
17     """
18
19     # Add zeros before index to keep order
20     index = "{0:0{1}}".format(index + 1, index_len)
21     if not is_trivial(value):    #如果不符合value的要求,则直接返回用例名称_下标作为最终测试用例名字。
22         return "{0}_{1}".format(name, index)
23     try:
24         value = str(value)
25     except UnicodeEncodeError:
26         # fallback for python2
27         value = value.encode(‘ascii‘, ‘backslashreplace‘)
28     test_name = "{0}_{1}_{2}".format(name, index, value)
29     return re.sub(r‘\W|^(?=\d)‘, ‘_‘, test_name)

2、修改ddt源码,显示测试用例名字

为了让我的测试报告,呈现的更好。那就改改ddt源码,让它能够适应我的框架。

考虑两个问题:

1、不同接口的测试用例名字如何来??

2、如何让ddt支持对字典的处理??

解决方法:

第一个问题:每一个测试用例主动提供一个用例名字,说明你是什么接口的什么场景用例。比如:接口名_场景名。login_success、login_noPasswd、login_wrongPasswd等。

        在我的框架当中,每一个测试用例是一个字典。那么我就在字典中添加一个键值对,case_name=用例名称

  第二个问题:在ddt中添加对字典的处理,如果字典中有case_name字段,则将字典中键名为case_name的值作为测试用例名称中的value值。

修改后的ddt源码为(红色粗体部分为修改的内容):

 1 def mk_test_name(name, value, index=0):
 2
 3     print("-------first value------------")
 4     print(value)
 5     # Add zeros before index to keep order
 6     index = "{0:0{1}}".format(index + 1, index_len)
 7     #添加了对字典数据的处理。
 8     if not is_trivial(value) and type(value) is not dict:
 9         return "{0}_{1}".format(name, index)
10     #如果数据是字典,则获取字典当中的api_name对应的值,加到测试用例名称中。
11     if type(value) is dict:
12         try:
13             value = value["case_name"]   #case_name作为value值
14         except:
15             return "{0}_{1}".format(name, index)
16     try:
17         value = str(value)
18     except UnicodeEncodeError:
19         # fallback for python2
20         value = value.encode(‘ascii‘, ‘backslashreplace‘)
21     test_name = "{0}_{1}_{2}".format(name, index, value)
22
23     return re.sub(r‘\W|^(?=\d)‘, ‘_‘, test_name)

原文地址:https://www.cnblogs.com/henry2018/p/9883022.html

时间: 2024-11-05 16:27:46

ddt源码修改:HtmlTestRunner报告依据接口名显示用例名字的相关文章

【E2LSH源码分析】E2LSH函数接口

上一小节,我们对E2LSH代码主要的源码框架和用到的数据结构作了简单介绍(http://blog.csdn.net/jasonding1354/article/details/38331229),这一节我将简单介绍一下E2LSH的主要函数接口. 1.构建R-NN数据结构(定义在NearNeighbors.h) 输入为1-δ.R.d和数据集P,利用下面函数来构建: PRNearNeighborStructT initSelfTunedRNearNeighborWithDataSet(RealT t

redis源码修改之zincrby,hincrby命令

在项目中大量使用zincrby命令,原因就是要统计日志中某个指标的计数值,且需要按顺序返回topn. 正常来说,一个指标调用一次zincrby(zincrby default:type 1 typeA) 就可以正常工作. 实际情况是由于日志生成的太快,redis cpu利用率经常100%,而且还丢数据. 是否可以一次性增加多次指标的累计值,比如zincrby default:type 1 typeA 1 typeB 1 typeC ...,这样将多次通信压缩到一次通信中,肯定能提高处理能力. 无

python的paramiko源码修改了一下,写了个操作命令的日志审计 bug修改

python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 >>> a="hello world" >>> a[:-1] 'hello worl' 转义符 转义字符 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a 响铃 \b 退格(Backspace) \e 转义 \000 空 \n

Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展,并重新打包文件,替换原有的 jar 文件,满足测试开发自身的需求. 下面以修改 eclipse 默认注释中的 ${date} 和 ${time} 对应的返回样式(如下图所示),进行实例说明. 整个二次开发的过程如下所示: 0.未修改之前,生成注释的日期.时间显示格式如下所示: 1.获取对应的 jar

Struts2 源码分析——配置管理之PackageProvider接口

本章简言 上一章讲到关于ContainerProvider的知识.让我们知道struts2是如何注册相关的数据.也知道如何加载相关的配置信息.本章笔者将讲到如何加载配置文件里面的package元素节点 .如struts.xml文件里面的package节点.那么为什么要分开来讲呢?按道理的话,都是放在上一章中一起讲不是更好吗?关键点在于笔者也不明白strtus2的作者为什么会这样子设计,把关于加载package元素节点信息的工作独立出来.而他的接口便是PackageProvider接口.但是不管如

Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮

前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar 在某些特殊定制的版本中要求完全去掉导航栏,那么当用户点进一些系统自带的应用界面如设置.联系人等,就没法退出了,虽然可以在actionBar中添加back按钮,但总不能每一个app都去添加吧.所以灵机一动我们就给系统添加一个全屏可拖拽的浮窗按钮,点击的时候处理返回键的逻辑.它大概长这样(审美可能丑了点,你们可以自由发挥) 图1

postgresql密码加强-passwordcheck源码修改三种以上字符

目录 1.使用方式 2.效果 3.源码修改 1.参考pg_cron的源码在配置文件内增加一个参数 2.修改源码配置校验数字 因数据库入网检测须修改密码级别,在源有的passwordcheck插件上进行二次修改 1.使用方式 替换目录 ../postgresql-11.4/contrib/passwordcheck 下的 passwordcheck.c 编译安装 make && make install postgresql配置文件内修改 (postgresql.conf) shared_p

IdentityServer4源码解析_4_令牌发放接口

目录 identityserver4源码解析_1_项目结构 identityserver4源码解析_2_元数据接口 identityserver4源码解析_3_认证接口 identityserver4源码解析_4_令牌发放接口 identityserver4源码解析_5_查询用户信息接口 identityserver4源码解析_6_结束会话接口 identityserver4源码解析_7_查询令牌信息接口 identityserver4源码解析_8_撤销令牌接口 协议 Token接口 oidc服

wemall app商城源码Android之通用通知接口demo

wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享Native(原生)支付模式一demo,供技术员参考学习. wemall官网地址:http://www.wemallshop.com 支付完成后,微信会把相关支付和用户信息发送到商户设定的通知URL,商户接收回调信息后,根据需要设定相应的处理流程. 这里举例使用log文件形式记录回调信息. notify_url.php <?php includ