Python&Selenium 資料驅動【unittest+ddt+mysql】
阿新 • • 發佈:2018-12-07
一、摘要
本博文將介紹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( IDint 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()