1. 程式人生 > >數據驅動測試(Python)

數據驅動測試(Python)

baidu -c 驗證碼 clas case 需要 調用 很多 element

自動化領域的兩種驅動,對象驅動與數據驅動

  • 數據驅動:測試數據的改變引起執行結果的改變 叫 數據驅動
  • 關鍵字驅動:測試對象名字的改變起引起測試結果的改變 叫 關鍵字驅動

1 、讀取文件參數化
以百度表搜索為例,我們可以通過腳本循環執行,讀取一文件中不同的內容來完成自動
化工作,也就是說我們每次取的文件裏的搜索關鍵字不同,而每次百度搜索的的結果不同,
這也是數據驅動的本質。

代碼如下:
d:\abc\data.txt
baidu_read_data.py

#coding=utf-8
from selenium import webdriver
import os,time
source = open("D:\\abc\\data.txt", "r")
values = source.readlines()
source.close()
# 執行循環
for serch in values:
browser = webdriver.Firefox()
browser.get("http://www.baidu.com")
browser.find_element_by_id("kw").send_keys(serch)
browser.find_element_by_id("su").click()
browser.quit()

這裏簡單說明一下,open 方法左以只讀方式(r)打開本地的 data.txt 文件,readlines方法是逐行的讀取文件內容。

通過 for 循環,serch 可以每次獲取到文件中的一行數據,在定位到百度的輸入框後,
將數據傳入 send_keys(serch)。這樣通過循環調用,直到文件的中的所有內容全被讀取。
2 、用戶名密碼的參數化(讀取文件)

後面的例子東一登錄百度為例,主要是讀取文件(因為百度的登錄時,需要驗證碼,所以也沒不會登錄成功)

按照上面的方法,對自動化腳本中用戶名密碼進行參數化,從目前所查到 python 讀取方法有,整個文件讀取,逐行讀取,固定字節讀取。

怎樣才一次讀取用戶名和密碼兩個信息呢,最初的修改是這樣的:

創建兩個文件,分別存放用戶名密碼
調用用戶名密碼登錄登錄的腳本

#coding=utf-8
from selenium import webdriver
import os,time
source = open("D:\\abc\\data2.txt", "r") #用戶名文件
user = source.read(5) #用戶名長度
source.close()
source2 = open("D:\\abc\\data3.txt", "r") #密碼文件
pw = source2.read(6) #密碼長度
source2.close()
driver = webdriver.Firefox()
driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")
driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()
driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)
time.sleep(3)
driver.find_element_by_id("TANGRAM__PSP_3__password").clear()
driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)
time.sleep(3)
driver.find_element_by_id("TANGRAM__PSP_3__submit").click()
time.sleep(3)
driver.close()

缺點:

雖然目的達到了這,但這樣的實現有很多問題:

  • 用戶名密碼分別在不同的文件裏,這樣就要求用戶名密碼必須一一對應
  • 必須指定讀取的長度,測試 readlines() 並不是讀取的一行數據。
  • 無法循環讀取。

3 、用戶名的參數化(字典)
用戶名密碼參數化
解決循環調用
如果固定只是讀取用戶名,密碼兩個值,可以通過如下方法實現。
創建 fun.py 文件,定義一個字典方法(方法文件和case文件放在一個根目錄下):

def zidian():
d={‘fnngj‘:‘a23456‘,‘testing360‘:123456}
print "suess read username and password!!"
return d

字典的可以方便的存放 k,v 鍵值對,一個鍵對應一個值;註意,如果密碼中有非數字,需要加單引號。

下面循環調用詞典的值:

#coding=utf-8
from selenium import webdriver
import os,time
import fun #導入函數
#循環調用字典裏的用戶名密碼,分別賦值給 k,v
for k,v in fun.zidian().items():
driver = webdriver.Firefox()
driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")
driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()
driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)
time.sleep(3)
driver.find_element_by_id("TANGRAM__PSP_3__password").clear()
driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)
time.sleep(3)
driver.find_element_by_id("TANGRAM__PSP_3__submit").click()
time.sleep(3)
driver.close()

腳本這樣表設計就穩定了很多,每次取的值非常固定,而且同樣實現了參數與腳本分離,如果幾百個腳本都調用 fun( ) 函數,當需要修改用戶名密碼時,只用修改 fun( )函數裏面字

典的值就可以了。
4 、用戶名密碼的參數化(函數)
其實,在項目中只需要做到參數化就行了,並不需要循環的讀取內容。那麽通過函數調用就可以很簡單的解決。
首先定義fun.py,(方法文件和case文件放在一個根目錄下)

def user(k=‘fnngj‘,v=123456):
  print "suess read username and password!!"
  return k,v

賦默認值,並將結果返回。

調用函數值:

#coding=utf-8
from selenium import webdriver
import os,time
#導入函數
import fun 
#通過調用函數獲得用戶名&密碼
k,v = fun.user()
print k,v
driver = webdriver.Firefox()
driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")
driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()
driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)
driver.find_element_by_id("TANGRAM__PSP_3__password").clear()
driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)
driver.find_element_by_id("TANGRAM__PSP_3__submit").click()
time.sleep(3)
driver.close()

 運行結果:

>>> =================== RESTART ================================
>>>
suess read username and password!!
fnngj 123456
.
----------------------------------------------------------------------
Ran 1 test in 25.484s
OK

數據驅動測試(Python)