python3操作MySQL實現數據驅動完整實例
本篇介紹的事情:連接MySQL數據庫--操作數據庫--初始化數據--輸出結果--與selenium相結合完成數據驅動。
在平時的自動化測試中應用的數據驅動有多種方式,包含MySQL數據庫數據驅動測試、XML進行數據驅動測試、Excel進行數據驅動測試、數據文件進行數據驅動測試等。
從大多數的實際實施過程來看,主要用的是MySQL數據庫數據驅動測試、Excel進行數據驅動測試。兩者大同小異,但又各有千秋,看個人喜好,說實在的Excel數據驅動要好使一點,但是用MySQL進行數據驅動逼格更高(這是跟一個大佬交流所得的),逼格高,自然就敢要價嘍,所以嘛就學這個啦!畢竟一切都是為了錢!!!嘿嘿
一、本篇代碼的目錄結構
Mysql_Test_Data:工程名稱
DataDriverMysql.py:用於編寫執行數據驅動的測試腳本
DatabaseInit.py :用於編寫初始化數據庫的腳本
MysqlUtil.py:用於從數據庫獲取測試數據
文件的編寫先後順序:DatabaseInit.py--->MysqlUtil.py--->DataDriverMysql.py
二、文件內容詳細說明
(1)、第一個DatabaseInit.py文件內容。
1 # -*- coding: utf-8 -*-
2
3 import pymysql
4 import sys
5 from sql import *
6
7 # 初始化數據庫操作
8 class DataBaseInit():
9 def __init__(self,host,user,dbName,passwd,charset):
10 self.host = host
11 self.user = user
12 self.db = dbName
13 self.passwd = passwd
14 self.charset = charset
15 print ("--------------載入mysql模塊完成--------------")
16 def create(self):
17 try:
18 # 連接數據庫
19 con = pymysql.connect(
20 host = self.host,
21 user = self.user,
22 passwd = self.passwd,
23 charset = self.charset
24 )
25 print("創建連接完成")
26 cur = con.cursor()
27 print("獲取光標完成")
28 # 因為的數據庫已經創建完成,所以創建的過程註釋掉了。
29 # cur.execute("create database test_db character set utf8;")
30 # print("創建test_db庫完成")
31 cur.execute("use test_db;")
32 print("進入test_db庫完成")
33 except pymysql.Error as e:
34 raise e
35
36 def insertDatas(self):
37 # 連接到數據庫的指定的數據表(其實在當前情況下可以省略這個步驟,但是也不影響,就留這吧,備用)
38 try:
39 con = pymysql.connect(
40 host = self.host,
41 user = self.user,
42 db = self.db,
43 passwd = self.passwd,
44 charset = self.charset
45 )
46 # 對數據庫test_db的數據表test_tab1進行操作,增、改、刪
47 cur = con.cursor()
48 cur.execute("INSERT INTO test_db.test_tab1(id,username,pasword,studentName,age,sex,phone,bjId,gyId,ishd,iszc,isdelete) VALUES(6,‘LQ006‘,123456,‘鄧亞萍‘,35,‘女‘,17927524652,1,205,‘是‘,‘是‘,1);")
49 cur.execute("update test_db.test_tab1 SET isdelete=1 WHERE id=6;")
50 cur.execute("delete FROM test_db.test_tab1 WHERE id=6;")
51 # 對數據庫進行增、改、刪操作後需要進行commit提交操作,否則進行的操作將不會被保存。
52 con.commit()
53 print("...操作數據庫成功...")
54 except pymysql.Error as e:
55 raise e
56 if __name__ == ‘__main__‘:
57 # 數據庫連接信息
58 db = DataBaseInit(
59 host=‘localhost‘, # 數據庫連接地址
60 user=‘root‘, # 數據庫連接用戶名
61 dbName = ‘test_db‘, # 連接的數據庫
62 passwd=‘1234‘, # 連接數據庫的密碼
63 charset=‘utf8‘ # 連接數據庫的編碼,不要用utf-8,會有意想不到的結果。
64 )
65 db.create()
66 db.insertDatas()
67 print("...初始化數據結束...")
對於這個文件內容的思路已經備註。
在文中有一個創建數據表的步驟我沒寫,現在也貼出來吧,方便查看,同時明白所操作的數據表的結構:
1 創建數據表
2 cur.execute("""create table test_tab1(
3 id int primary key auto_increment comment ‘主鍵‘,
4 username varchar(100) comment ‘錄取通知書編號‘,
5 pasword varchar(100) comment ‘身份證號‘,
6 studentName varchar(100) comment ‘姓名‘,
7 age varchar(100) comment ‘年齡‘,
8 sex varchar(100) comment ‘性別‘,
9 phone varchar(100) comment ‘電話‘,
10 bjId int comment ‘班級‘,
11 gyId int comment ‘宿舍‘,
12 ishd varchar(100) comment ‘信息是否核對‘,
13 iszc varchar(100) comment ‘是否註冊‘)
14 isdelete varchar(5) comment,是否刪除)
15 comment ‘學生‘;""")
16 print(‘創建test_tab1表完成‘)
對應的創建完成的數據表長這樣:
以上文件完成了對數據庫的連接、初始化、增、刪、改操作。其中對數據庫操作的SQL語句是可以分離出來單獨存放一個文件的,留給各位自己折騰吧。
在實際工作中我們可以把對應的測試所需數據存放在數據表中,然後直接去查詢調用。維護測試數據的時候我們就直接去數據庫中進行操作就好了。
(2)、第二個MysqlUtil.py文件內容。
1 # -*- coding: utf-8 -*-
2
3 import pymysql
4 # 導入DatabaseInit文件的DataBaseInit類
5 from DatabaseInit import DataBaseInit
6
7 class ObtainResult():
8 def __init__(self,host,user,dbName,passwd,charset):
9 # 進行數據庫初始化
10 dbInit = DataBaseInit(host,user,dbName,passwd,charset)
11 dbInit.insertDatas()
12 self.con = pymysql.connect(
13 host = host,
14 user = user,
15 db = dbName,
16 passwd = passwd,
17 charset = charset
18 )
19 self.cur = self.con.cursor()
20 def getDataFromBaseas(self):
21 # 從表中查詢測試所需數據並返回查詢結果
22 self.cur.execute("SELECT studentName FROM test_db.test_tab1 WHERE id=1;")
23 dataTup = self.cur.fetchall()
24 return dataTup
25 # 數據庫的後期清理工作
26 def closeDatabase(self):
27 self.cur.close()
28 self.con.commit()
29 self.con.close()
30 if __name__ == "__main__":
31 db = ObtainResult(
32 host=‘localhost‘,
33 user=‘root‘,
34 dbName = ‘test_db‘,
35 passwd=‘1234‘,
36 charset=‘utf8‘
37 )
38 print (db.getDataFromBaseas())
39 db.closeDatabase()
第一個文件完成了對數據庫的基本操作,第二個文件主要是針對後邊的測試需要進行的操作,也就是為第三個文件做鋪墊的。在這個文件中查詢出了表中ID=1的studentName的值。
(3)、第三個DataDriverMysql.py文件。
1 # -*- coding: utf-8 -*-
2
3 from selenium import webdriver
4 import unittest,time
5 import ddt
6 import logging,traceback
7 import pymysql
8 import sys
9 from sql import *
10 from MysqlUtil import ObtainResult
11 from selenium.common.exceptions import NoSuchElementException
12
13
14 # 初始化日誌對象
15 logging.basicConfig(
16 # 定義日誌級別
17 level = logging.INFO,
18 # 定義日誌格式(包含時間、代碼所在文件夾、代碼行號、日誌級別名字、日誌信息)
19 format = ‘%(asctime)s%(filename)s[line:%(lineno)d]%(levelname)s %(message)s‘,
20 # 顯示打印日誌的時間
21 datefmt = ‘%Y/%m/%d %H:%M:%S‘,
22 # 日誌文件的存放目錄(目錄已經存在)以及日誌文件名稱
23 filename = ‘F:\Test_Case\Mysql_Test_Data\dataPreport.log‘,
24 # 定義日誌內容的打開方式
25 filemode = ‘w‘
26 )
27
28 def getTestDatas():
29 # 初始化數據庫(文件中的初始化數據的操作可以全部抽出來,單獨存放文件,調用即可)
30 db = ObtainResult(
31 host=‘localhost‘,
32 user=‘root‘,
33 dbName = ‘test_db‘,
34 passwd=‘1234‘,
35 charset=‘utf8‘
36 )
37 # 從第二個文件中獲取查詢的數據
38 testData = db.getDataFromBaseas()
39 # 關閉數據庫
40 db.closeDatabase()
41 return testData
42
43 @ddt.ddt
44 class TestDemo(unittest.TestCase):
45 def setUp(self):
46 self.driver = webdriver.Chrome(executable_path = "F:\Python\Scripts\chromedriver.exe")
47 @ddt.data( * getTestDatas())
48 def test_dataDriverDatabase(self,data):
49 # 對上邊獲取的數據進行解包供其後邊填寫使用
50 testData,sex = data
51 # 請求Baidu實例,調用Baidu進行搜索由數據庫中查到的studentName,sex值
52 url = "https://www.baidu.com/"
53 self.driver.get(url)
54 # 最大化當前窗口
55 self.driver.maximize_window()
56 print(testData,sex)
57 # 設置隱示等待時間5秒
58 self.driver.implicitly_wait(5)
59 try:
60 # 在ID=kw的Baidu搜索數據庫中輸入在數據庫中查詢到的值
61 self.driver.find_element_by_id("kw").send_keys(testData)
62 # 點擊“百度一下”按鈕
63 self.driver.find_element_by_id("su").click()
64 time.sleep(5)
65 # 斷言頁面中是否出現預期的結果
66 self.assertTrue(sex in self.driver.page_source)
67 except NoSuchElementException as e:
68 logging.error("查找的頁面信息不存在,異常的堆棧信息:"+str(traceback.format_exc()))
69 except AssertionError as e:
70 logging.info("搜索的內容:%s,預期的結果:%s,搜索失敗" %(testData,sex))
71 except Exception as e:
72 logging.error("來自未知的錯誤信息:"+str(traceback.format_exc()))
73 else:
74 logging.info("搜索的內容:%s,預期的結果:%s,搜索成功" %(testData,sex))
75
76 def tearDown(self):
77 self.driver.quit()
78 if __name__ == ‘__main__‘:
79 unittest.main()
首先,為了打印出我們所需的測試日誌,方便進行後續的執行分析,進行了初始化日誌操作並結合後邊的斷言,實現了日誌的輸出與記錄。最終執行後的日誌文件內容如下:
然後,初始化數據庫並接收到第二個文件中查詢出的所需數據。接受的內容我們進行了打印:
最後,通過selenium腳本定位的方式對Baidu進行了實例操作,並且搜索了來自第二個文件的查詢內容並判斷頁面中是否出現了我的預期結果。
至此,python3操作MySQL實現數據驅動完整實例就完成了,後邊對相關的知識點做一丟丟補充。
三、相關知識點補充。
1、關於日誌
(1)、logging 的函數
√、日誌記錄的級別:
1 logging.debug(msg, *args, **kwargs);
2 logging.info(msg, *args, **kwargs);
3 logging.warning(msg, *args, **kwargs);
4 logging.error(msg, *args, **kwargs);
5 logging.critical(msg, *args, **kwargs);
日誌級別排序: CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET。
(2)、logging.basicconfig() 函數
關於使用的實例,請在上邊第三個文件中查看。關於用法以及可選參數說明如下:
1 filename 指定日誌文件名;
2 filemode 指定日誌文件打開的模式,w 或 a;
3 level 指定日誌級別,默認 logging.WARNING;
4 format 指定輸出的格式和內容,format 的參考信息如下;
5 datefmt 使用指定的時間格式,format 參數中有 asctime 的話,需要使用 datefmt 指定格式。
(3)、關於日誌中輸出格式參數的說明與補充。
1 %(levelno)s: 打印日誌級別的數值;
2 %(levelname)s: 打印日誌級別名稱;
3 %(pathname)s: 打印當前執行程序的路徑,其實就是sys.argv[0];
4 %(filename)s: 打印當前執行程序名;
5 %(funcName)s: 打印日誌的當前函數;
6 %(lineno)d: 打印日誌的當前行號;
7 %(asctime)s: 打印日誌的時間;
8 %(thread)d: 打印線程ID;
9 %(threadName)s: 打印線程名稱;
10 %(process)d: 打印進程ID;
11 %(message)s: 打印日誌信息。
2、關於Python中對數據庫的操作
1 con = pymysql.connect(連接內容) 建立數據庫連接,返回連接對象con;
2 con.cursor() 創建遊標對象cur;
3 cur.execute(sql) 執行SQL語句;
4 cur.execute(sql,parameters) 執行帶參數的SQL語句;
5 cur.executemany(sql,seq_of_pqrameters) 根據參數執行多次SQL語句;
6 cur.executescript(sql_script) 執行SQL腳本;
7 cur.fetchone() 返回結果集的下一行,無數據時返回None;
8 cur.fetchall() 返回結果集的剩余行,無數據時返回空list;
9 cur.fetchmany() 返回結果集的多行,無數據時返回空list;
10 con.commit() 事務提交;
11 con.rollback() 事務回滾;
12 cur.close() 關閉遊標對象;
13 con.close() 關閉數據庫對象。
原創文章,歡迎轉載,表明出處,歡迎留言,共同學習,共同進步!!
python3操作MySQL實現數據驅動完整實例