news 2026/9/3 2:09:53

Python+Selenium之数据驱动测试的实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python+Selenium之数据驱动测试的实现

🍅点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快

数据驱动模式的测试好处相比普通模式的测试就显而易见了吧!使用数据驱动的模式,可以根据业务分解测试数据,只需定义变量,使用外部或者自定义的数据使其参数化,从而避免了使用之前测试脚本中固定的数据。可以将测试脚本与测试数据分离,使得测试脚本在不同数据集合下高度复用。不仅可以增加复杂条件场景的测试覆盖,还可以极大减少测试脚本的编写与维护工作。

下面将使用Python下的数据驱动模式(ddt)库,结合unittest库以数据驱动模式创建百度搜索的测试。

ddt库包含一组类和方法用于实现数据驱动测试。可以将测试中的变量进行参数化。

可以通过python自带的pip命令进行下载并安装:pip install ddt .

一个简单的数据驱动测试

为了创建数据驱动测试,需要在测试类上使用@ddt装饰符,在测试方法上使用@data装饰符。@data装饰符把参数当作测试数据,参数可以是单个值、列表、元组、字典。对于列表,需要用@unpack装饰符把元组和列表解析成多个参数。

下面实现百度搜索测试,传入搜索关键词和期望结果,代码如下:

import unittest from selenium import webdriver from ddt import ddt, data, unpack @ddt class SearchDDT(unittest.TestCase): '''docstring for SearchDDT''' def setUp(self): self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.driver.maximize_window() self.driver.get("https://www.baidu.com") # specify test data using @data decorator @data(('python', 'PyPI')) @unpack def test_search(self, search_value, expected_result): search_text = self.driver.find_element_by_id('kw') search_text.clear() search_text.send_keys(search_value) search_button = self.driver.find_element_by_id('su') search_button.click() tag = self.driver.find_element_by_link_text("PyPI").text self.assertEqual(expected_result, tag) def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main(verbosity=2)

在test_search()方法中,search_value与expected_result两个参数用来接收元组解析的数据。当运行脚本时,ddt把测试数据转换为有效的python标识符,生成名称为更有意义的测试方法。结果如下:

使用外部数据的数据驱动测试

如果外部已经存在了需要的测试数据,如一个文本文件、电子表格或者数据库,那也可以用ddt来直接获取数据并传入测试方法进行测试。

下面将借助外部的CSV(逗号分隔值)文件和EXCLE表格数据来实现ddt。

通过CSV获取数据

同上在@data装饰符使用解析外部的CSV(testdata.csv)来作为测试数据(代替之前的测试数据)。其中数据如下:

接下来,先要创建一个get_data()方法,其中包括路径(这里默认使用当前路径)、CSV文件名。调用CSV库去读取文件并返回一行数据。再使用@ddt及@data实现外部数据驱动测试百度搜索,代码如下:

import csv, unittest from selenium import webdriver from ddt import ddt, data, unpack def get_data(file_name): # create an empty list to store rows rows = [] # open the CSV file data_file = open(file_name, "r") # create a CSV Reader from CSV file reader = csv.reader(data_file) # skip the headers next(reader, None) # add rows from reader to list for row in reader: rows.append(row) return rows @ddt class SearchCSVDDT(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.driver.maximize_window() self.driver.get("https://www.baidu.com") # get test data from specified csv file by using the get_data funcion @data(*get_data('testdata.csv')) @unpack def test_search(self, search_value, expected_result): search_text = self.driver.find_element_by_id('kw') search_text.clear() search_text.send_keys(search_value) search_button = self.driver.find_element_by_id('su') search_button.click() tag = self.driver.find_element_by_link_text("PyPI").text self.assertEqual(expected_result, tag) def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main(verbosity=2)

测试执行时,@data将调用get_data()方法读取外部数据文件,并将数据逐行返回给@data。执行的结果也同上~

通过Excel获取数据

测试中经常用Excle存放测试数据,同上在也可以使用@data装饰符来解析外部的CSV(testdata.csv)来作为测试数据(代替之前的测试数据)。其中数据如下:

接下来,先要创建一个get_data()方法,其中包括路径(这里默认使用当前路径)、EXCEL文件名。调用xlrd库去读取文件并返回数据。再使用@ddt及@data实现外部数据驱动测试百度搜索,代码如下:

import xlrd, unittest from selenium import webdriver from ddt import ddt, data, unpack def get_data(file_name): # create an empty list to store rows rows = [] # open the CSV file book = xlrd.open_workbook(file_name) # get the frist sheet sheet = book.sheet_by_index(0) # iterate through the sheet and get data from rows in list for row_idx in range(1, sheet.nrows): #iterate 1 to maxrows rows.append(list(sheet.row_values(row_idx, 0, sheet.ncols))) return rows @ddt class SearchEXCLEDDT(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.implicitly_wait(30) self.driver.maximize_window() self.driver.get("https://www.baidu.com") # get test data from specified excle spreadsheet by using the get_data funcion @data(*get_data('TestData.xlsx')) @unpack def test_search(self, search_value, expected_result): search_text = self.driver.find_element_by_id('kw') search_text.clear() search_text.send_keys(search_value) search_button = self.driver.find_element_by_id('su') search_button.click() tag = self.driver.find_element_by_link_text("PyPI").text self.assertEqual(expected_result, tag) def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main(verbosity=2)

与上面读取CVS文件一样,测试执行时,@data将调用get_data()方法读取外部数据文件,并将数据逐行返回给@data。执行的结果也同上~

如果想从数据库的库表中获取数据,同样也需要一个get_data()方法,并且通过DB相关的库来连接数据库、SQL查询来获取测试数据。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 17:17:44

基于STC89C52单片机的智能窗帘控制系统设计

基于STC89C52单片机的智能窗帘控制系统设计 第一章 绪论 传统窗帘依赖人工手动开合,操作繁琐且无法根据环境变化自动调节,难以满足现代家居对便捷性、舒适性的需求。STC89C52单片机作为低成本、易上手的8位微控制器,适配普通家庭智能化改造的…

作者头像 李华
网站建设 2026/9/2 22:49:43

基于STM32单片机的智能家居设计

基于STM32单片机的智能家居设计 第一章 绪论 传统家居设备控制依赖人工操作,存在交互繁琐、能源浪费、缺乏环境自适应能力等问题,难以满足现代家庭对便捷、节能、智能的居住需求。STM32单片机凭借高性能、低功耗、丰富外设接口的优势,成为智能…

作者头像 李华
网站建设 2026/9/2 0:22:22

附录A:AMDGPU SVM 属性类型

概述 kfd_ioctl_svm_attr_type 枚举定义了 SVM(Shared Virtual Memory)的所有属性类型,用于控制 GPU 对共享虚拟内存的访问行为、数据位置偏好、以及一致性模式。 enum kfd_ioctl_svm_attr_type {KFD_IOCTL_SVM_ATTR_PREFERRED_LOC, // …

作者头像 李华
网站建设 2026/9/3 0:01:00

大模型技术落地全景图:规划、实现、应用与风险管理

本文系统介绍了大模型的概念与发展历程,详细解答了企业应用大模型的12个核心问题,涵盖建设规划、技术实现路径(RAG、AI Agent等)、行业应用现状、市场格局及风险管理,为企业提供从战略规划到落地实施的全方位指导,帮助企业在AI时代…

作者头像 李华
网站建设 2026/9/2 23:17:19

开题报告 springboot和vue-旅游信息系统

目录系统概述技术选型核心功能模块系统特色应用场景项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统概述 SpringBoot与Vue结合的旅游信息系统是一个前后端分离的现代化Web应用,旨在为用户提…

作者头像 李华