自动化测试之数据驱动DDT详细篇

2023-10-07 16:59

本文主要是介绍自动化测试之数据驱动DDT详细篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

  你是否有过这种感受,在做自动化测试过程中,不论是API 自动化测试还是UI 自动化测试,我们写测试脚本有很大一部分时间都是在准备数据(setUp)、清理数据(tearDown)。因为数据是做自动化测试的至关重要的一个环节。如此看来数据驱动真的十分重要。接下来分享的内容是:Unittest测试框架中常用的数据驱动框架:DDT 。

数据驱动

1、数据驱动是什么?

      数据驱动,指在自动化测试中处理测试数据的方式。

  通常测试数据与功能函数分离,存储在功能函数的外部位置。在自动化测试运行时,数据驱动框架会读取数据源中的数据,把数据作为参数传递到功能函数中,并会根据数据的条数多次运行同一个功能函数。

  数据驱动的数据源可以是函数外的数据集合、CSV 文件、Excel 表格、TXT 文件,以及数据库等。

2、数据驱动的优点?

(1)、减少重复代码
通过以下实例来看下数据驱动是如何减少重复代码的。

如果不使用数据驱动时,并且同一个功能函数存在多个测试数据,你只能多次调用这个功能函数;另外一旦某一个测试数据有更改/删除,你需要在函数调用里去更改相应的测试数据,非常不方便。

如果使用测试驱动时,你的代码可能会是这样的:

# origin_data指向一个文件,这个文件里存储有你所有的测试数据。
origin_data = './tests/data/testdata.csv'# dataDrivenDecorator是你实现数据驱动的装饰器@dataDrivenDecorator(origin_data)
def test_ddt(user, pwd, num):# 实际函数逻辑pass

这种情况下, 你无须进行多次调用,而且当你的测试数据发生改变时, 你仅需要更改数据源文件的数据就可以了。

(2)、数据所属的测试用例失败,不会影响到其他测试数据对应的测试用例
通过以下实例来看下是怎么不会影响到其他测试数据对应的测试用例的。


如果不使用数据驱动之前,假设有以下一个函数:

test_data = [0, 1, 0, 1]
def test_001(data):for x in data:assert x > 0test_ddt(test_data)

由执行结果可以看出,因为test_data 的第一个值是0, 它不大于0。所以断言失败,所有 test_data测试数据集中0后面的测试数据都没有执行。

如果有了数据驱动,则数据驱动会把这一个测试按照测试数据分解成多个测试,所以第一个测试数据失败也不会影响到后面的测试结果。

3、Python 中使用广泛的数据驱动框架有哪些?

  • DDT(Data-Driven Tests),通常结合Unittest 使用

  • parameterized,是Pytest 实现数据驱动的常用框架

DDT 包含哪些装饰器

1 个类装饰器

  ddt 这个类装饰器必须装饰在TestCase 的子类上,TestCase 是Unittest 框架中的一个基类,它实现了Test Runner 驱动测试运行所需的接口(interface)。

2 个方法装饰器

  分别是:data 和 file_data。
  data 装饰器,直接提供测试数据;
  file_data 装饰器则从 JSON 或 YAML 文件加载测试数据。

DDT 的使用步骤如下:

  • 使用@ddt 装饰你的测试类;

  • 使用@data 或者@file_data 装饰你需要数据驱动的测试方法;

  • 如一组测试数据有多个参数,则需unpack,使用@unpack 装饰你的测试方法。

Python 安装DDT :

安装命令:pip install ddt或python -m pip install ddt

(1)、ddt 直接提供数据

from ddt import ddt, data, file_data, unpack
from selenium import webdriver
import unittest
import time# ddt一定是装饰在TestCase的子类上@ddt
class Baidu(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()self.driver.implicitly_wait(30)self.base_url = "http://www.baidu.com/"# data表示测试数据是直接提供的。# unpack表示,对于每一组数据,如果它的值是list或者tuple,那么就分拆成独立的参数。@data(['Testing', 'Testing'], ['hello_world.com','Testing'])@unpackdef test_baidu_search(self, search_string, expect_string):driver = self.driverdriver.get(self.base_url + "/")driver.find_element_by_id("kw").send_keys(search_string)driver.find_element_by_id("su").click()time.sleep(2)search_results = driver.find_element_by_xpath('//*[@id="1"]/h3/a').get_attribute('innerHTML')print(search_results)self.assertEqual(expect_string in search_results, True)def tearDown(self):self.driver.quit()if __name__ == "__main__":unittest.main(verbosity=2)

在这个例子中,我直接使用了@data 装饰器。在这个装饰器中,我给出了测试的2 组数据,分别是 ['Testing', 'Testing'] 和 ['hello_world.com', 'Testing'];然后我使用 @unpack 装饰器把每一组数据的数据unpack 成一个个的参数传给我的函数 test_baidu_search。

当你运行上面代码,从结果中会发现虽然我们只有一个测试用例test_baidu_search。但在生成的测试报告里,显示“Run 2 tests in XX”,也就是test_baidu_search 运行了 2 次,这就是DDT 在起作用。

这是多组参数,每组多个数据的情况,如果每组仅有一个数据呢?你仅需要更改如下:

# 如仅有一个参数,那么直接在data里写参数就好。
# 仅有一个参数的情况下,无须再用@unpack装饰测试方法。
@data('data1', 'data2')

(2)、ddt 使用函数提供数据
  ddt 直接提供数据,除去上述的直接把数据写在@data() 的参数中外,还有一个情况,即数据先从函数获取,然后再写入@data() 的参数中。

from ddt import ddt, data, file_data, unpack
from selenium import webdriver
import unittest
import timedef get_test_data():# 这里写你获取测试数据的业务逻辑。# 获取到后,把数据返回即可。# 注意,如果多组数据,需要返回类似([数据1-参数1, 数据1-参数2],[数据2-参数1, 数据2-参数2])这样的格式,方便ddt.data()解析# 解析后返回的数据格式如下:results = (['Testing', 'Testing'], ['hello_world.com', 'Testing'])return results# ddt一定是装饰在TestCase的子类上@ddt
class Baidu(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()self.driver.implicitly_wait(30)self.base_url = "http://www.baidu.com/"# data表示data是直接提供的。注意data里的参数我写了函数get_test_data()的返回值,并且以*为前缀,代表返回的是可变参数。# unpack表示,对于每一组数据,如果它的值是list或者tuple,那么就分拆成独立的参数。@data(*get_test_data())@unpackdef test_baidu_search(self, search_string, expect_string):driver = self.driverdriver.get(self.base_url + "/")driver.find_element_by_id("kw").send_keys(search_string)driver.find_element_by_id("su").click()time.sleep(2)search_results = driver.find_element_by_xpath('//*[@id="1"]/h3/a').get_attribute('innerHTML')print(search_results)self.assertEqual(expect_string in search_results, True)def tearDown(self):self.driver.quit()if __name__ == "__main__":unittest.main(verbosity=2)

在上述示例中,我创建了一个函数get_test_data() 用于获取我的测试数据。这个函数可以带参数,也可以不带参数,具体需要根据你的业务逻辑来。

注意:get_test_data() 的返回值,一定需要遵守ddt.data() 可接受的数据格式。

即:一组数据,每个数据为单个的值;多组数据,每组数据为一个列表或者一个字典。

(3)、ddt 使用文件提供数据:其他格式数据文件
  因为 ddt 默认只支持 JSON 和 YAML 格式的数据。但是我想使用其他数据格式怎么办?

  常用的方式有如下两种:

  • 先读取其他格式的文件(例如 Excel 格式),然后创建 ddt 支持的 JSON 或者 YAML 文件,最后把获取到的数据写入这个文件,再使用 @file_data() 即可;

  • 创建一个函数,在函数中读取其他格式的文件并获取数据,将数据直接返回为 @ddt.data() 支持的格式调用即可。

这篇关于自动化测试之数据驱动DDT详细篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/159128

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在