unittest测试框架之DDT数据驱动

ddt的使用

DDT数据驱动

  • DDT:Data Driver Test(数据驱动测试)
  • 数据驱动思想:数据和用例进行分离,通过外部数据去生成测试用例

安装

pip install ddt

修改ddt源码(是为了在生成的测试报告中显示每条用例所对应的标题title)

  1. ddt文件中的ddt()方法
  2. 把原来的test_data_docstring = _get_test_data_docstring(func, v)注释掉
  3. 如果数据是用对象来保存的,就添加test_data_docstring = v.title
  4. 如果数据使用字典来保存的,就添加test_data_docstring = v["title"]
  5. 修改后生成的测试报告就能把title列显示到测试报告中
  6. 注意:title要是Excel表中的列名
def ddt(cls):
for name, func in list(cls.__dict__.items()):
if hasattr(func, DATA_ATTR):
for i, v in enumerate(getattr(func, DATA_ATTR)):
test_name = mk_test_name(name, getattr(v, "__name__", v), i)
# test_data_docstring = _get_test_data_docstring(func, v) # 原来的
# test_data_docstring = v.title # 数据使用对象来保存,改成这样
test_data_docstring = v["title"] # 数据使用字典来保存,改成这样
if hasattr(func, UNPACK_ATTR):...
else:
add_test(cls, test_name, test_data_docstring, func, v)
delattr(cls, name)
elif hasattr(func, FILE_ATTR):...
return cls

在测试类中使用ddt数据驱动获取数据(这时一个测试用例类只需要一个测试方法就可以)

先准备一个简单的登陆功能函数

def login(name=None, pwd=None):
if name and pwd:
if name == "desire" and pwd == "123456":
return {"code": 0, "msg": "登陆成功"}
else:
return {"code": 1, "msg": "账号密码错误"}
else:
return {"code": 1001, "msg": "不能有空值"}

准备excel测试用例表格

导入ddt模块

from ddt import ddt, data

创建测试用例类,加上ddt装饰器@ddt

读取excel表格ReadExcel

@ddt
class LoginTestCase(unittest.TestCase):
# DATA_DIR:测试用例存放的路径,用os模块进行拼接excel用例表格的路径
excel_path = os.path.join(DATA_DIR, 'cases.xlsx')
login = ReadExcel(excel_path, "login")
# 读取数据(字典形式)
login_datas = login.read_data_dict()
# 读取数据(类的形式)
# login_datas = login.read_data_obj()

创建测试用例方法,加上ddt装饰器@data

@data()里面传的参数要进行拆包,把每次的数据传到方法里case参数
    @data(*login_datas)
def test_login(self, case):
pass
第一步:准备用例数据
①:字典形式取值(使用时需要修改ddt源文件为字典形式)
        # 1.参数
login_data = eval(case["data"])
# 2.预期结果
expected = eval(case["expected"])
# 3.用例序号
case_id = case["case_id"]
②:类形式取值(使用时需要修改ddt源文件为类形式)
        # 1.参数
login_data = eval(case.data)
# 2.预期结果
expected = eval(case.expected)
# 3.用例序号
case_id = case.case_id
第二步:执行功能函数,获取实际结果
        result = login(*login_data)
第三步:通过断言比对预期结果和实际结果
        try:
self.assertEqual(expected, result)
except AssertionError as a:
# 把用例未通过结果写入excel中(调用[ReadExcel](https://www.cnblogs.com/desireyang/p/12059916.html)类中的写入方法)
self.login.write_data(row=case_id + 1, column=5, value="用例未通过")
raise a
else:
self.login.write_data(row=case_id + 1, column=5, value="用例通过")
直接可以运行测试用例类,会把自动化测试结果写入到excel中

Python3-unittest测试框架之DDT数据驱动的更多相关文章

  1. 基于Python的接口自动化-unittest测试框架和ddt数据驱动

    引言 在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条接口测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错,后面的用例就无法执行,还有在运行大量的接口测试用 ...

  2. Python 下的unittest测试框架

    unittest测试框架,直接上图吧: data:数据:主要格式为CSV:读取方式:csv.reade: public:封装的模块:通用的模块单独封装,所需参数设置为变量: testcase:测试用例 ...

  3. python利用unittest测试框架组织测试用例的5种方法

    利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...

  4. Python接口测试实战3(下)- unittest测试框架

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  5. <day002>Selenium基本操作+unittest测试框架

    任务1:Selenium基本操作 from selenium import webdriver # 通用选择 from selenium.webdriver.common.by import By # ...

  6. Python单元测试unittest测试框架

    本文的主题是自动化测试框架的实现,在实现之前,先了解一下关于unittest模块的相关知识: Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回 ...

  7. unittest测试框架详解

    单元测试的定义 1. 什么是单元测试? ​ 单元测试是指,对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,这里的最小可测试单元通常是指函数或者类,一般是开发来做的,按照测试 ...

  8. unittest测试框架

    unittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果. 一.u ...

  9. python实例编写(6)--引入unittest测试框架,构造测试集批量测试(以微信统一管理平台为例)

    ---恢复内容开始--- 一.python单元测试实例介绍 unittest框架又叫PyUnit框架,是python的单元测试框架. 先介绍一个普通的单元测试(不用unittest框架)的实例: 首先 ...

随机推荐

  1. 创建虚拟环境virtualenv的小问题

    在创建完虚拟环境后,settings里面虚拟环境的python编译器不是虚拟的,而是全局的,这个时候. 由于创建的虚拟环境的存储地址默认是在c盘. 自定义虚拟环境的存储地址步骤: 第一步:在配置环境变 ...

  2. SpringBoot 切换国际化

    git:https://github.com/xiaozhuanfeng/demoProj 代码结构: application.properties: spring.messages.basename ...

  3. JS 弹出网页 (不显示地址栏,工具栏) 网页去掉地址栏

    JS 弹出网页 (不显示地址栏,工具栏) 网页去掉地址栏 window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 基本语法: ...

  4. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_5_Entry键值对对象

  5. Spring002--实现读写分离(Mysql实现主从复制)

    Spring AOP实现读写分离(Mysql实现主从复制) 本文来自于博客:http://www.cnblogs.com/bjlhx/p/8297460.html 一.背景 一般应用对数据库而言都是“ ...

  6. python+selenium文本框对象以及按钮对象操作

    文本框对象 from selenium import webdriverfrom time import sleep driver = webdriver.Firefox() # 指定和打开浏览器ur ...

  7. C++期末

    华侨大学 面向对象程序设计(二) 试卷(A) 系别 计算机.软件工程.网络工程08 考试日期 2009年 06月29日 姓名 学号 成绩 一.选择题 (20分,每小题2分) ()关于重载函数在调用时匹 ...

  8. SpringMvc错误:HTTP Status 500 - Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is n

    HTTP Status 500 - Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemExc ...

  9. Spark-Core RDD转换算子-Value型

    1. map(func) 作用: 返回一个新的 RDD, 该 RDD 是由原 RDD 的每个元素经过函数转换后的值而组成. 就是对 RDD 中的数据做转换. 创建一个包含1-10的的 RDD,然后将每 ...

  10. [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)

    [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kru ...