python接口測試框架實戰與自動化進階
?
?一、持續集成
?1、持續集成環境搭建
?1)安裝Jenkins
官網下載后直接安裝:https://jenkins.io/
?終端直接安裝及啟動:java -jar jenkins.war
2)Jenkins用于:
- 持續、自動地構建/測試軟件項目。
- l?監控一些定時執行的任務。
3)Jenkins擁有的特性包括:
- l?易于安裝-只要把jenkins.war部署到servlet容器,不需要數據庫支持。
- l?易于配置-所有配置都是通過其提供的web界面實現。
- l?集成RSS/E-mail通過RSS發布構建結果或當構建完成時通過e-mail通知。
- l?生成JUnit/TestNG測試報告。
- l?分布式構建支持Jenkins能夠讓多臺計算機一起構建/測試。
- l?文件識別:Jenkins能夠跟蹤哪次構建生成哪些jar,哪次構建使用哪個版本的jar等。
- l?插件支持:支持擴展插件,你可以開發適合自己團隊使用的工具。
?4)Jenkins操作相關指令:
# Jenkins下載安裝完成后,在終端進入安裝好的文件路徑,執行所需指令: jenkins.exe start # 啟動 jenkins.exe stop # 停止 jenkins.exe restart # 重新啟動
Jenkins啟動后,在瀏覽器上輸入:127.0.0.1:8081 進入Jenkins主頁面。
首次進入:
到安裝目錄找到所需文件:E:Jenkins/secrets/initialAdminPassword ,雙擊打開,將里面密碼輸入到下面文中。
回車進入下個頁面:安裝插件
完成后,進入下個頁面,創建管理員用戶:
接著進入實例配置頁面:
?
二、數據庫相關操作
?1、mysql相關
python3 的庫不再使用MySQLdb ,而改用pymyslq或mysqlclient。mysqlclient是MySQLdb升級版,在性能方面要比pymysql好的多,操作方面跟MySQLdb操不到
?安裝:
# python環境 pip install mysqlclient-1.3.13-cp36-cp36m-win_amd64.whl
?
2、使用方式跟MySQLdb差不多?
1)連接對象(連接數據庫)
import MySQLdb # 創建一個連接對象; conn = MySQLdb.connect(host = '127.0.0.1',port = 3306,user = 'root',passwd = '123456',db = 'test',charset = 'utf8',compress = 1,connect_timeout = 1 )
?
2)connection對象
連接對象后,支持的方法:
#方法名 # 說明 cursor() # 使用該連接創建并返回游標對象 commit() # 提交當前事務 rollback() # 回滾當前事務 begin() # 開始一個事務 close() # 關閉連接
# 創建一個游標對象; cursor = conn.cursor() print(conn) print(cursor)# 關閉游標,關閉連接; cursor.close() conn.close()
?
3)cursor對象
游標對象支持的方法:
# 參數名 # 說明 execute(op[,args]) # 執行一個數據查詢命令,返回影響行數 fetchone() # 取的結果集的下一行 fetchmany(size) # 獲取結果集的下幾行 fetchall() # 獲取結果集中剩下的所有行 rowcount # 最近一次execute返回的行數或影響行數 close() # 關閉游標對象# execute方法:執行SQL、將結果從服務端獲取到客戶端
創建表:
CREATE TABLE `user` (`userid` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(100) COLLATE utf8_bin DEFAULT NULL,PRIMARY KEY (`userid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into user select 1,'user1'; insert into user select 2,'user2'; insert into user select 3,'user3'; insert into user select 4,'user4'; insert into user select 5,'user5'; insert into user select 6,'user6'; insert into user select 7,'user7'; insert into user select 8,'user8'; insert into user select 9,'user9';
?
測試:
import MySQLdbconn = MySQLdb.connect(host = '127.0.0.1',port = 3306,user = 'root',passwd = '123456',db = 'test',charset = 'utf8',compress = 1,connect_timeout = 10 )cursor = conn.cursor()# 執行SQL; sql = "select * from user" cursor.execute(sql)# 打印影響行數(數據就是返回數據行數); rs = cursor.rowcount print("打印影響行數:",rs)# 打印第一行的數據; rs = cursor.fetchone() print("打印第一行的數據:",rs)# 打印從第二行起的三行數據; rs = cursor.fetchmany(3) print("打印從第二行起的三行數據:",rs)# 打印剩下的所有行; rs = cursor.fetchall() print("打印剩下的所有行:",rs)cursor.close() conn.close()
?
運行結果:
打印所有數據行數: 9 打印第一行的數據: (1L, u'user1') 打印從第二行起的三行數據: ((2L, u'user2'), (3L, u'user3'), (4L, u'user4')) 打印剩下的所有行: ((5L, u'user5'), (6L, u'user6'), (7L, u'user7'), (8L, u'user8'), (9L, u'user9'))
?
注:MySQLdb還可以以Json格式輸出(DictCursor),要做到這點也很簡單,那就是建立數據庫連接時傳遞cursorclass參數,或者在獲取Cursor對象時傳遞cursorclass參數即可:?
conn = MySQLdb.connect( # 建立數據庫連接時傳遞cursors參數cursorclass=MySQLdb.cursors.DictCursor )
或者:?
cursor = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)# 獲取cursor對象時傳遞cursorclass參數
?展示結果:
{'userid': 1L, 'username': 'user1'} {'userid': 2L, 'username': 'user2'}
再使用json.dumps()處理下,就變成json格式:?
{"userid": 1L, "username": "user1"} {"userid": 2L, "username": "user2"}
?
?
3、關于事務部分操作?
?對于MySQL來說,如果使用支持事務的存儲引擎,那么每次操作后,commit是必須的,否則不會真正寫入數據庫,對應rollback可以進行相應的回滾,但是commit后是無法再rollback的。commit可以在執行很多sql指令后再一次調用,這樣可以適當提升性能。
測試:
編輯一個增刪改的腳本
?
import MySQLdb conn = MySQLdb.connect(host = '127.0.0.1',port = 3306,user = 'root',passwd = '123456',db = 'test',charset = 'utf8',compress = 1,connect_timeout = 10 )cursor = conn.cursor() # 插入sql; sql_insert = "insert into user (userid,username) values (10,'user10')" # 更新sql; sql_update = "update user set username = 'name91' where userid=9" # 刪除sql; sql_delete = "delete from user where userid < 3"# 把一個事務放到一個try塊里,如果出現異常就回滾; try:# 開啟事務; conn.begin()cursor.execute(sql_insert)print(cursor.rowcount)cursor.execute(sql_update)print(cursor.rowcount)cursor.execute(sql_delete)print(cursor.rowcount) # 最近執行一次execute時,返回的行數 或 受影響的行數# 提交事務; conn.commit()# 格式化增刪改后的數據查出來;select_sql = "select * from user"cursor.execute(select_sql)rs = cursor.fetchall()for row in rs:print("userid=%s, username=%s" % row)except Exception as e:# 若有異常就回滾; conn.rollback()cursor.close() conn.close()
?
?運行結果:
1 1 2 userid=3, username=user3 userid=4, username=user4 userid=5, username=user5 userid=6, username=user6 userid=7, username=user7 userid=8, username=user8 userid=9, username=name91 userid=10, username=user10
?
如果需要批量插入數據:
# 每個值的集合為一個tuple,整個參數集組成一個tuple或者list,然后使用executemany方法來批量的插入數據 sql = "insert into user(userid,username) values(%s,%s)" param = ((100, 'user100'), (101, 'user101'), (102, 'user102') ) n = cursor.executemany(sql,param)
如果執行的SQL需要使用傳參數,就使用如下格式:
def test(table,field,value):sql="select %s from %s where %s = %s;" % (field,table,field,value)cursor.execute(sql)cursor.fetchall()
?