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中函数的多种格式和使用实例及小技巧
Apr 13 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
python获取程序执行文件路径的方法(推荐)
Apr 26 Python
Python中py文件引用另一个py文件变量的方法
Apr 29 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
Jun 14 Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
Jun 05 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
python网络爬虫 Scrapy中selenium用法详解
Sep 28 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数据库操作面向对象的优点
2006/10/09 PHP
php下的权限算法的实现
2007/04/28 PHP
php检测url是否存在的方法
2015/04/14 PHP
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
2016/05/10 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
初探nodeJS
2017/01/24 NodeJs
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
python开发利器之ulipad的使用实践
2017/03/16 Python
python使用opencv读取图片的实例
2017/08/17 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
软件测试工程师结构化面试题库
2016/11/23 面试题
毕业生机械建模求职信
2013/10/14 职场文书
实习教师自我鉴定
2013/12/12 职场文书
大学毕业生求职自荐信
2014/02/20 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
设计专业自荐信
2014/06/19 职场文书
商务代表岗位职责
2015/02/15 职场文书
辩论会主持词
2015/07/03 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS
mysql 生成连续日期及变量赋值
2022/03/20 MySQL
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS