Selenium3+MySQL數據庫進行數據驅動測試


目錄結構

1、准備SQL語句 — Sql.py

#創建gloryroad數據庫SQL語句
create_database = 'create database if not exists gloryroad default charset utf8 collate utf8_general_ci;'
#創建testdata表
create_table = """
    create table if not exists testdata(
        id int not null auto_increment comment '主鍵',
        bookname varchar(40) unique not null comment '書名',
        author varchar(30) not null comment '作者',
        primary key(id)
    )engine = innodb character set utf8 comment '測試數據表';
"""

 

2、初始化數據庫腳本 — Databaselnit.py

#初始化數據庫腳本
import pymysql
from Sql import *

class DataBaseInit():
    #本類用於完成初始化數據庫操作
    #創建數據庫,創建數據表,向表中插入測試數據
    def __init__(self, host, port, dbName, username, password, charset):
        self.host = host
        self.port = port
        self.db = dbName
        self.user = username
        self.passwd = password
        self.charset = charset

    def create(self):
        try:
            #連接MySQL數據庫
            conn = pymysql.connect(
                host = self.host,
                port = self.port,
                user = self.user,
                passwd = self.passwd,
                charset = self.charset
            )
            #獲取數據庫游標
            cur = conn.cursor()
            #創建數據庫
            cur.execute(create_database)
            #選擇創建好的gloryroad數據庫
            conn.select_db("gloryroad")
            #創建測試表
            cur.execute(create_table)
        except pymysql.Error as e:
            raise e
        else:
            #關閉游標
            cur.close()
            #提交操作
            conn.commit()
            #關閉連接
            conn.close()
            print("創建數據庫及表成功")

    def insertDatas(self):
        try:
            #連接數據庫中具體某個庫
            conn = pymysql.connect(
                host=self.host,
                port=self.port,
                db = self.db,
                user=self.user,
                passwd=self.passwd,
                charset=self.charset
            )
            cur = conn.cursor()
            #向測試表中插入測試數據
            sql = "insert into testdata(bookname, author) values(%s, %s);"
            res = cur.executemany(sql, [('Selenium Data Driven', 'Flutter'),
                                        ('Python 基礎教程', 'Magnus Lie Hetland'),
                                        ('算法設計與分析', '張德富'),
                                        ('計算機網絡', '謝希仁')])
        except pymysql.Error as e:
            raise e
        else:
            conn.commit()
            print("初始數據插入成功")
            #通過打印,確認數據是否插入成功
            cur.execute("select * from testdata;")
            for i in cur.fetchall():
                print(i[1], i[2])
            cur.close()
            conn.close()

if __name__ == '__main__':
    db = DataBaseInit(
        host="localhost",
        port=3306,
        dbName="gloryroad",
        username="root",
        password="root",
        charset="utf8"
    )
    db.create()
    db.insertDatas()
    print("數據庫初始化結束")

 

3、從數據庫中獲取測試數據 — MysqlUtil.py

#從數據庫中獲取測試數據
import pymysql
from DatabaseInit import DataBaseInit

class MyMySQL():
    def __init__(self, host, port, dbName, username, password, charset):
        #進行數據庫初始化
        dbInit = DataBaseInit(host, port, dbName, username, password, charset)
        dbInit.create()
        dbInit.insertDatas()
        self.conn = pymysql.connect(
            host = host,
            port = port,
            db = dbName,
            user = username,
            passwd = password,
            charset = charset
        )
        self.cur = self.conn.cursor()

    def getDataFromDataBases(self):
        #從testdata表中獲取需要的測試數據
        #bookname作為搜索關鍵詞,author作為預期關鍵詞
        self.cur.execute("select bookname, author from testdata")
        #從查詢區域取回所有的查詢結果
        datasTuple = self.cur.fetchall()
        return datasTuple

    def closeDatabase(self):
        #數據庫后期清理工作
        self.cur.close()
        self.conn.commit()
        self.conn.close()

if __name__ == '__main__':
    #實例化對象
    db = MyMySQL(
        host="localhost",
        port=3306,
        dbName="gloryroad",
        username="root",
        password="root",
        charset="utf8"
    )
    #函數調用
    print(db.getDataFromDataBases())
    db.closeDatabase()

 

4、執行數據驅動測試腳本 — DataDrivenByMySQL.py

#執行數據驅動測試腳本
from selenium import webdriver
import unittest, time
import logging, traceback
import ddt
from MysqlUtil import MyMySQL
from selenium.common.exceptions import NoSuchElementException
from BSTestRunner import BSTestRunner

#初始化日志對象
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='./dataDrivenReport.log',
    #打開日志文件的方式
    filemode='w'
)
def getTestDatas(): #對象實例化 db = MyMySQL( host="localhost", port=3306, dbName="gloryroad", username="root", password="root", charset="utf8" ) #從數據庫測試表中獲取測試數據 testData = db.getDataFromDataBases() #關閉數據庫連接 db.closeDatabase() #返回數據 return testData @ddt.ddt class TestDemo(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() @ddt.data(*getTestDatas()) def test_dataDrivenByDatabase(self, data): #對獲得的數據進行解包 testData, expectData = data url = "http://www.baidu.com" #訪問百度首頁 self.driver.get(url) #將瀏覽器窗口最大化 self.driver.maximize_window() print(testData, expectData) #設置隱式等待時間為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: logging.error("查找的頁面元素不存在,異常堆棧信息:" + str(traceback.format_exc())) except AssertionError: logging.info("搜索%s,期望%s,失敗" % (testData, expectData)) except Exception: logging.error("未知錯誤,錯誤信息:" + str(traceback.format_exc())) else: logging.info("搜索%s,期望%s,通過" % (testData, expectData)) def tearDown(self): self.driver.quit() if __name__ == '__main__': # unittest.main() testCase = unittest.TestLoader().loadTestsFromTestCase(TestDemo) # 將多個測試類加載到測試套件中 suite = unittest.TestSuite(testCase) filename = "./test.html" fp = open(filename, 'wb') runner = BSTestRunner(stream=fp, title='數據庫驅動測試', description='測試用例執行情況:') runner.run(suite) fp.close()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM