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

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

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

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

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

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

同时,在这我也准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看就行,希望对你有所帮助!【公众号:互联网杂货铺】免费领取软件测试资料。

【2024最新版】Python自动化测试15天从入门到精通,10个项目实战,允许白嫖。。。

 

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.unpack
    def 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名为搜索数据表;

创建ExcelUtil.py文件:

# -*- coding: UTF-8 -*-
from openpyxl import load_workbook
 
class 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_row
 
 
    def 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 dataList
 
 
if __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,expectdata
        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()

备注:@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 ElementTree
 
class ParseXML(object):
    def __init__(self,xmlPath):
        self.xmlPath = xmlPath
 
    def getRoot(self):
        tree = ElementTree.parse(self.xmlPath)
        return tree.getroot()
 
    def findNodeName(self,parentNode,nodeName):
        nodes = parentNode.findall(nodeName)
        return nodes
 
    def 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.text
        return childrenTextDict
 
    def 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,expectdata
        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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

知识库软件有很多,这几个最好用

时代进步的同时&#xff0c;逐渐优化的企业知识库已经成为企业优化工作效率、提升企业竞争力的重要工具。随着云计算和大数据技术的快速发展&#xff0c;知识库软件如雨后春笋般出现在人们的视野中。下面&#xff0c;我从寻宝者的角度&#xff0c;向大家稳稳地推荐三款最优秀的…

mp-html 微信原生小程序渲染富文本

引入组件 "usingComponents": {"mp-html": "/components/mp-html/index"}使用 <mp-html content"{{info.course_info.info}}" />获取组件 介绍 mp-html&#xff0c;小程序富文本解析利器 全面支持html标签 小程序大多数都是…

C++重新认知:拷贝构造函数

一、什么是拷贝构造函数 对于简单变量来说&#xff0c;可以轻松完成拷贝。 int a 10; int b a;但是对于复杂的类对象来说&#xff0c;不仅存在变量成员&#xff0c;也存在各种函数等。因此相同类型的类对象是通过拷贝构造函数来完成复制过程的。 #include<iostream>…

使用Notepad++将多行数据合并成一行

步骤 1、按CtrlF&#xff0c;弹出“替换”的窗口&#xff1b; 2、选择“替换”菜单&#xff1b; 3、“查找目标”内容输入为&#xff1a;\r\n&#xff1b; 4、“替换为”内容为空&#xff1b; 5、“查找模式”选择为正则表达式&#xff1b; 6、设置好之后&#xff0c;点击“全…

Spring Data JPA 踩过的坑实录

前言 游戏中台一直在使用spring 全家桶&#xff0c; 本文会左右使用Spring Data JPA的坑点记录总结 主要给大家总结介绍了关于使用Spring JPA注意事项及踩过的坑。 案例1&#xff1a; 为什么只调用了 org.springframework.data.repository.CrudRepository#findById(ID id) 却…

STM32入门教程-2023版【3-4】总结GPIO使用方法

三、总结GPIO使用方法 总体上来说是比较简单的 首先初始化时钟&#xff0c;然后定义结构体&#xff0c;赋值结构体 GPIO_Mode可以选择那8种输入输出模式&#xff0c;GPIO_Pin选择引脚&#xff0c;可以用按位或的方式同时选中多个引脚,GPIO_Speed选择输出速度&#xff0c;最后使…

基于springboot+vue的个人健康管理系统(有文档、Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

《异侠传S1赛季侠义九州》公测版本三端互通PC客户端与IOS下载地址!!!

尊敬的各位异侠玩家们&#xff1a; 我们怀着无比激动的心情&#xff0c;充满感激地向大家宣布&#xff1a;今天上午10&#xff1a;00我们即将迎来《异侠传S1赛季&#xff1a;侠义九州》的首发公测&#xff01;在这个特殊的时刻&#xff0c;我们想将我们最诚挚的感谢献给每一位…

MES管理系统解决方案在汽配企业中的重要性

在汽车制造业中&#xff0c;MES管理系统解决方案已成为引领精益生产的关键要素。该系统专注于监控和管理汽车生产流程&#xff0c;利用实时数据分析和采集技术&#xff0c;为企业提供了提高效率、降低成本和确保高质量产品的有效手段。本文将详细介绍汽配企业MES管理系统的特点…

MindOpt:阿里巴巴达摩院打造的优化求解器及其组件全面介绍

MindOpt 简介和获取 MindOpt 是阿里巴巴达摩院决策智能实验室研发的决策优化软件。团队组建于2019年&#xff0c;聚焦于研发尖端运筹优化和机器学习技术&#xff0c;构建智能决策系统&#xff0c;更快更好地向各行各业提供数学建模与求解能力&#xff0c;帮助业务更快更好地做…

网络多线程开发小项目--QQ登陆聊天功能(服务端推送新闻、离线留言和文件)

9.1.5、QQ登陆聊天功能&#xff08;服务端推送新闻、离线留言和文件&#xff09; 9.1.5.1、服务端推送新闻 1、需求分析 2、思路分析 3、代码实现 QQServer&#xff1a; 1&#xff09;cn.com.agree.qqserver.service.SendNewsToAllClient package cn.com.agree.qqserver.s…

为什么推荐大家使用动态住宅ip?怎么选择?

编辑代理ip的类型有很多&#xff0c;本文来介绍什么是动态住宅ip&#xff0c;为什么很多博主都推荐使用动态住宅ip&#xff0c;他到底有什么好处呢&#xff0c;接下来我们来学习一下。 一、什么是动态住宅ip 网络上的代理供应商很多&#xff0c;通常我们接触的比较多的几种类…

element + table 行列合并

如图&#xff0c;实现通过判断数据&#xff0c;动态的合并列数据 <template><div class"merge-cell"><el-table:data"tableData":span-method"objectSpanMethod"borderstyle"width: 100%; margin-top: 20px"><e…

nas系统盘制作(群晖)

目录 一、前言 二、制作系统盘 &#xff08;一&#xff09;下载镜像 &#xff08;二&#xff09;下载U盘刷写工具 三、资料获取 一、前言 群晖系统是使用比较多的nas系统。现在主要使用的是7版本的系统。 h群晖是指“h群晖NAS”&#xff08;Hackintosh NAS&#xff09;系统…

关于gcc版本问题导致找不到filesystem以及GCC多版本切换

fatal error: filesystem: 没有那个文件或目录 问题&#xff1a; #include 包含上述头文件出错&#xff0c;未找到该文件。 解决方法一&#xff1a; 修改头文件 #include <experimental/filesystem>添加依赖 在编译时&#xff0c;后面添加&#xff1a;-lstdcfs编译通…

uniapp 实战 -- app 的自动升级更新(含生成 app 发布页)

uniapp 提供了 App升级中心 uni-upgrade-center &#xff0c;可以便捷实现app 的自动升级更新&#xff0c;具体编码和配置如下&#xff1a; 1. 用户端 – 引入升级中心插件 下载安装插件 uni-upgrade-center - App https://ext.dcloud.net.cn/plugin?id4542 pages.json 中添加…

有哪些试卷文字识别的工具?分享3款实用的!

在当今信息化时代&#xff0c;我们生活在一个充满数据的世界里。这些数据以各种形式存在&#xff0c;其中一种重要的形式就是纸质文档&#xff0c;例如试卷。然而&#xff0c;纸质文档不易管理和查询&#xff0c;因此我们需要将这些信息转化为数字形式。为此&#xff0c;我们可…

python-os模块学习,全

目前&#xff0c;计算机上主流的操作系统有Windows、Unix、Mac OS等&#xff0c;os模块为多操作系统的访问提供了相关功能的支持&#xff0c;涉及对文件相关操作功能的实现&#xff0c;系统访问path路径的操作&#xff0c;shell命令行操作&#xff0c;Linux扩展属性的操作&…

奥伦德光电耦合器5G通信领域及其相关领域推荐

光电耦合器是以光为媒介传输电信号的一种电-光-电转换器件。由于该器件使用寿命长、工作温度范围宽&#xff0c;所以在过程控制、工业通信、家用电器、医疗设备、通信设备、计算机以及精密仪器等方面有着广泛应用在当前工艺技术持续发展与提升的过程中&#xff0c;其工作速度、…

出版时间1月!软考系统集成新教材即将出版!

关于系统集成项目管理工程师改版的消息终于有进展了&#xff0c;根据查询中国国家版本馆数据&#xff1a;新版教材出版日期为2024年1月&#xff01;相信很快大家就能拿到新版的教材进行复习了&#xff01; 本书是全国计算机专业技术资格考试办公室组织编写的考试用书。 本书…