Python自动化测试数据驱动解决数据错误

embedded/2024/12/27 8:22:04/

数据驱动将测试数据和测试行为完全分离,实施数据驱动测试步骤如下:

A、编写测试脚本,脚本需要支持从程序对象、文件或者数据库读入测试数据;

B、将测试脚本使用的测试数据存入程序对象、文件或者数据库等外部介质中;

C、运行脚本过程中,循环调用存储在外部介质中的测试数据;

D、验证所有的测试结果是否符合预期结果;

1、使用unittest和ddt进行数据驱动:

  1. #-*- coding: UTF-8 -*-

  2. from selenium import webdriver

  3. import unittest

  4. import time

  5. import logging

  6. import traceback

  7. import ddt

  8. from selenium.common.exceptions import NoSuchElementException

  9. # 初始化日志对象

  10. logging.basicConfig(

  11. # 日志级别

  12. level = logging.INFO,

  13. # 日志格式

  14. # 时间、代码所在文件名、代码行号、日志级别名字、日志信息

  15. format='%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s %(message)s',

  16. # 打印日志时间

  17. datafomat='%a, %d %b %Y %H: %M: %S',

  18. # 日志文件存放的目录及日志文件名

  19. filename='d:/DataDriverTesting/report.log',

  20. # 打开日志文件的方式

  21. filemode='w'

  22. )

  23. @ddt.ddt

  24. class TestDemo(unittest.TestCase):

  25. def setUp(self):

  26. self.driver = webdriver.Chrome()

  27. @ddt.data(

  28. [u"神奇动物在哪里", u"叶"],

  29. [u"疯狂动物成", u"古德温"],

  30. [u"大话西游之月光宝盒", u"周星驰"]

  31. )

  32. @ddt.unpack

  33. def test_data(self,testdata, expectdata):

  34. self.driver.get("http://www.baidu.com")

  35. self.driver.implicitly_wait(2)

  36. try:

  37. self.driver.find_element_by_id("kw").send_keys(testdata)

  38. self.driver.find_element_by_id("su").click()

  39. time.sleep(3)

  40. self.assertTrue(expectdata in self.driver.page_source)

  41. except NoSuchElementException,e:

  42. logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))

  43. except Exception, e:

  44. logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))

  45. else:

  46. logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))

  47. def tearDown(self):

  48. self.driver.quit()

  49. if __name__ == '__main__':

  50. unittest.main()

备注:

在unittest中结合ddt实现数据驱动,首先是在头部导入ddt模块,其次在测试类前声明使用ddt,然后在测试方法前使用@ddt.data()添加该测试方法需要的测试数据,该函数接收一个可迭代的类型,以此来判断需要执行的次数,多组测试数据间以逗号隔开,如果每组数据存在多个,需要将每组数据存于列表中;最后使用@unpack 进行修饰,对测试数据解包,传参;

2、使用JSon存储数据实现数据驱动测试:

数据存储:test_data_list.json中

  1. [

  2. "邓肯||蒂姆",

  3. "乔丹||迈克尔",

  4. "库里||斯蒂芬",

  5. "杜兰特||凯文",

  6. "詹姆斯||勒布朗"

  7. ]

数据和脚本文件要在同一级目录中:

  1. #-*- coding: UTF-8 -*-

  2. from selenium import webdriver

  3. import HTMLTestRunner

  4. import unittest

  5. import time

  6. import logging

  7. import traceback

  8. import ddt

  9. from selenium.common.exceptions import NoSuchElementException

  10. # 初始化日志对象

  11. logging.basicConfig(

  12. # 日志级别

  13. level = logging.INFO,

  14. # 日志格式

  15. # 时间、代码所在文件名、代码行号、日志级别名字、日志信息

  16. format='%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s %(message)s',

  17. # 打印日志时间

  18. datafomat='%a, %d %b %Y %H: %M: %S',

  19. # 日志文件存放的目录及日志文件名

  20. filename='d:/DataDriverTesting/report.log',

  21. # 打开日志文件的方式

  22. filemode='w'

  23. )

  24. @ddt.ddt

  25. class TestDemo(unittest.TestCase):

  26. def setUp(self):

  27. self.driver = webdriver.Chrome()

  28. @ddt.file_data("test_data_list")

  29. def test_data(self, value):

  30. self.driver.get("http://www.baidu.com")

  31. self.driver.implicitly_wait(2)

  32. testdata, expectdata = tuple(value.strip().split("||"))

  33. self.driver.implicitly_wait(2)

  34. try:

  35. self.driver.find_element_by_id("kw").send_keys(testdata)

  36. self.driver.find_element_by_id("su").click()

  37. time.sleep(3)

  38. self.assertTrue(expectdata in self.driver.page_source)

  39. except NoSuchElementException,e:

  40. logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))

  41. except Exception, e:

  42. logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))

  43. else:

  44. logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))

  45. def tearDown(self):

  46. self.driver.quit()

  47. if __name__ == '__main__':

  48. suite1 = unittest.TestLoader().loadTestsFromTestCase(TestDemo)

  49. suite = unittest.TestSuite(suite1)

  50. filename = "d:\\test.html"

  51. fp = file(filename,'wb')

  52. runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title="Report_title", description='Report_description')

  53. runner.run(suite)

3、使用Excel进行数据驱动测试:

安装Python解析Excel 2007及以上版本的模块:pip install openpyxl==2.3.3;

在Pycharm上新建一个工程,创建文件测试数据.xlsx文件,sheet名为搜索数据表;

序号

搜索词

期望结果

1

邓肯

蒂姆

2

乔丹

迈克尔

3

库里

斯蒂芬

创建ExcelUtil.py文件:

  1. # -*- coding: UTF-8 -*-

  2. from openpyxl import load_workbook

  3. class ParseExcel(object):

  4. def __init__(self, excelPath, sheetName):

  5. # 将要读取的Excel加载到内存

  6. self.wb = load_workbook(excelPath)

  7. # 通过工作表名获取一个工作表对象

  8. self.sheet = self.wb.get_sheet_by_name(sheetName)

  9. # 获取工作表中存在数据的区域的最大行号

  10. self.maxRowNum = self.sheet.max_row

  11. def getDatasFromSheet(self):

  12. # 用于存放从工作表中读取出来的数据

  13. dataList = []

  14. # 因为工作表中的第一行是标题行,所以需要去掉

  15. for line in self.sheet.rows[1:]:

  16. # 遍历工作表中数据区域的每一行,并将每行中每个单元格的数据去除存于列表tmpList中

  17. # 然后再将存放一行数据的列表添加到最终数据列表dataList中

  18. tmpList = []

  19. tmpList.append(line[1].value)

  20. tmpList.append(line[2].value)

  21. dataList.append(tmpList)

  22. return dataList

  23. if __name__ =='__main__':

  24. excelPath = u"测试数据.xlsx"

  25. sheetName = u"搜索数据表"

  26. pe = ParseExcel(excelPath, sheetName)

  27. for i in pe.getDatasFromSheet():

  28. print i[0],i[1]

创建DataDriven.py文件:

  1. # -*- coding: UTF-8 -*-

  2. from selenium import webdriver

  3. import unittest

  4. import time

  5. import logging

  6. import traceback

  7. import ddt

  8. from ExcelUtil import ParseExcel

  9. from selenium.common.exceptions import NoSuchElementException

  10. # 初始化日志对象

  11. logging.basicConfig(

  12. # 日志级别

  13. level = logging.INFO,

  14. # 日志格式

  15. # 时间、代码所在文件名、代码行号、日志级别名字、日志信息

  16. format='%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s %(message)s',

  17. # 打印日志时间

  18. datafomat='%a, %d %b %Y %H: %M: %S',

  19. # 日志文件存放的目录及日志文件名

  20. filename='d:/DataDriverTesting/report.log',

  21. # 打开日志文件的方式

  22. filemode='w'

  23. )

  24. excelPath = u"测试数据.xlsx"

  25. sheetName = u"搜索数据表"

  26. excel = ParseExcel(excelPath, sheetName)

  27. @ddt.ddt

  28. class TestDemo(unittest.TestCase):

  29. def setUp(self):

  30. self.driver = webdriver.Chrome()

  31. @ddt.data(*excel.getDatasFromSheet())

  32. def test_data(self, data):

  33. testdata,expectdata = tuple(data)

  34. self.driver.get("http://www.baidu.com")

  35. print testdata,expectdata

  36. self.driver.implicitly_wait(2)

  37. try:

  38. self.driver.find_element_by_id("kw").send_keys(testdata)

  39. self.driver.find_element_by_id("su").click()

  40. time.sleep(3)

  41. self.assertTrue(expectdata in self.driver.page_source)

  42. except NoSuchElementException,e:

  43. logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))

  44. except Exception, e:

  45. logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))

  46. else:

  47. logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))

  48. def tearDown(self):

  49. self.driver.quit()

  50. if __name__ == '__main__':

  51. unittest.main()

备注:@ddt.data从excel.getDatasFormSheet()方法中接收一个可迭代的数组对象,以此来判断需要执行的次数。如果@ddt.data()中传的是一个方法,方法前需要加型号(*)修饰;

4、使用xml进行数据驱动测试:

在pycharm中创建一个项目,创建TestData.xml文件用于存放测试数据,具体内容如下:

  1. <?xml version="1.0" encoding="utf-8" ?>

  2. <bookList type="technology">

  3. <book>

  4. <name>Selenium WebDriver实战宝典</name>

  5. <author>吴晓华</author>

  6. </book>

  7. <book>

  8. <name>HTTP权威指南</name>

  9. <author>HTTP</author>

  10. </book>

  11. <book>

  12. <name>探索式软件测试</name>

  13. <author>惠特克</author>

  14. </book>

  15. </bookList>

创建XmlUtil.py文件用于解析XML文件,获取测试数据:

  1. # -*- coding: UTF-8 -*-

  2. from xml.etree import ElementTree

  3. class ParseXML(object):

  4. def __init__(self,xmlPath):

  5. self.xmlPath = xmlPath

  6. def getRoot(self):

  7. tree = ElementTree.parse(self.xmlPath)

  8. return tree.getroot()

  9. def findNodeName(self,parentNode,nodeName):

  10. nodes = parentNode.findall(nodeName)

  11. return nodes

  12. def getNodeOfChildText(self, node):

  13. # childrenTextDict = {i.tag: i.text for i in list(node.iter())[1:]}

  14. childrenTextDict = {}

  15. for i in list(node.iter())[1:]:

  16. childrenTextDict[i.tag] = i.text

  17. return childrenTextDict

  18. def getDataFromXml(self):

  19. root = self.getRoot()

  20. books = self.findNodeName(root, "book")

  21. dataList = []

  22. for book in books:

  23. childrenText = self.getNodeOfChildText(book)

  24. dataList.append(childrenText)

  25. return dataList

  26. if __name__=='__main__':

  27. xml = ParseXML(r'TestData')

  28. datas = xml.getDataFromXml()

  29. for i in datas:

  30. print i['name'],i['author']

创建DataDrivenByXML.py文件用于编写数据驱动测试脚本:

  1. # -*- coding: UTF-8 -*-

  2. from selenium import webdriver

  3. import unittest

  4. import time

  5. import os

  6. import logging

  7. import traceback

  8. import ddt

  9. from XmlUtil import ParseXML

  10. from selenium.common.exceptions import NoSuchElementException

  11. # 初始化日志对象

  12. logging.basicConfig(

  13. # 日志级别

  14. level = logging.INFO,

  15. # 日志格式

  16. # 时间、代码所在文件名、代码行号、日志级别名字、日志信息

  17. format='%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s %(message)s',

  18. # 打印日志时间

  19. datafomat='%a, %d %b %Y %H: %M: %S',

  20. # 日志文件存放的目录及日志文件名

  21. filename='d:/DataDriverTesting/report.log',

  22. # 打开日志文件的方式

  23. filemode='w'

  24. )

  25. '''

  26. # 获取当前文件所在父目录的绝对路径

  27. currentPath = os.path.dirname(os.path.abspath(__file__))

  28. # 获取数据文件的绝对路径

  29. dataFilePath = os.path.join(currentPath, "TestData.xml")

  30. print dataFilePath

  31. '''

  32. # 创建ParseXML实例对象

  33. xml = ParseXML("TestData")

  34. @ddt.ddt

  35. class TestDemo(unittest.TestCase):

  36. def setUp(self):

  37. self.driver = webdriver.Chrome()

  38. @ddt.data(* xml.getDataFromXml())

  39. def test_data(self, data):

  40. testdata, expectdata = data['name'], data['author']

  41. self.driver.get("http://www.baidu.com")

  42. print testdata,expectdata

  43. self.driver.implicitly_wait(2)

  44. try:

  45. self.driver.find_element_by_id("kw").send_keys(testdata)

  46. self.driver.find_element_by_id("su").click()

  47. time.sleep(3)

  48. self.assertTrue(expectdata in self.driver.page_source)

  49. except NoSuchElementException,e:

  50. logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))

  51. except Exception, e:

  52. logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))

  53. else:

  54. logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))

  55. def tearDown(self):

  56. self.driver.quit()

  57. if __name__ == '__main__':

  58. unittest.main()


http://www.ppmy.cn/embedded/149128.html

相关文章

减速机润滑油的选用原则

减速机在投入运行前必须加入适当粘度的润滑油&#xff0c;须使齿轮间摩擦减小&#xff0c;遇高负荷及冲击负荷时&#xff0c;减速机才能充分发挥其机能。那么&#xff0c;应该如何选择减速机的润滑油呢&#xff1f; 1、粘度选择&#xff1a;粘度是齿轮油的一个重要理化指标&…

图书管理系统技术文档

图书管理系统技术文档 一、项目概述 随着图书馆规模的不断扩大以及读者借阅需求的日益增长&#xff0c;传统的人工管理图书方式效率低下&#xff0c;易出错。为提高图书管理效率&#xff0c;优化读者借阅体验&#xff0c;特开发此图书管理系统。本系统旨在实现图书信息的高效…

AWS、Google Cloud Platform (GCP)、Microsoft Azure、Linode和 桔子数据 的 价格对比

要对比 AWS、Google Cloud Platform (GCP)、Microsoft Azure、Linode 和 桔子数据 的 价格&#xff0c;我们需要先了解每个平台的定价模型、服务类型以及不同服务之间的价格差异。以下是根据各个平台常见服务&#xff08;如计算实例、存储、数据传输等&#xff09;做的一个 简化…

【机器学习案列】车牌自动识别系统:基于YOLO11的高效实现

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

基于单片机的程控电源显示控制电路设计

摘要 : 介绍了基于单片机程控电源显示控制电路的硬件设计和软件实现 , 该设计可以实现程控电源的输出显示和手动控制功能。 实践验证 , 该设计具有很好的使用效果和工程价值 。 关键词 : 程控电源 ; 显示控制 ; 单片机 0 引言 程控电源广泛地应用在工业控制和科学研究的…

【Linux/踩坑】Linux中启动eclipse或HDFS因JAVA_HOME设置报错

Linux中启动eclipse或hadoop因JAVA_HOME设置报错 eclipseHadoop eclipse 错误提示&#xff1a; A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. No Java virtual machine was found after searching the follo…

centos系统如何安装kubectl和部署kube-apiserver

1.使用 yum 安装&#xff08;推荐&#xff09; 添加 Kubernetes 软件源&#xff1a; 首先&#xff0c;你需要添加 Kubernetes 的官方 YUM 软件源。这可以通过下载并安装 kubernetes.repo 文件来实现。 shell cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [k…

【Python高级365】python静态Web服务器

[[340-python网络编程]][[330-HTML基础&#xff08;前端&#xff09;]][[331-CSS基础&#xff08;前端&#xff09;]] Web开发 我们在使用网页的时候&#xff0c;不是服务端和客户端之间互相发信息&#xff0c;而是通过浏览器向服务器通信&#xff0c;交互的数据不仅仅有文字…