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

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

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

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

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

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

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

#-*- coding: UTF-8 -*-
from selenium import webdriver
import unittest
import time
import logging
import traceback
import ddt
from selenium.common.exceptions import NoSuchElementException# 初始化日志对象
logging.basicConfig(# 日志级别level = logging.INFO,# 日志格式# 时间、代码所在文件名、代码行号、日志级别名字、日志信息format='%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s %(message)s',# 打印日志时间datafomat='%a, %d %b %Y %H: %M: %S',# 日志文件存放的目录及日志文件名filename='d:/DataDriverTesting/report.log',# 打开日志文件的方式filemode='w'
)
@ddt.ddt
class TestDemo(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()@ddt.data([u"神奇动物在哪里", u"叶"],[u"疯狂动物成", u"古德温"],[u"大话西游之月光宝盒", u"周星驰"])@ddt.unpackdef test_data(self,testdata, expectdata):self.driver.get("http://www.baidu.com")self.driver.implicitly_wait(2)try:self.driver.find_element_by_id("kw").send_keys(testdata)self.driver.find_element_by_id("su").click()time.sleep(3)self.assertTrue(expectdata in self.driver.page_source)except NoSuchElementException,e:logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))except Exception, e:logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))else:logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))def tearDown(self):self.driver.quit()if __name__ == '__main__':unittest.main()

备注:

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

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

数据存储:test_data_list.json中

["邓肯||蒂姆","乔丹||迈克尔","库里||斯蒂芬","杜兰特||凯文","詹姆斯||勒布朗"
]

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

#-*- coding: UTF-8 -*-
from selenium import webdriver
import HTMLTestRunner
import unittest
import time
import logging
import traceback
import ddt
from selenium.common.exceptions import NoSuchElementException# 初始化日志对象
logging.basicConfig(# 日志级别level = logging.INFO,# 日志格式# 时间、代码所在文件名、代码行号、日志级别名字、日志信息format='%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s %(message)s',# 打印日志时间datafomat='%a, %d %b %Y %H: %M: %S',# 日志文件存放的目录及日志文件名filename='d:/DataDriverTesting/report.log',# 打开日志文件的方式filemode='w'
)
@ddt.ddt
class TestDemo(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()@ddt.file_data("test_data_list")def test_data(self, value):self.driver.get("http://www.baidu.com")self.driver.implicitly_wait(2)testdata, expectdata = tuple(value.strip().split("||"))self.driver.implicitly_wait(2)try:self.driver.find_element_by_id("kw").send_keys(testdata)self.driver.find_element_by_id("su").click()time.sleep(3)self.assertTrue(expectdata in self.driver.page_source)except NoSuchElementException,e:logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))except Exception, e:logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))else:logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))def tearDown(self):self.driver.quit()if __name__ == '__main__':suite1 = unittest.TestLoader().loadTestsFromTestCase(TestDemo)suite = unittest.TestSuite(suite1)filename = "d:\\test.html"fp = file(filename,'wb')runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title="Report_title", description='Report_description')runner.run(suite)

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

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

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

序号

搜索词

期望结果

1

邓肯

蒂姆

2

乔丹

迈克尔

3

库里

斯蒂芬

创建ExcelUtil.py文件:

# -*- coding: UTF-8 -*-
from openpyxl import load_workbookclass ParseExcel(object):def __init__(self, excelPath, sheetName):# 将要读取的Excel加载到内存self.wb = load_workbook(excelPath)# 通过工作表名获取一个工作表对象self.sheet = self.wb.get_sheet_by_name(sheetName)# 获取工作表中存在数据的区域的最大行号self.maxRowNum = self.sheet.max_rowdef getDatasFromSheet(self):# 用于存放从工作表中读取出来的数据dataList = []# 因为工作表中的第一行是标题行,所以需要去掉for line in self.sheet.rows[1:]:# 遍历工作表中数据区域的每一行,并将每行中每个单元格的数据去除存于列表tmpList中# 然后再将存放一行数据的列表添加到最终数据列表dataList中tmpList = []tmpList.append(line[1].value)tmpList.append(line[2].value)dataList.append(tmpList)return dataListif __name__ =='__main__':excelPath = u"测试数据.xlsx"sheetName = u"搜索数据表"pe = ParseExcel(excelPath, sheetName)for i in pe.getDatasFromSheet():print i[0],i[1]

创建DataDriven.py文件:

# -*- coding: UTF-8 -*-
from selenium import webdriver
import unittest
import time
import logging
import traceback
import ddt
from ExcelUtil import ParseExcel
from selenium.common.exceptions import NoSuchElementException# 初始化日志对象
logging.basicConfig(# 日志级别level = logging.INFO,# 日志格式# 时间、代码所在文件名、代码行号、日志级别名字、日志信息format='%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s %(message)s',# 打印日志时间datafomat='%a, %d %b %Y %H: %M: %S',# 日志文件存放的目录及日志文件名filename='d:/DataDriverTesting/report.log',# 打开日志文件的方式filemode='w'
)excelPath = u"测试数据.xlsx"
sheetName = u"搜索数据表"
excel = ParseExcel(excelPath, sheetName)@ddt.ddt
class TestDemo(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()@ddt.data(*excel.getDatasFromSheet())def test_data(self, data):testdata,expectdata = tuple(data)self.driver.get("http://www.baidu.com")print testdata,expectdataself.driver.implicitly_wait(2)try:self.driver.find_element_by_id("kw").send_keys(testdata)self.driver.find_element_by_id("su").click()time.sleep(3)self.assertTrue(expectdata in self.driver.page_source)except NoSuchElementException,e:logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))except Exception, e:logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))else:logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))def tearDown(self):self.driver.quit()if __name__ == '__main__':unittest.main()

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

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

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

<?xml version="1.0" encoding="utf-8" ?>
<bookList type="technology"><book><name>Selenium WebDriver实战宝典</name><author>吴晓华</author></book><book><name>HTTP权威指南</name><author>HTTP</author></book><book><name>探索式软件测试</name><author>惠特克</author></book>
</bookList>

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

# -*- coding: UTF-8 -*-
from xml.etree import ElementTreeclass ParseXML(object):def __init__(self,xmlPath):self.xmlPath = xmlPathdef getRoot(self):tree = ElementTree.parse(self.xmlPath)return tree.getroot()def findNodeName(self,parentNode,nodeName):nodes = parentNode.findall(nodeName)return nodesdef getNodeOfChildText(self, node):# childrenTextDict = {i.tag: i.text for i in list(node.iter())[1:]}childrenTextDict = {}for i in list(node.iter())[1:]:childrenTextDict[i.tag] = i.textreturn childrenTextDictdef getDataFromXml(self):root = self.getRoot()books = self.findNodeName(root, "book")dataList = []for book in books:childrenText = self.getNodeOfChildText(book)dataList.append(childrenText)return dataList
if __name__=='__main__':xml = ParseXML(r'TestData')datas = xml.getDataFromXml()for i in datas:print i['name'],i['author']

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

# -*- coding: UTF-8 -*-
from selenium import webdriver
import unittest
import time
import os
import logging
import traceback
import ddt
from XmlUtil import ParseXML
from selenium.common.exceptions import NoSuchElementException# 初始化日志对象
logging.basicConfig(# 日志级别level = logging.INFO,# 日志格式# 时间、代码所在文件名、代码行号、日志级别名字、日志信息format='%(asctime)s %(filename)s[line: %(lineno)d] %(levelname)s %(message)s',# 打印日志时间datafomat='%a, %d %b %Y %H: %M: %S',# 日志文件存放的目录及日志文件名filename='d:/DataDriverTesting/report.log',# 打开日志文件的方式filemode='w'
)
'''
# 获取当前文件所在父目录的绝对路径
currentPath = os.path.dirname(os.path.abspath(__file__))
# 获取数据文件的绝对路径
dataFilePath = os.path.join(currentPath, "TestData.xml")
print dataFilePath
'''# 创建ParseXML实例对象
xml = ParseXML("TestData")@ddt.ddt
class TestDemo(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()@ddt.data(* xml.getDataFromXml())def test_data(self, data):testdata, expectdata = data['name'], data['author']self.driver.get("http://www.baidu.com")print testdata,expectdataself.driver.implicitly_wait(2)try:self.driver.find_element_by_id("kw").send_keys(testdata)self.driver.find_element_by_id("su").click()time.sleep(3)self.assertTrue(expectdata in self.driver.page_source)except NoSuchElementException,e:logging.error(u"查找的页面元素不存在,异常堆站信息:"+str(traceback.print_exc()))except Exception, e:logging.error(u"未知错误,错误信息如下:"+str(traceback.print_exc()))else:logging.info(u"搜索%s,期望%s,通过"%(testdata, expectdata))def tearDown(self):self.driver.quit()if __name__ == '__main__':unittest.main()

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/205754.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++面向对象复习笔记暨备忘录

C指针 指针作为形参 交换两个实际参数的值 #include <iostream> #include<cassert> using namespace std;int swap(int *x, int* y) {int a;a *x;*x *y;*y a;return 0; } int main() {int a 1;int b 2;swap(&a, &b);cout << a << &quo…

GraphCast:基于机器学习的全球中期天气预测模型

文章信息 文章题为”GraphCast: Learning skillful medium-range global weather forecasting”&#xff0c;该文章于2023年发表至Science&#xff0c;文章内容主要关于利用机器学习模型&#xff0c;实现高效、准确的全球中期天气预测。由于文章内容较多&#xff0c;本文仅对研…

Retrofit+OkHttp打印Request 请求地址参数

在移动端开发时&#xff0c;我们常常需要像web端一样可以方便地查看我们向服务器发送请求的报文详细日志&#xff08;如请求地址&#xff0c;请求参数&#xff0c;请求类型&#xff0c;服务器响应的耗时时间&#xff0c;请求返回的结果等等&#xff09;。 使用Retrofit时&…

【傻瓜级JS-DLL-WINCC-PLC交互】6.​向PLC里面装载数据变量

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…

Jmeter进阶使用:BeanShell实现接口前置和后置操作!

一、背景 我们使用Jmeter做压力测试或者接口测试时&#xff0c;除了最简单的直接对接口发起请求&#xff0c;很多时候需要对接口进行一些前置操作&#xff1a;比如提前生成测试数据&#xff0c;以及一些后置操作&#xff1a;比如提取接口响应内容中的某个字段的值。举个最常用…

fastReID论文总结

fastReID论文总结 fastReIDReID所面临的挑战提出的背景概念&#xff1a;所谓ReID就是从视频中找出感兴趣的物体&#xff08;人脸、人体、车辆等&#xff09;应用场景&#xff1a;存在的问题&#xff1a;当前的很多ReID任务可复用性差&#xff0c;无法快速落地使用解决方式&…

用Metasploit进行信息收集2

基于FTP协议收集信息 1.查看ftp服务的版本信息 打开metasploit 查看ftp版本的模块&#xff0c;并进入模块 msf6 > search ftp_version msf6 > use auxiliary/scanner/ftp/ftp_version msf6 auxiliary(scanner/ftp/ftp_version) > show options 查看靶机的端口开方情…

SpringCloud原理】OpenFeign之FeignClient动态代理生成原理

大家好&#xff0c;前面我已经剖析了OpenFeign的动态代理生成原理和Ribbon的运行原理&#xff0c;这篇文章来继续剖析SpringCloud组件原理&#xff0c;来看一看OpenFeign是如何基于Ribbon来实现负载均衡的&#xff0c;两组件是如何协同工作的。 一、Feign动态代理调用实现rpc流…

Python语言学习笔记之六(程序调试及异常处理)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 1、Python程序常见的错误 语法错误:不正确的缩进、未定义的变量、括号不匹配等.运行时错误: 尝试访问不存在的…

爬虫学习 异步爬虫(五)

多线程 多进程 协程 进程 运行中的程序 线程 被CPU调度的执行过程,操作系统 运算调度的min单位 在进程之中,进程中实际运作单位 from threading import Thread#创建任务 def func(name):for i in range(100):print(name,i)if __name__ __main__:#创建线程t1 Thread(target …

Nuxt.js:下一代Web开发框架的革命性力量

文章目录 一、Nuxt.js简介二、Nuxt.js的特点1. 集成Vue.js和Node.js2. 自动代码分割和优化3. 服务端渲染&#xff08;SSR&#xff09;4. 强大的路由管理5. 丰富的插件系统 三、Nuxt.js的优势1. 提高开发效率2. 降低维护成本3. 提高用户体验 四、Nuxt.js在实际应用中的案例1. 电…

前端:实现二级菜单(二级菜单悬浮在一级菜单左侧)

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…

5V摄像机镜头驱动IC GC6208,可用于摄像机,机器人等产品中可替代AN41908

GC6208是一个镜头电机驱动IC摄像机和安全摄像机。该设备集成了一个直流电机驱动器的Iris的PID控制系统&#xff0c;也有两个通道的STM电机驱动器的变焦和对焦控制。 芯片的特点: 内置用于Iris控制器的直流电机驱动器 内置2个STM驱动程序&#xff0c;用于缩放和…

flink源码分析之功能组件(四)-slotpool组件I

简介 本系列是flink源码分析的第二个系列&#xff0c;上一个《flink源码分析之集群与资源》分析集群与资源&#xff0c;本系列分析功能组件&#xff0c;kubeclient&#xff0c;rpc&#xff0c;心跳&#xff0c;高可用&#xff0c;slotpool&#xff0c;rest&#xff0c;metrics&…

实用高效 无人机光伏巡检系统助力电站可持续发展

近年来&#xff0c;我国光伏发电行业规模日益壮大&#xff0c;全球领先地位愈发巩固。为解决光伏电站运维中的难题&#xff0c;浙江某光伏电站与复亚智能达成战略合作&#xff0c;共同推出全自动无人机光伏巡检系统&#xff0c;旨在提高发电效率、降低运维成本&#xff0c;最大…

react的开发中关于图片的知识

React是一个流行的JavaScript库&#xff0c;用于构建用户界面。在React开发中&#xff0c;图片是一个非常重要的元素&#xff0c;可以用于美化界面和展示内容。本篇博客将详细讲解React中关于图片的知识。 1. React中使用图片 在React中使用图片非常简单&#xff0c;只需要使…

智慧公厕为城市智慧管理提供强力有的数据支持

在当今科技飞速发展的时代&#xff0c;城市管理正面临着前所未有的挑战与机遇。而在这个城市发展的脚步日新月异的同时&#xff0c;一项看似不起眼的技术却正在默默地为城市的智慧管理提供着强有力的支持——那就是智慧公厕。这些不起眼的公共设施不仅仅是人们日常生活的一部分…

hive里如何高效生成唯一ID

常见的方式&#xff1a; hive里最常用的方式生成唯一id&#xff0c;就是直接使用 row_number() 来进行&#xff0c;这个对于小数据量是ok的&#xff0c;但是当数据量大的时候会导致&#xff0c;数据倾斜&#xff0c;因为最后生成全局唯一id的时候&#xff0c;这个任务是放在一个…

基于opencv+ImageAI+tensorflow的智能动漫人物识别系统——深度学习算法应用(含python、JS、模型源码)+数据集(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境爬虫模型训练实际应用 模块实现1. 数据准备1&#xff09;爬虫下载原始图片2&#xff09;手动筛选图片 2. 数据处理1&#xff09;切割得到人物脸部2&#xff09;重新命名处理后的图片3&#xff09;添加到数据集 3. 模型训练及…

基于YOLOv8深度学习的PCB板缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…