unittest框架数据驱动
一、目录
数据驱动概述
环境准备
使用unittest和ddt驱动
使用数据文件驱动
使用Excel驱动
使用XML驱动
使用MySQL驱动
二、数据驱动概述
数据驱动的定义:
- 相同的测试脚本使用不同的测试数据来执行
- 测试数据和测试行为完全分离
- 是一种测试脚本设计模式
实施数据驱动测试步骤:
- 编写测试脚本,脚本需要支持从程序对象、文件或数据库读入测试数据。
- 将测试脚本使用测试数据存入程序对象、文件或数据库等外部介质中。
- 运行脚本过程中,循环调用存储在外部介质中的测试数据。
- 验证所有的测试结果是否符合预期结果。
安装:
在线安装
离线安装
下载安装包:https://pypi.python.org/pypi/ddt
在CMD中切换至解压后目录,执行python setup.py install
数据驱动使用说明:
- 头部导入ddt模块(import ddt)
- 在测试类前声明使用ddt(@ddt.ddt)
- 在测试方法前使用@ddt.data()添加测试数据
- 多组测试数据以逗号隔开如@ddt.data(1,2,3)
- 每组数据中的数据与测试方法中定义的形参个数及顺序一一对应
- 使用@ddt.unpack进行修饰
- 测试过程中将测试数据传给测试方法中的形参。
实例:
import ddt
import unittest
@ddt.ddt
class DoubanTest(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
@ddt.data([1,2,3,6],[2,3,4,9],[3,4,5,12])
# @ddt.data([1,2,3,6])
@ddt.unpack
def test_add(self,testdata1,testdata2,testdate3,exceptdata):
sum=0
sum=testdata1+testdata2+testdate3
self.assertEqual(sum,exceptdata)
if __name__ =='__main__':
unittest.main()
二、数据文件驱动
语法:@ddt.file_data('data.json') 走data.json文件中获取数据
实例:
data.json
‘“data.json”’ [
"QQ||QQ_百度搜索",
"微信||微信_百度搜索",
"钉钉||钉钉_百度搜索"
]
run_test.py
import ddt,time
import unittest
from selenium import webdriver
@ddt.ddt
class Douban(unittest.TestCase):
@classmethod
def setUpClass(self):
self.driver = webdriver.Chrome()
@classmethod
def tearDownClass(self):
self.driver.quit()
def setUp(self):
self.driver.get('http://www.baidu.com')
def tearDown(self):
pass
@ddt.file_data('data.json')
@ddt.unpack
def test_baidu(self,value):
can,yu = value.split('||')
print(can,yu)
time.sleep(2)
self.driver.find_element_by_id('kw').send_keys(can)
time.sleep(2)
self.driver.find_element_by_id('su').click()
time.sleep(2)
self.assertEqual(self.driver.title,yu) if __name__ == '__main__':
unittest.main()
三、Excel驱动
安装:pip install openpyxl
思路:
- 先获取excle文件的路径和文件名
- 获取表名
- 根据表的列和行读取数据
测试Excel文件
Excel_test.py
from openpyxl import load_workbook class ParseExcel():
def __init__(self, excelPath, sheetName):
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=[]
tmpList.append(line[0].value)
tmpList.append(line[1].value)
dataList.append(tmpList)
# print(line)
return dataList if __name__ == '__main__':
excelPath='E:/data/测试数据.xlsx'
sheetName = '数据'
pe = ParseExcel(excelPath,sheetName)
for i in pe.getDatasFromSheet():
print(i[0])
print(i[1])
DataDiver.py
from selenium import webdriver
from Excal_data.Excal_text import ParseExcel
import unittest,time,logging,traceback,ddt #初始化日志对象
logging.basicConfig(
#此处省略
)
excelPath = 'E:/data/测试数据.xlsx'
sheetName = '数据'
excel = ParseExcel(excelPath,sheetName) @ddt.ddt
class TestDemo(unittest.TestCase):
# def setUp(self):
# self.driver = webdriver.Firefox()
#
# def tearDown(self):
# self.driver.quit()
@ddt.data( * excel.getDatasFromSheet())
def test_dataDrivenByFile(self,data):
testData,expectData = tuple(data)
print(testData,expectData) # 打印获取的两个数据 # 根据上面的获得数据建立下面逻辑
四、XML驱动
安装:Python自带不用安装
TestData.XML
<?xml version='1.0' encoding='utf-8'?>
<bookList type='technology'>
<book>
<name>钉钉</name>
<author>阿里</author>
</book>
<book>
<name>微信</name>
<author>腾讯</author>
</book>
</bookList>
XmlUtil.py
from xml.etree import ElementTree class ParseXML():
def __init__(self, xmlPath):
self.xmlPath = xmlPath def getRoot(self):
tree = ElementTree.parse(self.xmlPath)
return tree.getroot() def findNodeByName(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.findNodeByName(root, "book")
dataList = []
for book in books:
childrenText = self.getNodeOfChildText(book)
dataList.append(childrenText)
return dataList if __name__ == '__main__':
xml = ParseXML("./TestData.xml")
datas = xml.getDataFromXml()
for i in datas:
print(i["name"])
XmlDriver.py
from selenium import webdriver
from XML_data.XmlUtil import ParseXML
from selenium.common.exceptions import NoSuchElementException
import unittest,time,os,logging,traceback,ddt #初始化日志对象
logging.basicConfig(
#此处省略
) currentPath = os.path.dirname(os.path.abspath(__file__))
dataFilePath = os.path.join(currentPath,"TestData.xml")
xml = ParseXML(dataFilePath)
@ddt.ddt
class TestDemo(unittest.TestCase):
# def setUp(self):
# self.driver = webdriver.Firefox()
#
# def tearDown(self):
# self.driver.quit() @ddt.data( * xml.getDataFromXml())
def test_dataDrivenByXML(self,data):
testData,expectData = data["name"],data["author"]
print(testData,expectData)
# self.driver.get("http://www.baidu.com/")
# time.sleep(3)
# # 根据上面的获得数据建立下面逻辑
五、MySQL驱动
思路:连接数据库 - 根据数据库的表获取数据 - unittest框架ddt获取数据 - 处理数据格式
准备:数据库相关准备和操作
环境准备
- 下载mysql安装包
- 设置用户名密码(user:root passwd:1234)
- 安装mysql for python插件
- 将下载好文件放在pip下
- 在cmd下切换至pip所在目录下
- 执行pip install mysql***.whl
- 安装完成后进入python,输入import MySQLdb
- 不报错即为安装成功
数据库操作
更改数据库host
数据库创建和表数据插入
操作数据库
初始数据库变量,并启动对应方法
关联对应数据表
建立unittest框架驱动数据并处理
获取数据处理
unittest框架数据驱动的更多相关文章
- Unittest框架+ddt数据驱动+HTMLTestRunner+sendmail(自动发送测试报告)+git+Jenkins
本次写的是针对有代码基础的,没基础建议先去学基础,以下所有描述内容都是我已经在公司项目实践成功的!仅供参考 整体思路: 1.接口自动化用的是Python中unittest框架 2.所有的测试数据用例存 ...
- unittest框架(三)unittest+yaml数据驱动
学习完了如何用yaml文件管理用例,如何进行单元测试,如何产生漂亮的测试报告,那么结合这几点,我们简单学习下unittest+yaml数据驱动来测试. 第一步:首先,我们建一个yaml文件,管理用例, ...
- selenium + python自动化测试unittest框架学习(一)selenium原理及应用
unittest框架的学习得益于虫师的<selenium+python自动化实践>这一书,该书讲得很详细,大家可以去看下,我也只学到一点点用于工作中,闲暇时记录下自己所学才能更加印象深刻. ...
- selenium-webdriver(python) (十六) --unittest 框架
学习unittest 很好的一个切入点就是从selenium IDE 录制导出脚本.相信不少新手学习selenium 也是从IED 开始的. IDE学习参考: 菜鸟学自动化测试(一)----selen ...
- Selenium2+python自动化30-引入unittest框架
from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.com ...
- unittest 框架
unittest 框架 学习unittest 很好的一个切入点就是从selenium IDE 录制导出脚本.相信不少新手学习selenium 也是从IED 开始的. IDE学习参考: 菜鸟学自动化测试 ...
- unittest框架概要
unittest是Python语言自带的单元测试框架,原名PyUnit. 认识unittest 在unittest框架中有4个重要概念:test fixture.test case.test suit ...
- 接口登录CSDN发布博客---封装方法,使用unittest框架
一个简单的跑接口流程:登录后发表带图片的博客.这里涉及到的知识点: 1.登录时通过cookies去保持登录状态,把cookies添加到一个session中,这样可以保持长时间登录状态: 2.我们通过爬 ...
- 记录python接口自动化测试--unittest框架基本应用(第二目)
在第一目里写了几个简单demo,并把调用get和post请求的方法封装到了一个类里,这次结合python自带的unittest框架,用之前封装的方法来写一个接口测试demo 1.unittest简单用 ...
- unittest框架(惨不忍睹低配版)
根据我上个随笔的unittest框架优化得来,虽然对于smtp模块还是有点迷糊,不过还是勉强搭建运行成功了,还是先上代码: #login_test.py import requests class L ...
随机推荐
- vue3 loading 等待效果
一.自定义组件 loading.vue <template> <div class="loading" v-show="msg.show"&g ...
- Codeforces 1492D、Genius's Gambit
原题网址 https://codeforces.com/contest/1492/problem/D 题目大意 给定a,b,k,求x,y使得x和y的二进制表示都恰有a个0和b个1,且不能使用开头的0. ...
- vue 学习 css第四天
一.css背景属性 可以给页面元素添加背景样式. 背景属性(background)可以设置. 1.背景颜色. 2.背景图片. 3.背景平铺. 4.背景图片位置 5.背景图像固定 1.背景颜色(back ...
- 7. mixin的实现原理
mixin的实现原理 在Vue.mixin()中的内容会被维护到Vue.options静态属性里面 然后通过mergeOptions以特定的合并策略将全局的属性和用户属性合并起来 在获取用户选项的时候 ...
- 四、流程控制、break、continue、return
一. 程序流程控制概述 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块. 流程控制方式采用结构化程序设计中规定的只有三种基本流程结构,即:1.顺序结构程序 ...
- js复制图片
^(* ̄(oo) ̄)^:可以复制到微信和钉钉,文件夹中不可以复制 <!DOCTYPE html> <html lang="en"> <head> ...
- 01Java常用类
Object类 Object概述 Object类是超类,基类,所有类都默认直接继承Object类. Object类中定义的方法,是所有对象都具备的方法. Object类可以存储任何类 - 可以作为 ...
- [273] High Five Update 3 OpCodez
[273] High Five Update 3 Client 00 SendLogOut 01 RequestAttack 03 RequestStartPledgeWar 04 RequestRe ...
- CCF 201903-1 小中大
#include <iostream> #include <bits/stdc++.h> #include <string> using namespace std ...
- OS-lab4
OS-lab4 系统调用 系统调用的流程 按照上述的流程逐个分析. user/syscall_lib.c 这个文件位于user文件夹下,也就是用户程序可以调用的函数,相当于操作系统提供给用户程序的一些 ...