当前位置: 首页 > news >正文

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查询来获取测试数据。

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

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

http://www.jsqmd.com/news/345615/

相关文章:

  • 2026年【上海离婚律所电话】联系电话推荐:五大律所详情与指引 - 十大品牌推荐
  • 2026年2月四川油气田环境治理/油气田生态修复/油气田废水治理/工业固废垃圾清运/环境治理清洁服务商竞争格局深度分析报告 - 2026年企业推荐榜
  • 开题卡住了?一键生成论文工具 千笔写作工具 VS 锐智 AI
  • 2026年建设工程诉讼仲裁优质律师推荐,杜和浩律师服务覆盖全国 - 工业推荐榜
  • 2026年天津离婚财产纠纷律师联系电话推荐:精选推荐与使用指南 - 品牌推荐
  • MySQL Database Replication | Master-to-Slave MySQL主从架构与读写分离部署
  • nginx 添加WebSocket
  • 2026年国产超声波布料切割设备排名,好用的品牌厂商推荐 - 工业设备
  • 参考文献崩了?千笔·专业学术智能体,专科生论文写作神器
  • 2026年航空地面电源厂家哪家好?变频电源与中频静变电源选型指南 - 深度智识库
  • 2026年环境试验设备实力厂家解析:高低温/恒温恒湿/快速温变/冷热冲击/盐雾试验箱等选购指南 - 博客万
  • 【Linux驱动开发】Linux SDIO 底层原理与实现细节详解 - 实践
  • YOLO26改进 - 下采样 _ 轻量化突破:ADown 下采样让 YOLO26 参量减、精度升
  • 惊艳业界!W25Q80DVSSIG:重新定义嵌入式存储的8Mbit串行闪存解决方案
  • 2026儿童羽绒服封神榜!宝妈闭眼入的三大品牌,保暖颜值双在线 - 品牌测评鉴赏家
  • 柔性协同智创高效——苏州光兆协作机械手,赋能制造业柔性升级
  • YOLO26改进 - 注意力机制 ParNet并行子网络:多分支协同优化特征表达,增强模型判别能
  • 瑞祥商联卡怎么提现到微信?3种热门方法教学与操作提示 - 京回收小程序
  • 2026年天津继承纠纷律师联系电话推荐:专业团队与联系指引 - 品牌推荐
  • AO4406-ASEMI以高效稳定赋能全域电子设备
  • YOLO26改进 - 注意力机制 _ CGAFusion (Content-Guided Attention Fusion) 抑制噪声提升跨模态检测精度与鲁棒性_
  • 基于STC89C51单片机控制智能风扇自动跟踪控制系统设计
  • 力扣解题-两数之和
  • YOLO26改进 - 注意力机制 _ Deformable-LKA 可变形大核注意力:自适应采样网格优化特征捕捉,提升不规则目标感知
  • 2026年河南地区灌装机源头厂家推荐,口碑好的品牌都在这 - 工业品网
  • BXMya DO630 3BHT300007R1 数字输出模块
  • 基于STC89C52单片机的智能窗帘控制系统设计
  • YOLO26改进 - 注意力机制 _ Dual-ViT 双视觉变换器:双路径建模协同全局语义与局部特征,增强多尺度感知
  • YOLO26改进 - 注意力机制 _ ELA(Efficient Local Attention)高效局部注意力:突破降维限制精准定位,增强小目标感知
  • 实战指南:基于 Apache Doris 构建企业级 RAG(检索增强生成)应用