一、前言:
阅读此文之前请先阅读:
[ddt01篇]十年测试老鸟帮您解析:ddt数据驱动入门基础应用:
?二、ddt数据驱动框架结合txt文件实现数据驱动
test_demo.py代码如下:
import unittest
from ddt import ddt, data, unpack
#读取txt文件中的内容,strip()方法去掉首位的指定字符。
def read_txt():
list = []
file = open(‘param.txt’,’r’,encoding=’utf-8′)
for line in file.readlines():
list.append(line.strip(‘n’).split(‘,’))
return list
@ddt
class aaa(unittest.TestCase):
def setUp(self):
pass
@data(*read_txt())
def test1_data(self,args1):
print(args1)
def tearDown(self):
pass
if __name__ == ‘__main__’:
unittest.main()
param.txt文件中内容如下:
诸葛,司马
马超,关羽
三、使用ddt结合excel(.csv格式也可以)文件实现数据驱动
test_demo.py代码如下:
import time
import unittest
import ddt
from selenium import webdriver
from selenium.webdriver.common.by import By
from a.excel_util import ExcelUtil
@ddt.ddt
class TestDemo(unittest.TestCase):
eu = ExcelUtil()
def setUp(self) -> None:
self.driver = webdriver.Chrome()
self.driver.get(“https://www.baidu.com”)
self.driver.maximize_window()
self.driver.implicitly_wait(10)
@ddt.data(*eu.read_excel(“D:\testdata.xlsx”,”Sheet1″))
def test_data_driver_by_jsonfile(self,value):
try:
testData,expectData = tuple(value)
self.driver.find_element(By.ID,”kw”).send_keys(testData)
time.sleep(3)
self.driver.find_element(By.ID,”su”).click()
time.sleep(5)
self.assertTrue(expectData in self.driver.page_source)
except:
print(“搜索:%s,期望:%s,失败”%(testData,expectData))
pass
else:
print(“搜索:%s,期望:%s,通过”%(testData,expectData))
pass
def tearDown(self) -> None:
self.driver.quit()
if __name__ == ‘__main__’:
unittest.main()
excel_util.py读取excel(csv)数据文件如下:
import xlrd
class ExcelUtil:
#读取excel数据
def read_excel(self,excel_path,sheet_name):
xls = xlrd.open_workbook(excel_path)
sheet = xls.sheet_by_name(sheet_name)
dataList=[]
for line in range(1,sheet.nrows):
tempList = []
tempList.append(sheet.cell_value(line,1))
tempList.append(sheet.cell_value(line,2))
dataList.append(tempList)
return dataList
if __name__ == ‘__main__’:
data = ExcelUtil().read_excel(“d:\testdata.xlsx”,”Sheet1″)
print(data)
D:\testdata.xlsx文件中Sheet1的工作表内容如下:
实例讲解:@ddt.data()从eu.read_excel(“D:\testdata.xlsx”,”Sheet1″)方法中接收一个可迭代的数组对象,以此来判断需要执行的次数。如果@ddt.data()括 中传的是一个方法,方法前需要加星 (*)修饰。*表示出掉最外层的括 。
四、使用ddt结合mysql数据库进行数据驱动
1.在dos窗口安装pymysql模块来操作数据库。命令:pip install pymysql
2.安装mysql数据库(安装过程省略),创建database.py文件,使用pymysql创建数据库datadriver,创建表testdata,并向testdata表中插入三条数据。
database.py代码如下:
import time
import pymysql as pymysql
class DataBase:
#删除datadriver数据库的SQL语句
drop_database = ” drop database if exists datadriver;”
#创建datadriver的SQL语句:
create_database = “create database datadriver default charset utf8 COLLATE utf8_general_ci;”
#创建testdata表的SQL语句:
create_table = “””create table testdata(id int not null auto_increment comment ‘主键’,searchContent varchar(40) unique not null comment ‘百度搜索的内容’,assertContent varchar(30) not null comment ‘断言的内容’,primary key(id));”””
def __init__(self,host,port,username,password,db):
self.host = host
self.port = port
self.username = username
self.password = password
self.db = db
#连接数据库创建数据库和表
def create_databse_and_table(self):
try:
#连接Mysql数据库。
conn = pymysql.connect(host=self.host,port=self.port,user=self.username,password=self.password)
#获取数据库游标
cur = conn.cursor()
#删除数据库
cur.execute(self.drop_database)
time.sleep(3)
#执行创建数据库的SQL语句
cur.execute(self.create_database)
time.sleep(3)
#选中创建好的datadriver数据库。
conn.select_db(“datadriver”)
#执行创建表的SQL语句
cur.execute(self.create_table)
# 提交操作
conn.commit()
except Exception:
raise
else:
cur.close() #关闭游标
conn.close() #关闭连接
print(“创建数据库和表成功!”)
#插入数据
def insert_data(self):
try:
# 连接Mysql数据库。
conn = pymysql.connect(host=self.host, port=self.port, user=self.username, password=self.password,db=self.db)
# 获得数据库游标
cur = conn.cursor()
# 执行插入数据的SQL语句
sql = “insert into testdata(searchContent,assertContent) values(%s,%s)”
cur.executemany(sql,[(‘神奇动物在哪里’,’叶茨’),(‘疯狂动物城’,’霍华德’),(‘杜兰特’,’凯文’)])
# 提交操作
conn.commit()
except Exception:
raise
else:
cur.close() # 关闭游标
conn.close() # 关闭连接
print(“数据插入成功!”)
#查询数据
def select_data(self):
result = “”
try:
conn = pymysql.connect(host=self.host,port=self.port,user=self.username,password=self.password,db=self.db)
cur = conn.cursor()
cur.execute(“select searchContent,assertContent from testdata;”)
result=cur.fetchall()
except Exception:
raise
else:
cur.close() # 关闭游标
conn.close() # 关闭连接
print(“数据查询成功!”)
return result
if __name__ == ‘__main__’:
db = DataBase(“localhost”,3306,”root”,”admin”,”datadriver”)
db.create_databse_and_table()
db.insert_data()
print(db.select_data())
注意事项:
# 以下代码连接Mysql数据库。最好使用关键字传参,否则可能会出现参数顺序问题,关键字包括:host,port,user,password,db
conn = pymysql.connect(host=self.host, port=self.port, user=self.username, password=self.password,db=”datadriver”)
#以下代码在传值时3306必须传数字类型,不能传入”3306″这种字符串类型。
db = DataBase(“localhost”,3306,”root”,”admin”)
3.使用ddt结合mysql数据库进行数据驱动
test_demo.py文件内容如下:
import time
import unittest
import warnings
import ddt
from selenium import webdriver
from selenium.webdriver.common.by import By
from a.database import DataBase
def get_data():
db = DataBase(“localhost”, 3306, “root”, “admin”,”datadriver”)
data = db.select_data()
return data
@ddt.ddt
class TestDemo(unittest.TestCase):
def setUp(self) -> None:
warnings.simplefilter(‘ignore’,ResourceWarning) #处理资源警告。
self.driver = webdriver.Chrome()
self.driver.get(“https://www.baidu.com”)
self.driver.maximize_window()
self.driver.implicitly_wait(10)
@ddt.data(*get_data())
def test_data_driver_by_jsonfile(self,data):
try:
testData,expectData = data
self.driver.find_element(By.ID,”kw”).send_keys(testData)
time.sleep(3)
self.driver.find_element(By.ID,”su”).click()
time.sleep(5)
self.assertTrue(expectData in self.driver.page_source)
except:
print(“搜索:%s,期望:%s,失败”%(testData,expectData))
pass
else:
print(“搜索:%s,期望:%s,通过”%(testData,expectData))
pass
def tearDown(self) -> None:
self.driver.quit()
if __name__ == ‘__main__’:
unittest.main()
案例讲解:get_data()方法用于调用database.py中的select_data()查询数据库中数据的方法。warnings.simplefilter(‘ignore’,ResourceWarning)代码用于处理警告信息。
五、使用ddt中读取json/yaml文件实现数据驱动。
因内容太多,这里对json和yaml文件的读取就先不帖出来了,如果你觉得此文对你有帮助,如果你对此文有任何疑问,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣请拉到最上面关注笔者的名字!
文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树首页概览32262 人正在系统学习中 相关资源:蓦然记忆助手2.0触屏加强版-管理软件工具类资源-CSDN文库
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!