1. 程式人生 > >Python&Selenium 資料驅動【unittest+ddt+mysql】

Python&Selenium 資料驅動【unittest+ddt+mysql】

一、摘要

本博文將介紹Python和Selenium做自動化測試的時候,基於unittest框架,藉助ddt模組使用mysql資料庫為資料來源作為測試輸入

二、SQL指令碼

# encoding = utf-8

create_database = 'CREATE DATABASE IF NOT EXISTS davieyang DEFAULT CHARSET utf8 COLLATE utf8_general_ci;'
drop_table = 'DROP TABLE testdata;'
create_table = """
    CREATE TABLE testdata(
        ID 
int primary key not null auto_increment comment '主鍵', BOOKNAME varchar(40) unique not null comment '書名', AUTHOR varchar(30) not null comment '作者' )engine = innodb character set utf8 comment '測試資料表'; """

三、解析Mysql

# encoding = utf-8
"""
__title__ = ''
__author__ = 'davieyang'
__mtime__ = '2018/4/21'
""" import pymysql from TestData.SqlScripts import create_table from TestData.SqlScripts import create_database from TestData.SqlScripts import drop_table class MySQL(object): def __init__(self, host, port, dbName, username, password, charset): self.conn = pymysql.connect( host
=host, port=port, db=dbName, user=username, password=password, charset=charset ) self.cur = self.conn.cursor() def create(self): try: self.cur.execute(create_database) self.conn.select_db("davieyang") self.cur.execute(drop_table) self.cur.execute(create_table) ''' cur.execute("drop database if exists davieyang") #如果davieyang資料庫存在則刪除 cur.execute("create database davieyang") #新建立一個數據庫davieyang cur.execute("use davieyang") #選擇davieyang這個資料庫 # sql 中的內容為建立一個名為testdata的表 sql = """create table testdata(id BIGINT,name VARCHAR(20),age INT DEFAULT 1)""" #()中的引數可以自行設定 conn.execute("drop table if exists testdata") # 如果表存在則刪除 conn.execute(sql)# 建立表 # 刪除 # conn.execute("drop table testdata") conn.close()# 關閉遊標連線 connect.close()# 關閉資料庫伺服器連線 釋放記憶體 ''' except pymysql.Error as e: raise e else: self.cur.close() self.conn.commit() self.conn.close() print(u"建立資料庫和表成功") def insertDatas(self): try: sql = "insert into testdata(bookname, author) values(%s, %s);" self.cur.executemany(sql, [('selenium xml DataDriven', 'davieyang'), ('selenium excel DataDriven', 'davieyang'), ('selenium ddt data list', 'davieyang')]) except pymysql.Error as e: raise e else: self.conn.commit() print(u"初始資料插入成功") self.cur.execute("select * from testData;") for i in self.cur.fetchall(): print(i[1], i[2]) self.cur.close() self.conn.close() def getDataFromDataBase(self): # 從資料庫中獲取資料 # bookname作為搜尋關鍵詞,author作為期望結果 self.cur.execute("select bookname, author from testdata;") # 從查詢區域取回所有查詢結果 dataTuple = self.cur.fetchall() return dataTuple def closeDataBase(self): # 資料庫清理 self.cur.close() self.conn.commit() self.conn.close() if __name__ == "__main__": db = MySQL( host="localhost", port=3306, dbName="davieyang", username="root", password="root", charset="utf8" ) print(db.getDataFromDataBase()) db.closeDataBase()

四、測試指令碼

# encoding = utf-8
"""
__title__ = ''
__author__ = 'davieyang'
__mtime__ = '2018/4/21'
"""
from selenium import webdriver
import unittest
import time
import logging
import traceback
import ddt
from Util.MysqlDBUtil import MySQL
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='F:\\DataDriven\\TestResults\TestResults.TestResults',
    # 開啟日誌的方式
    filemode='w'
)


def getTestDatas():
    db = MySQL(
        host="localhost",
        port=3306,
        dbName="davieyang",
        username="root",
        password="root",
        charset="utf8"
    )
    # 從資料庫中獲取測試資料
    testData = db.getDataFromDataBase()
    db.closeDataBase()
    return testData

@ddt.ddt
class DataDrivenByMySQL(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome(executable_path=r"F:\automation\webdriver\chromedriver.exe")

    @ddt.data(* getTestDatas())
    def test_dataDrivenByMySQL(self, data):
        # 對獲得的資料進行解包
        testData, expectData =data
        url = "http://www.baidu.com"
        self.driver.get(url)
        self.driver.maximize_window()
        print(testData, expectData)
        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 as e:
            logging.error(u"查詢的頁面元素不存在,異常堆疊資訊為:" + str(traceback.format_exc()))
        except AssertionError as e:
            logging.info(u"搜尋 ‘%s’,期望 ‘%s’ ,失敗" % (testData, expectData))
        except Exception as 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()