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

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

下面将使用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标识符,生成名称为更有意义的测试方法。结果如下:

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

如果外部已经存在了需要的测试数据,如一个文本文件、电子表格或者数据库,那也可以用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查询来获取测试数据。

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

(0)

相关推荐

  • selenium+python自动化测试之多窗口切换

    在很多页面上都有可点击的链接,点击这些链接会打开一个新的窗口,这时如果要在新打开的窗口中操作页面,就需要先切换到新窗口中,如果不进行切换操作,还是操作的上一个页面窗口 浏览器窗口的切换通过句柄(handle)来操作,每个窗口都有一个句柄,代表当前窗口,需要操作哪个页面的窗口,切换到窗口对应的句柄.通过driver.switch_to.window(handle)来切换句柄 在新的窗口中打开页面 打开百度首页,点击右上角的新闻链接,默认会在当前窗口中打开.现在通过修改点击元素的属性,让新打开的页面

  • selenium+python自动化测试之环境搭建

    最近由于公司有一个向谷歌网站上传文件的需求,需要进行web的自动化测试,选择了selenium这个自动化测试框架,以前没有接触过这门技术,所以研究了一下,使用python来实现自动化脚本,从环境搭建到实现脚本运行. selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等.支持自动录制动作和自动

  • Selenium(Python web测试工具)基本用法详解

    本文实例讲述了Selenium基本用法.分享给大家供大家参考,具体如下: Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等.这个工具的主要功能包括:测试与浏览器的兼容性--测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上.测试系统功能--创建回归测试检验软件功能和用户需求.

  • selenium+python自动化测试之使用webdriver操作浏览器的方法

    WebDriver简介 selenium从2.0开始集成了webdriver的API,提供了更简单,更简洁的编程接口.selenium webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持进行web-app测试.从这篇博客开始,将学习使用如何使用python调用webdriver框架对浏览器进行一系列的操作 打开浏览器 在selenium+python自动化测试(一)–环境搭建中,运行了一个测试脚本,脚本内容如下: from selenium import webdri

  • 关于Selenium的UI自动化测试屏幕截图功能实例代码

    UI自动化测试执行过程中,当遇到检查失败的情况,往往会发现打印的log并不能有效地帮助我们定位问题.我们需要失败时刻的屏幕截图来重现当时的失败场景,进而排查出错原因. 基于这种需求可以使用Selenium的屏幕截图功能. 实现代码如下: import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.time.DateU

  • selenium+python自动化测试之鼠标和键盘事件

    前面的例子中,点击事件都是通过click()方法实现鼠标的点击事件.其实在WebDriver中,提供了许多鼠标操作的方法,这些操作方法都封装在ActionChains类中,包括鼠标右击.双击.悬停和鼠标拖动等功能. ActionChains类提供的鼠标操作事件 context_click():点击鼠标右键 double_click():双击鼠标 drag_and_drop():拖动鼠标 move_to_element():鼠标悬停 鼠标悬停 页面上有些下拉菜单,在鼠标放到元素上以后,下面的菜单才

  • 详解Python多线程Selenium跨浏览器测试

    前言 在web测试中,不可避免的一个测试就是浏览器兼容性测试,在没有自动化测试前,我们总是苦逼的在一台或多台机器上安装N种浏览器,然后手工在不同的浏览器上验证主业务流程和关键功能模块功能,以检测不同浏览器或不同版本浏览器上,我们的web应用是否可以正常工作. 下面我们看看怎么利用python selenium进行自动化的跨浏览器测试. 什么是跨浏览器测试 跨浏览器测试是功能测试的一个分支,用以验证web应用能在不同的浏览器上正常工作. 为什么需要跨浏览器测试 通常情况下,我们都期望web类应用

  • selenium python 实现基本自动化测试的示例代码

    安装selenium 打开命令控制符输入:pip install -U selenium 火狐浏览器安装firebug:www.firebug.com,调试所有网站语言,调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件,实现简单的浏览器操 作的录制与回放功能,IDE 录制的脚本可以可以转换成多种语言,从而帮助我们快速的开发脚本,下载地址:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/ 如何使用

  • python3+selenium自动化测试框架详解

    背景 为了更好的发展自身的测试技能,应对测试行业以及互联网行业的迭代变化.自学python以及自动化测试. 虽然在2017年已经开始接触了selenium,期间是断断续续执行自动化测试,因为还有其他测试任务,培训任务要执行- 前期建议大家能够学习python基本语法(python基础教程) 任务 搭建自动化测试框架,并能有效方便的进行测试,维护成本也要考虑其中. 过程 我的自动化框架可能不成熟,因为是自学的.请多包涵.也请大佬指导~ common 包含:基本的公共方法类,比如HTML报告.Log

  • selenium+python自动化测试之页面元素定位

    上一篇博客selenium+python自动化测试(二)–使用webdriver操作浏览器讲解了使用webdriver操作浏览器的各种方法,可以实现对浏览器进行操作了,接下来就是对浏览器页面中的元素进行操作,操作页面元素,首先要找到操作的元素,对元素进行定位 查看页面源码 要定位页面元素,需要找到页面的源码,IE浏览器中,打开页面后,在页面上点击鼠标右键,会有"查看源代码"的选项,点击后就会进入页面源码页面,在这里就可以找到页面的所有元素 使用Chrome浏览器打开页面后,在浏览器的地

随机推荐