[ddt02篇]十年测试老鸟帮您解析:ddt结合txt,excel,csv,mysql实现自动化测试数据驱动

一、前言:

阅读此文之前请先阅读:

[ddt01篇]十年测试老鸟帮您解析:ddt数据驱动入门基础应用:https://www.cnblogs.com/csmashang/p/12679448.html

?

二、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文件实现数据驱动。

因内容太多,这里就不在详述了,如果你觉得此文对你有帮助,如果你想要获取[ddt中读取json/yaml文件实现数据驱动]的资料,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入软件测试技术群:695458161,群里发放的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

作者:诸葛

出处:https://www.cnblogs.com/csmashang/p/12679477.html
原创不易,欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。