背景是这样的:

  自己写了一套接口自动化的框架,其中使用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/Simple-Small

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

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

    本章简言 上一章讲到关于ContainerProvider的知识.让我们知道struts2是如何注册相关的数据.也知道如何加载相关的配置信息.本章笔者将讲到如何加载配置文件里面的package元素节点 ...

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

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

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

    python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 > ...

  4. Android6.0 源码修改之 Contacts应用

    一.Contacts应用的主界面和联系人详情界面增加顶部菜单添加退出按钮 通过Hierarchy View 工具可以发现 主界面对应的类为 PeopleActivity 联系人详情界面对应的类为 Qu ...

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

    前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar 在某些特殊定制的版本中要求 ...

  6. Android6.0 源码修改之屏蔽系统短信功能和来电功能

    一.屏蔽系统短信功能 1.屏蔽所有短信 android 4.2 短信发送流程分析可参考这篇 戳这 源码位置 vendor\mediatek\proprietary\packages\apps\Mms\ ...

  7. el-upload源码修改跳坑

    之前给element-ui提了一个问题,结果没有鸟我,没办法,只能修改源码来满足需求了 (备注:element-ui2依然没有修改,为了迎合产品还是要改源码) 本文讨论的组件属性仅限于list-typ ...

  8. openfire源码修改后如何打包部署到linux服务器上

    原文:http://blog.csdn.net/jinzhencs/article/details/50457152 1.linux版本的3.10.3解压部署启动(过程略,参考我的另一篇博文http: ...

  9. python requests接收chunked编码问题-python源码修改

    python requests接收chunked编码问题-python源码修改 学习了:https://blog.csdn.net/wangzuxi/article/details/40377467

随机推荐

  1. springboot配置SSL自签名证书

    1.证书生成 每一个JDK或者JRE里都有一个工具,叫做:keytool,安装了jdk或jre之后,配置好JAVA环境之后,就可以直接在控制台使用该命令生成自签名证书: 在控制台输入: keytool ...

  2. keras04 GAN simple

    reference: GAN 讲解 https://blog.csdn.net/u010900574/article/details/53427544 命令行解析 https://blog.csdn. ...

  3. Centos6.5-dnsmasq安装

    1.使用yum install dnsmasq -y 安装dns(含dns server和dns代理功能) 2.查询dnsmasq已经安装成功 [root@localhost ~]# rpm -q d ...

  4. 时间插件datepicker(jQuery-UI,bootstrap)和jquery-steps的冲突解决。。。

    日期插件初始化:  $('.prelease_time').flatpickr(); let contentSteps = $("#content_form").steps({ h ...

  5. git总结一、工作中常用基础命令

    首先来了解两个概念: 工作区:比如你的项目目录 暂存区:git和其他版本控制系统的不同之处就是有这个暂存区的概念. .git不是工作区,而是git 版本库,在版本库中存放着很多东西,比如暂存区(sta ...

  6. Java中的String,StringBuilder,StringBuffer

    String被final修饰,不可变,每次更改其实是重新创建了一个对象.StringBuilder,StringBuffer是可变的. StringBuffer是线程安全的,StringBuilder ...

  7. CentOS7使用yum安装MySQL8.0

    1.yum仓库下载MySQL:sudo yum localinstall https://repo.mysql.com//mysql80-community-release-el7-1.noarch. ...

  8. Spring Boot 2.x 编写 RESTful API (三) 程序层次 & 数据传输

    用Spring Boot编写RESTful API 学习笔记 程序的层次结构 相邻层级的数据传输 JavaBean 有一个 public 的无参构造方法 属性 private,且可以通过 get.se ...

  9. js重点--匿名函数

    推荐博客:https://www.cnblogs.com/pssp/p/5216668.html 函数是必须要有函数名的,不然没有办法找到它,使用它. 如果没有名字必须要有一个依附体,如:将这个匿名函 ...

  10. 2017-12-19python全栈9期第四天第三节之iterable可迭代对象join之字符串和列表转换成字符串和range

    #!/user/bin/python# -*- coding:utf-8 -*-s = 'zd's1 = '_'.join(s)print(s1)li = ['zs','ls','ww','zl',' ...