python自動化測試學習筆記-5常用模塊


上一次學習了os模塊,sys模塊,json模塊,random模塊,string模塊,time模塊,hashlib模塊,今天繼續學習以下的常用模塊:

1、datetime模塊

2、pymysql模塊(3.0以上版本)

3、Redis模塊

4、flask模塊

datetime模塊

datetime中包含三個類date ,time,datetime

datetime.date:表示日期的類。常用的屬性有year, month, day;

datetime.time:表示時間的類。常用的屬性有hour, minute, second, microsecond;

datetime.datetime:表示日期時間。

1、date對象由year年份、month月份及day日期三部分構成:

例如:

a=datetime.date.today()#返回當前日期
print(a)
b=datetime.date(2018,3,23)#傳入一個日期
print(b)
print(b.year)
print(b.month)
print(b.day)

差看執行結果:

2018-01-24
2018-03-23
2018
3
23

formattimestamp()傳入一個時間戳,返回一個date對象,例如:

c=time.time()#當前時間的時間戳
d=datetime.date.fromtimestamp(c)#formtimestamp傳入一個時間戳,返回一個date對象
print(d)

差看執行結果

2018-01-24

strftime格式化,例如:

e=datetime.date.today()
f=datetime.date.today().strftime('%Y%m%d')
print(e)
print(f)

查看執行結果:

20180124

timedelta加減相應的天數
print(datetime.date.today()+datetime.timedelta(3))

查看執行結果:

2018-01-27

2、time方法主要用於時間的操作,例如

print(datetime.time.max)#時間的最大值
print(datetime.time.min)#時間的最小值
print(datetime.time(12,00,59).strftime('%H:%M:%S'))#對傳入的時間格式化

差看執行結果:

23:59:59.999999
00:00:00
12:00:59

3、datetime 類其實是可以看做是date類和time類的合體,其大部分的方法和屬性都繼承於這二個類,

print(datetime.datetime.today())
print(datetime.datetime.now())
print(datetime.datetime.today().strftime('%Y-%m-%d %H:%M:%S'))
print(datetime.datetime(2018,1,12,12,59,59))

查看執行結果:

2018-01-24 16:49:43.875425
2018-01-24 16:49:43.875425
2018-01-24 16:49:43
2018-01-12 12:59:59

datetime也可以直接來加減天數,例如:

a=datetime.datetime.today()+datetime.timedelta(-4)
print(a.strftime('%Y-%m-%d %H:%M:%S'))

查看執行結果:

2018-01-20 16:54:39

pymysql 模塊

首先確認有沒有安裝pymysql模塊

先導入pymysql模塊。如果沒有報錯,則說明已經安裝了pymysql;

import pymysql #導入

如果沒有安裝可以使用pip命令進行安裝:

pip install pymysql

對數據庫進行操作,我們需要進行以下操作步驟:

1、鏈接上mysql,使用到:IP  端口號  賬號  密碼  數據庫名稱

2、建立游標

3、執行sql

4、獲取結果

實例:

import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
res=cur.fetchall()
print(res)
cur.close()#先關閉游標
conn.close()#在關閉鏈接

查看執行結果:

((5, '123', '202cb962ac59075b964b07152d234b70'), (8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (2, 'liwang', 'd123dasd8192738127398sd123'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))
可以看到取出的數據為一個二維元組類型。

1、創建游標時,默認查詢數據為元組類型,可以指定類型為字典類型,如下:

import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor(cursor=pymysql.cursors.DictCursor)
#執行sql
cur.execute('select * from users')
# #獲取數據
res=cur.fetchall()
print(res)
print(res[2]['id'])
cur.close()#先關閉游標
conn.close()#在關閉鏈接

執行查看結果:

[{'id': 5, 'username': '123', 'passwd': '202cb962ac59075b964b07152d234b70'}, {'id': 8, 'username': '1234', 'passwd': '81dc9bdb52d04dc20036dbd8313ed055'}, {'id': 7, 'username': '222', 'passwd': 'bcbe3365e6ac95ea2c0343a2395834dd'}, {'id': 6, 'username': '234', 'passwd': '289dff07669d7a23de0ef88d2f7129e7'}, {'id': 2, 'username': 'liwang', 'passwd': 'd123dasd8192738127398sd123'}, {'id': 3, 'username': 'lwwang', 'passwd': 'd1ww23dasd8192738127398sd123'}]
可以看到結果為一個list,list中是一個個字典表。如果要查看某一個字段的值,可以直接使用列表及字典的獲取數據的方式來獲取

2、fetch的數據類型

fetch數據類型有兩種,

fetchone 只獲取一條結果,他的結果放到一個一維數組中

fetchall   獲取所有結果,他把結果放到一個二維元組

import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
res=cur.fetchone()#只獲取一條結果,他的結果放到一個一維數組
res1=cur.fetchall()#獲取所有結果,是一個二維元祖,它把每一個值放到一個元祖里,每一條數據的每一個字段存到第二個元祖
print(res)
print(res1)
cur.close()#先關閉游標
conn.close()#在關閉鏈接

查看執行結果:

(5, '123', '202cb962ac59075b964b07152d234b70')
((8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (2, 'liwang', 'd123dasd8192738127398sd123'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))

我們先執行fetchall,再執行fetchone看一下:

import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
tes=cur.fetchone()#指定游標類型,每一條取出的是一個字典,列名就是key值
res=cur.fetchall()#指定游標類型后,fetchall 取出的是一個list ,每個元素的值又是一個字典

print(res)
print(res1)
cur.close()#先關閉游標
conn.close()#在關閉鏈接

查看執行結果:

((5, '123', '202cb962ac59075b964b07152d234b70'), (8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (2, 'liwang', 'd123dasd8192738127398sd123'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))
None

我們看到上邊的執行結果:

第二個fetchone的執行結果是空,這就與游標的位置有關了;

這就需要控制游標操作來讀取數據;

3、控制游標

在fetch數據時按照順序進行,可以使用cursor.scroll(num,mode)來移動游標位置,
如: cursor.scroll(1,mode= 'relative') # 相對當前位置移動
       cursor.scroll(2,mode='absolute') # 相對絕對位置移動

實例:

import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
 
res=cur.fetchall()
cur.scroll(1,mode='absolute')
res1=cur.fetchone()
print(res)
print(res1)
 
        
cur.close()#先關閉游標
conn.close()#在關閉鏈接

查看執行結果:

((5, '123', '202cb962ac59075b964b07152d234b70'), (8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (2, 'liwang', 'd123dasd8192738127398sd123'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))
(8, '1234', '81dc9bdb52d04dc20036dbd8313ed055')

可以看到設置的1,位下標為1的位置,如果想要從頭開始讀取,可以設置為0;

import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
res=cur.fetchall()
cur.scroll(-1,mode='relative')
res1=cur.fetchone()
print(res)
print(res1)
 
        
cur.close()#先關閉游標
conn.close()#在關閉鏈接

查看執行結果:

((5, '123', '202cb962ac59075b964b07152d234b70'), (8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (2, 'liwang', 'd123dasd8192738127398sd123'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))
(3, 'lwwang', 'd1ww23dasd8192738127398sd123')

可以看到relative模式的相對路徑,設置為-1的時候,是向前移動了一個位置,如果relative模式設置為正,則是當前位置向后移動幾個位置;

import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
res=cur.fetchone()
res1=cur.fetchone()
print(res)
print(res1)
cur.close()#先關閉游標
conn.close()#在關閉鏈接

查看執行結果:

(5, '123', '202cb962ac59075b964b07152d234b70')
(8, '1234', '81dc9bdb52d04dc20036dbd8313ed055')

可以看到fetch數據的時候是依次讀取的,不是從頭讀取。讀一次取一行,運行兩次則是取第二條。

4、寫操作的時候,如insert、update、delete 語句需要commit提交操作

import pymysql
#打開倉庫大門#port 一定要寫int類型
conn=pymysql.connect(host='192.168.59.60',user='root',passwd='123456',port=3306,db='txz',charset='utf8')
#建立游標,游標你的倉庫管理員
cur=conn.cursor()
#執行sql
cur.execute('select * from users')
# #獲取數據
sql="insert into users (username,passwd) VALUES ('lizhong','asdasd123q12aasdsd');"
cur.execute(sql)
conn.commit()
cur.execute("select * from users ;")
res=cur.fetchall()
print(res)
cur.close()#先關閉游標
conn.close()#在關閉鏈接

查看執行結果:

((5, '123', '202cb962ac59075b964b07152d234b70'), (8, '1234', '81dc9bdb52d04dc20036dbd8313ed055'), (7, '222', 'bcbe3365e6ac95ea2c0343a2395834dd'), (6, '234', '289dff07669d7a23de0ef88d2f7129e7'), (11, 'lifei', 'asdasd123q12aasdsd'), (9, 'lijing', 'asdasd123q12aasdsd'), (2, 'liwang', 'd123dasd8192738127398sd123'), (12, 'lizhong', 'asdasd123q12aasdsd'), (3, 'lwwang', 'd1ww23dasd8192738127398sd123'))

可以看到,插入了我們執行sql的數據;

 

Redis緩存數據庫

要使用Redis同樣需要先安裝,導入,與pymysql操作類似:

pip install redis

導入Redis

import redis

我們都知道,數據庫分為關系型數據庫和非關系型數據庫;

非關系型數據庫就是nosql類型,沒有庫表關系,比傳統的關系型數據庫快,常用的nosql型數據庫有:

memecache :數據存在內存里 key-value 形式

redis: 數據存在內存里,用來提高性能

MongoDB:數據存在磁盤上

對redis進行操作,可以在客戶端直接操作,也可以通過python鏈接redis進行操作。

1、客戶端操作

客戶端操作可以下載redis-desktop-manager軟件。

安裝成功后,建立鏈接(要鏈接redis 首先保證redis服務器是運行狀態。):

 如果出現鏈接失敗,的情況,如下:

需要做下面的事:

在redis.conf配置文件中,進行如下配置,

注釋掉 bind 127.0.0.1

設置密碼:

requirepass xxxxxxx

設置密碼 為了安全一定要設,而且這里如果不綁定ip也不設密碼的話,redis是默認保護模式,只能本虛擬機訪問,不允許其他ip訪問

保存配置文件,重啟redis服務,查看虛擬機ip;

重新進行鏈接:鏈接成功

redis默認有16個DB,可以通過界面來添加相應數據:

2、python操作

通過腳本操作redis:

1、導入redis模塊

2、鏈接redis

3、操作redis

對於關閉redis的問題,不需要手動關閉redis,

參考原因:當我們用Redis和StrictRedis創建連接時,其實內部實現並沒有主動給我創建一個連接,我們獲得的連接是連接池提供的連接,這個連接由連接池管理,所以我們無需關注連接是否需要主動釋放的問題。另外連接池有自己的關閉連接的接口,一旦調用該接口,所有連接都將被關閉。

通過客戶端我們也可以看到,redis是一個key-value存儲系統,支持的value類型:string,list,set,zset(有序集合),hash(哈希類型)

我們先來創建一個redis鏈接:

實例:

import  redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,passwd='123456',db=3)

string類型

對redis進行操作,我們可以使用set()添加數據,get()獲取數據,delete()刪除數據;

如下:

 import redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
#添加數據
r.set('test','123456')
#獲取數據
res=r.get('test')
print(res)
#刪除數據
r.delete('test')

查看執行結果:

 

獲取數據的結果:

b'123456'

刪除數據結果:

我們看到上面獲取數據的時候返回的是一個b‘123456’,屬於bytes類型,在我們的日常操作中bytes類型很不方便,說以我們可以轉化成字符串類型方便操作。

decode方法是將bytes類型轉化成字符串類型

例如:

import  redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
#添加數據
r.set('test','123456')
#獲取數據
res=r.get('test')
print(res.decode())

查看執行結果:

123456

添加數據后,我們在后台管理界面可以看到一個TTL的值是-1,這個字段是來控制失效時間的,默認的set的數據是永久有效的,如果要設置失效時間可以用setex來設置,如下:

import  redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
#添加數據
r.setex('pei_session','abcdefghijk','20')
#獲取數據
res=r.get('pei_session')
print(res.decode())

查看執行結果:

abcdefghijk

查看客戶端:顯示TTL時間剩余9秒,超過20秒之后重新加載db3,已經找不到pei_session這條數據了:

20以后:

 

上面用到的set(),get(),delete(),setex()都是針對string類型的,K -V模式(redis里邊的string類型);

我們常用到的redis數據類型還有hash類型

hash類型

對於hash類型的操作要使用hset(),hget(),hgetall(),例如:

hset(name,key,value):存儲字典 

    • name:鍵
    • key:字典的key
    • value:字典的值
import  redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
#添加數據
r.hset('user','wang','123456')
#獲取數據
res=r.hget('user','wang')
print(res.decode())

查看執行結果:123456

查看客戶端展示形式

 

 

當哈希表中有多條數據的時候獲取出來,展示的是一個字典表:

 import redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
#獲取數據
res=r.hgetall('user')
print(res)

查看執行結果

{b'li': b'123456', b'zhao': b'123456', b'wang': b'123456', b'he': b'123456'}

如果要把每一個key 和 value 都轉換成字符串可以循環取值:

import  redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
redis_data=r.hgetall('user')
all_dat={}
for k,v in redis_data.items():#取出k ,v
k=k.decode()
v=v.decode()
all_dat[k]=v
print(all_dat)

查看執行結果:

{'he': '123456', 'li': '123456', 'wang': '123456', 'zhao': '123456'}

如果要添加文件夾的話可以用:來控制,例如:

import  redis
#鏈接redis
r=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
r.set('file:log','123456')
r.set('file:img:001','001')

查看執行結果:

 

對hash類型的也可以建多個文件夾:

r.hset('info:user:name','wang','123456')

查看執行結果:

 

keys()獲取所有的key值:

print(r.keys())#獲取所有的key,是一個list

查看執行結果:

[b'info:user:name', b'user', b'file:log', b'file:img:001', b'test', b'file:data:ok']

可以用*通配符進行模糊查詢:

print(r.keys('*user*'))

查看執行結果:

[b'info:user:name', b'user']

type()獲取key的類型:

print(r.type('user'))
print(r.type('file:data:ok'))

查看執行結果:

b'hash'
b'string'

下面來做一個小程序,實現redis的數據遷移:

分析:1、需要鏈接兩個redis

           2、取出第一個redis的key,判斷key的類型

           3、取出redis的值,然后set進第二個redis

           4、如果是hash類型的,需要再循環一次取出值

 

實例:

import redis

r1=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=3)
r2=redis.Redis(host='192.168.59.60',port=6379,password='123456',db=4)
ex_listkey=r1.keys()
#print(ex_listkey)
for key in ex_listkey:
if r1.type(key)==b'string':
r1_v=r1.get(key)
r2.set(key,r1_v)
elif r1.type(key)==b'hash':
r1_hash=r1.hgetall(key)
for k,v in r1_hash.items():
r2.hset(key,k,v)
else:
print('類型不考慮')

 

查看執行結果:

db3中的數據已經遷移到了db4中;

4、flask模塊

在使用flask模塊之前我們先來了解一下mock技術,

mock測試就是在測試過程中,對於某些不容易構造或者不容易獲取的對象,用一個虛擬的對象來創建以便測試的測試方法。

什么情況下會使用mock技術:

1、被測代碼中需要依賴第三方接口返回值進行邏輯處理,可能因為網絡或者其他環境因素,調用第三方經常會中斷或者失敗,無法對被測單元進行測試,這個時候就可以使用mock技術來將被測單元和依賴模塊獨立開來,使得測試可以進行下去。

2、被測單元依賴的模塊尚未開發完成,而被測單元需要依賴模塊的返回值進行后續處理

3、 被測單元依賴的對象較難模擬或者構造比較復雜

下面我們就用flask模塊來實現。

要使用flask模塊首先要安裝,導入:

pip install flask

import flask#導入

Flask是一個使用 Python 編寫的輕量級 Web 應用框架。可以給web前台提供后台服務。

1、獲取一個類似句柄的東西app,所有的操作都要通過app來執行,通俗的說就是把當前的文件當做一個后台服務

2、設置一個簡單的URL :訪問路徑,這個URL是提供給web前台的接口,有了接口,我們也得提供接口內容。

3、在URL下設計一個函數 def func()

4、啟動整個程序 app.run(port=9999)

實例:

  import pymysql
import redis
def op_mysql(host,user,passwd,db,sql,port=3306,charset='utf8'):
conn=pymysql.connect(host=host,user=user,passwd=passwd,port=port,db=db,charset=charset)
cur=conn.cursor(cursor=pymysql.cursors.DictCursor)
cur.execute(sql)
sql_start=sql[:6].upper()
if sql_start=='SELECT':#sql的前6位,判斷它是什么類型的語句。
res=cur.fetchall()
else:
conn.commit()
res='ok'
cur.close()
conn.close()
return res

 

 

 

import flask
from tools import op_mysql#之前定的一個方法
import json

app=flask.Flask(__name__)
@app.route('/get_user',methods=['get','post'])
def get_alluser():
sql='select * from users'
res=op_mysql(host='192.168.1.105',user='root',passwd='123456',port=3306,db='test',sql=sql,charset='utf8')
response=json.dumps(res,ensure_ascii=False)
return response

app.run(port=8888,debug=True)

運行:

 

輸入地址,拼接路徑就可以獲取到數據:

http://127.0.0.1:8888/get_user

 

 這樣就完成了一個接口的開發。

標准的程序框架設置,是下面這種形式:

說明:

為了使邏輯更清晰
一般readme文件會說明程序的使用規則,如下:
#這個程序是xxx接口
#依賴 flask pysmysql python3
#pip install flask
#pip install pymysql
#python bin/start.py
conf 文件夾下主要存放配置文件
lib 目錄用來寫主邏輯
bin 目錄存放啟動文件start.py
接下來就可以進入到程序開發階段了~

 


免責聲明!

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



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