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

发布于:2025-02-11 ⋅ 阅读:(22) ⋅ 点赞:(0)

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

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()


网站公告

今日签到

点亮在社区的每一天
去签到