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


Posted in Python onAugust 01, 2019

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

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

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

可以通过python自带的pip命令进行下载并安装:pip install ddt . 更多关于ddt的信息可以参考:

https://pypi.org/project/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标识符,生成名称为更有意义的测试方法。结果如下:

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

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

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

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

通过CSV获取数据

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

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

接下来,先要创建一个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)来作为测试数据(代替之前的测试数据)。其中数据如下:

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

接下来,先要创建一个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查询来获取测试数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python聊天程序实例代码分享
Nov 18 Python
python中的多重继承实例讲解
Sep 28 Python
Python中title()方法的使用简介
May 20 Python
Python中正则表达式详解
May 17 Python
详解Python import方法引入模块的实例
Aug 02 Python
Python探索之pLSA实现代码
Oct 25 Python
使用PM2+nginx部署python项目的方法示例
Nov 07 Python
Python+OpenCV实现旋转文本校正方式
Jan 09 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
Feb 11 Python
python实现udp传输图片功能
Mar 20 Python
对python pandas中 inplace 参数的理解
Jun 27 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 Python
Python 一键获取百度网盘提取码的方法
Aug 01 #Python
Django中的静态文件管理过程解析
Aug 01 #Python
pycharm 批量修改变量名称的方法
Aug 01 #Python
python腾讯语音合成实现过程解析
Aug 01 #Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 #Python
Python生命游戏实现原理及过程解析(附源代码)
Aug 01 #Python
Python中list的交、并、差集获取方法示例
Aug 01 #Python
You might like
PHP下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
javascript将非数值转换为数值
2018/09/13 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
2018/12/11 jQuery
js前端面试之同步与异步问题详解
2019/04/03 Javascript
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
使用Python的Scrapy框架编写web爬虫的简单示例
2015/04/17 Python
Python中的random()方法的使用介绍
2015/05/15 Python
Python与R语言的简要对比
2017/11/14 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
Django实现前台上传并显示图片功能
2020/05/29 Python
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
怎样从/向数据文件读/写结构
2014/11/23 面试题
2014春晚主持词
2014/03/25 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书
Python中文纠错的简单实现
2021/07/07 Python
MySQL外键约束(FOREIGN KEY)案例讲解
2021/08/23 MySQL
Windows11 Insider Preview Build 25206今日发布 更新内容汇总
2022/09/23 数码科技