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. 合并流SequenceInputStream

    合并流 SequenceInputStream概述 SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流,因次,该流也称为合并流. SequenceInputStrea ...

  2. 42 grant与flush privileges

    42 grant与flush privileges 在mysql里, grant是给用户赋权的,一些文档中经常提到在grant执行后,马上执行一个flush privileges,才能使赋权语句生效, ...

  3. 从新向你学习javase(第一天)

    1:阐述JDK和JRE之间区别 jdk(工具)>jre(运行环境)>jvm(虚拟机) 2: 能够使用常见的DOS命令 d:(进入D盘下),cd +路径(进入到当前路径),cd..(返回上一 ...

  4. vue --》watch 深度监听的优化。

    话不多说,直接上代码,注释很清楚 <template> <div> <input type="text" v-model="value&qu ...

  5. 解决MySQL报错:Access denied for user ‘root’@‘localhost’(using password: YES)

    Windows 10(mysql5.1) 修改配置文件 找到MySQL安装目录下配置文件my.ini(在我的win10环境下,其路径为C:\ProgramData\MySQL\MySQL Server ...

  6. jsp:include 通过变量作为路径动态引入

    语法:<jsp:include page="<%=整体是个变量%>" flush="true"/> 示例: <%@ page la ...

  7. js如何获取到select的option值???

    1.获得选项option的值 var obj = document.getElementByIdx_x(”testSelect”); //定位id var index = obj.selectedIn ...

  8. 第一个progressive web application,发车!

    progressive web application是谷歌推出的一种渐进式web应用,通过利用service-worker等来达到类似于原生应用,而且在chrome浏览器还可以添加到主页,完全就和一 ...

  9. jquery遍历table中每个td的值

    废话不说直接上: <table style="border:1px solid #ccc">        <tr>            <td&g ...

  10. NodeJS、npm安装步骤和配置(windows版本)

    https://jingyan.baidu.com/article/48b37f8dd141b41a646488bc.html 上面这个链接很详细了,怕它没了自己记一遍.我的简洁一点. 1. 打开no ...