• [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('
    ').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
    原创不易,欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。

    笔者来自公众号:软测之家 软件测试技术交流群:695458161
  • 相关阅读:
    uniApp 滑动手势事件判定 支持NVUE
    按照指定数字 分割数组
    我引用中没有Spire.Pdf,但是发现无法解析的“Spire.Pdf”的不同版本之间存在冲突
    RedisUtil工具类
    Hutool操作excel
    Java 值传递与引用传递
    修改homestead中PHP cli版本
    VS2022 vs2022 servicehub.roslyncodeanalysisservice.exe 占用内存过高
    操作系统
    Spring Security BCryptPasswordEncoder 每次Hash出来的值都不同?
  • 原文地址:https://www.cnblogs.com/csmashang/p/12679477.html
Copyright © 2020-2023  润新知