【webdriver自动化】Python数据驱动工具DDT
一、Python数据驱动工具ddt
1、 安装
ddt pip install ddt
DDT是 “Data-Driven Tests”的缩写
资料:http://ddt.readthedocs.io/en/latest/
2、 DDT的使用
(1) ddt.ddt:
装饰类,也就是继承自TestCase的类
(2) ddt.data:
装饰测试方法。参数是一系列的值。
(3) ddt.file_data:
装饰测试方法。参数是文件名。文件可以是json 或者 yaml类型。
注意,如果文件以”.yml”或者”.yaml”结尾,ddt会作为yaml类型处理,其他所有文件都会作为json文件处理。
如果文件中是列表,每个列表的值会作为测试用例参数,同时作为测试用例方法名后缀显示。如果文件中是字典,字典的key会作为测试用例方法的后缀显示,字典的值会作为测试用例参数。
(4) ddt.unpack:
传递的是复杂的数据结构时使用。比如使用元组或者列表,添加unpack之后,ddt会自动把元组或者列表对应到多个参数上。字典也可以这样处理。
(5) 测试用例方法名生成规则
使用ddt后,会产生一个新的测试用例方法名:之前的测试用例方法名_ordinal_data
之前的测试用例方法名:即定义的测试用例方法名。比如def test_large(),这里就是test_large
ordinal:整数,从1开始递加。
data:如果传递过来的数据存在__name__属性,则这里就是该数据的__name__值。如果未定义__name__属性,ddt会尽量将传递过来的数据转化为python标识符,作为data显示。比如(3,2)就转化为3_2。需要注意的是,如果数据是字典,则这里就是字典的key。
二、实例演示
1、@ddt.ddt&&@ddt.data main.py:
from selenium import webdriver
import unittest, time
import logging, 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',
# 打印日志的时间
datefmt = '%a, %d %b %Y %H:%M:%S',
# 日志文件存放的目录(目录必须存在)及日志文件名
filename = 'e:/report.log',
# 打开日志文件的方式
filemode = 'w'
) @ddt.ddt
class TestDemo(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Ie(executable_path = "c:\\IEDriverServer")
@ddt.data([u"神奇动物在哪里", u"叶茨"],
[u"疯狂动物城", u"古德温"],
[u"大话西游之月光宝盒", u"周星驰"])
@ddt.unpack #解包,将测试数据对应到testdata 和 expectdata
def test_dataDrivenByObj(self, testdata, expectdata):
url = "http://www.baidu.com"
# 访问百度首页
self.driver.get(url)
# 设置隐式等待时间为10秒
self.driver.implicitly_wait(10)
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.format_exc()))
except AssertionError, e:
logging.info(u"搜索“%s”,期望“%s”,失败" %(testdata, expectdata))
except Exception, e:
logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
else:
logging.info(u"搜索“%s”,期望“%s”通过" %(testdata, expectdata)) def tearDown(self):
self.driver.quit() if __name__ == '__main__':
unittest.main()
2、@ddt.file_data test_data_list.json:
[
"邓肯||蒂姆",
"乔丹||迈克尔",
"库里||斯蒂芬",
"杜兰特||凯文",
"詹姆斯||勒布朗"
] main.py: from selenium import webdriver
import unittest, time
import logging, traceback
import ddt
from ReportTemplate import htmlTemplate
from selenium.common.exceptions import NoSuchElementException #如果有no json的报错信息,请将json文件存储为utf-8,with Bom
# 初始化日志对象
logging.basicConfig(
# 日志级别
level = logging.INFO,
# 日志格式
# 时间、代码所在文件名、代码行号、日志级别名字、日志信息
format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
# 打印日志的时间
datefmt = '%a, %Y-%m-%d %H:%M:%S',
# 日志文件存放的目录(目录必须存在)及日志文件名
filename = 'e:/report.log',
# 打开日志文件的方式
filemode = 'w'
) @ddt.ddt
class TestDemo(unittest.TestCase): @classmethod
def setUpClass(cls):
# 整个测试过程只被调用一次
TestDemo.trStr = "" def setUp(self):
self.driver = webdriver.Ie(executable_path = "c:\\IEDriverServer")
status = None # 用于存放测试结果状态,失败'fail',成功'pass'
flag = 0 # 数据驱动测试结果的标志,失败置0,成功置1 @ddt.file_data("test_data_list.json")
def test_dataDrivenByFile(self, value):
# 决定测试报告中状态单元格中内容的颜色
flagDict = {0: 'red', 1: '#00AC4E'} url = "http://www.baidu.com"
# 访问百度首页
self.driver.get(url)
# 将浏览器窗口最大化
self.driver.maximize_window()
print value
# 将从.json文件中读取出的数据用“||”进行分隔成测试数据
# 和期望数据
testdata, expectdata = tuple(value.strip().split("||"))
# 设置隐式等待时间为10秒
self.driver.implicitly_wait(10) try:
# 获取当前的时间戳,用于后面计算查询耗时用
start = time.time()
# 获取当前时间的字符串,表示测试开始时间
startTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 找到搜索输入框,并输入测试数据
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.format_exc()))
status = 'fail'
flag = 0
except AssertionError, e:
logging.info(u"搜索“%s”,期望“%s”,失败" %(testdata, expectdata))
status = 'fail'
flag = 0
except Exception, e:
logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
status = 'fail'
flag = 0
else:
logging.info(u"搜索“%s”,期望“%s”通过" %(testdata, expectdata))
status = 'pass'
flag = 1
# 计算耗时,从将测试数据输入到输入框中到断言期望结果之间所耗时
wasteTime = time.time() - start - 3 # 减去强制等待的3秒
# 每一组数据测试结束后,都将其测试结果信息插入表格行
# 的HTML代码中,并将这些行HTML代码拼接到变量trStr变量中,
# 等所有测试数据都被测试结束后,传入htmlTemplate()函数中
# 生成完整测试报告的HTML代码
TestDemo.trStr += u'''
<tr>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td>%.2f</td>
<td style="color:%s">%s</td>
</tr><br />''' % (testdata, expectdata,startTime, wasteTime, flagDict[flag], status) def tearDown(self):
self.driver.quit() @classmethod
def tearDownClass(cls):
# 写自定义的html测试报告
# 整个测试过程只被调用一次
htmlTemplate(TestDemo.trStr) if __name__ == '__main__':
unittest.main()
【webdriver自动化】Python数据驱动工具DDT的更多相关文章
- Python 数据驱动工具:DDT
背景 python 的unittest 没有自带数据驱动功能. 所以如果使用unittest,同时又想使用数据驱动,那么就可以使用DDT来完成. DDT是 “Data-Driven Tests”的缩写 ...
- Selenium2+python自动化之数据驱动(ddt)
环境准备 1.安装ddt模块,打开cmd输入pip install ddt在线安装 数据驱动原理 1.测试数据为多个字典的list类型 2.测试类前加修饰@ddt.ddt 3.case前加修饰@ddt ...
- Python 数据驱动 unittest + ddt
一数据驱动测试的含义: 在百度百科上的解释是: 数据驱动测试,即黑盒测试(Black-box Testing),又称为功能测试,是把测试对象看作一个黑盒子.利用黑盒测试法进行动态测试时,需要测试软件产 ...
- python - 数据驱动测试 - ddt
# -*- coding:utf-8 -*- ''' @project: jiaxy @author: Jimmy @file: study_ddt.py @ide: PyCharm Communit ...
- python 数据驱动(ddt)
DDT包含类的装饰器ddt和两个方法装饰器data(直接输入测试数据),file_data(可以从json或者yaml中获取测试数据) 实例代码: import ddt import unittest ...
- Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构
1.Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_pa ...
- python webdriver 测试框架-数据驱动xml驱动方式
数据驱动xml驱动的方式 存数据的xml文件:TestData.xml: <?xml version="1.0" encoding="utf-8"?> ...
- python webdriver 测试框架-数据驱动excel驱动的方式
简介: 数据驱动excel驱动方式,就是数据配置在excel里面,主程序调用的时候每次用从excel里取出的数据作为参数,进行操作, 需要掌握的地方是对excel的操作,要灵活的找到目标数据 测试数据 ...
- Python数据驱动DDT的应用
在开始之前,我们先来明确一下什么是数据驱动,在百度百科中数据驱动的解释是:数据驱动测试,即黑盒测试(Black-box Testing),又称为功能测试,是把测试对象看作一个黑盒子.利用黑盒测试法进行 ...
随机推荐
- random模块写的验证码
import randomabc=''for i in range(4): a=random.randrange(0,4) if i != a: b=chr(random.r ...
- go语言切片切片与指针
go语言 1.切片的定义 切片不是真正意义上的动态数组,是引用类型. var arraySlice []int
- 【题解】Luogu P2153 [SDOI2009]晨跑
原题传送门 一眼应该就能看出是费用流 因为每个交叉路口只能通过一次,所以我们进行拆点,连一条流量为1费用为0的边 再按照题目给的边(是单向边)建图 跑一下MCMF就行了 拆点很套路的~ #includ ...
- MYSQL 修改表结构基本操作一览
查看表的字段信息:desc 表名; 查看表的所有信息:show create table 表名; 添加主键约束:alter table 表名 add constraint 主键 (形如:PK_表名) ...
- 继上篇后的Excel批量数据导入
上篇Excel动态生成模板,此篇将借用此模板进行Excel数据的批量导入. 说明:由于数据库中部分数据储存的是编码或者Id,因此,这里就需要用到上篇中的全局数据,判断是否有数据,有数据直接使用,没有数 ...
- WinForm动态查询
WinForm 动态查询 1. 使用场景 在对数据进行筛选, 包含多个筛选字段时适用. 2. 接口设计 /// <summary> /// 定义可作为追加到 WHERE 子句的控件接口 / ...
- Linux 常用命令——文件处理命令
Linux 常用命令 Linux Linux命令格式 命令格式:命令 [-选项] [参数] 例如:ls -a /etc 说明: 1.当有多个选项时,可以写在一起 2.简化选项等于完整选项 -a = - ...
- 剑指offer 03:从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 递归法 /** * public class ListNode { * int val; * ListNode next = ...
- 1_bytes和str
数据运算全跳过,语言都一样,格式差异 bytes/str的区别 Python3不会以任意隐式的方式混用bytes和str,不能拼接字符串和字节包也无法在字节包里搜索字符串(反之亦然) 二进 ...
- antd Select进阶功能 动态更新、函数防抖
一.动态更新Options Antd Select自带的搜索功能很多时候需要结合后端的接口,输入一个关键字的时候会自动更新选择器的选项. 下面列一些注意点 基础实现 选择器选项必须和每次更新的数据挂钩 ...