寶哥專欄丨自動化測試框架-script測試腳本設計
script目錄創建時選擇“Python Package”格式。測試引擎腳本存放路徑,如測試執行時驅動所有測試業務、測試用例的腳本文件module.py。
module.py包含測試集讀取函數read_testsuite、獲取驅動函數get_driver、測試用例讀取函數read_testcase、測試執行函數exec_script。
1.read_testsuite
read_testsuite函數負責解析測試場景文件。os.path.abspath方法獲取當前腳本的執行路徑,以便于data目錄中的testsuite.xlsx測試場景文件。通過引用os.path方式,增強了腳本的可移植性。
測試腳本代碼用for irow in range(2, ws.max_row + 1)循環迭代讀取測試場景文件testsuite.xlsx中的每一行記錄,通過傳入的測試場景名稱,先判斷是否存在需測試的場景名稱,如果有則再用if testoperation=='do'判斷是否要獲取第三項中保存的場景文件名。這里關鍵字do代表的是執行,第二列的關鍵字可以根據將來的需要進一步拓展,設計更多的關鍵字。
read_testsuite代碼如下:
#創建讀取測試集函數
def read_testsuite(tsname):
#設置測試用例讀取執行狀態標志位
flag = True
#設置讀取測試集函數執行狀態標志位
read_testsuite = True
#判斷測試集文件是否存在
if os.path.exists(tsname):
#如果存在則寫入日志
http://logger.info('已找到TestSuite文件,開始分析測試集...')
#創建excel操作對象
wbexcel = load_workbook(tsname)
sheetnames = wbexcel.get_sheet_names()
ws = wbexcel.get_sheet_by_name(sheetnames[0])
#分析測試集文件中的執行信息:執行標志位及測試腳本名稱,從第二行開始
for irow in range(2,ws.max_row+1):
#獲取測試集文件中的執行標志位值,從第二行開始,第二列
testoperation = ws.cell(row=irow, column=2).value
#獲取測試集文件中的測試用例名稱,從第二行開始,第三列
testcasefile = ws.cell(row=irow, column=3).value
#判斷執行標志位是否需要執行,如果是do,則調用測試用例執行函數,如果是not,則不執行,如果是其他
#值,則寫入日志,報告執行參數錯誤,并指出是哪個用例執行參數錯誤
if testoperation == 'do':
http://logger.info('******************************')
http://logger.info('執行 %s 測試場景' %testcasefile )
#加載測試用例讀取函數,并返回其返回值,以判斷用例讀取情況
flag=read_testcase(testcasefile)
#如果用例讀取函數返回為False,則說明用例讀取錯誤
if flag==False:
http://logger.info('測試用例執行失敗')
#如果執行狀態為not,說明當前用例無須執行
elif testoperation == 'not':
http://logger.info('%s 場景無須測試' % testcasefile)
#如果既不是do,又不是not,則報告錯誤
else:
http://logger.info('執行參數錯誤,請檢查%s' %testcasefile)
#如果執行狀態錯誤,則跳出循環,停止測試
break
#如果測試集文件錯誤,則寫入日志,并提示錯誤原因
else:
http://logger.info('未發現:%s,請檢查文件是否正確' % tsname)
#返回測試集執行函數狀態,便于run.py中的unittest中記錄該狀態
read_testsuite = False
#返回測試集執行函數執行狀態
return read_testsuite
2.get_driver
根據測試場景文件確定調用何種瀏覽器,并啟動瀏覽器。
#定義瀏覽器啟動函數,本次并沒有使用common中定義的browserlauncher函數,讀者可自行擴展改寫
def get_driver(testpage,teststep,testdata):
#設置瀏覽器啟動函數執行狀態,便于后續運行控制
get_driver = True
#判斷測試用例中是否需要啟動瀏覽器,如果需要,則判斷啟動哪種瀏覽器
if testpage == '瀏覽器':
#考慮測試用例中的step大小寫問題,讀者自行研究解決
if teststep == 'firefox':
driver = webdriver.Firefox()
elif teststep == 'ie':
driver = webdriver.Ie()
elif teststep == 'chrome':
driver = webdriver.Chrome()
#如果瀏覽器類型設置錯誤,寫入日志并給予提示
else:
http://logger.info('未知瀏覽器類型,請檢查測試用例')
#啟動沒有問題后加載測試路徑并返回driver對象
driver.get(testdata)
get_driver = driver
else:
#如果測試用例中的啟動參數錯誤,則寫入日志并給予提示
http://logger.info('瀏覽器數據錯誤,請檢查測試用例配置')
get_driver = False
return get_driver
3.exec_script
exec_script(testpage,teststep,testaction,testdata)功能是接受testpage,teststep,testdata三個參數,分別代表主頁類(對象),頁面元素,頁面數據。代碼首先判斷主頁類(testpage)屬于那個類,這些類是已經實現的page object類。testpage類中有一個是瀏覽器類,是Webdriver實現的。腳本分別實現了三個類的testpage判斷,分別是瀏覽器、登陸頁面類、主頁頁面類三個類。
第一個根據testpage是否是瀏覽器類后,按照teststep判斷瀏覽器類型firefox、IE及chrome生成對象實例,最后請求testdata變量保存的網頁鏈接。
第二個根據testpage是否是登陸頁面類后,判斷執行teststep用戶名或密碼等動作,來執行頁面對象的操作,操作數據用傳入的testdata.
第二個根據testpage是否是主頁頁面類后,判斷teststep是否執行退出ECShop動作。
exec_script代碼如下:
#定義測試用例執行函數,共有四個參數
def exec_script(driver,testpage, teststep, testdata):
#定義測試用例執行函數狀態標志位
exec_script = True
try:
#登陸功能測試
if testpage == '登錄':
url = driver.current_url
url = geturl(url) + 'user.php'
if driver.current_url != url:
driver.get(url)
login = LoginPage(driver, testdata)
if teststep == '用戶名':
login.input_username(testdata)
if teststep == '密碼':
login.input_password(testdata)
if teststep == '登錄':
login.click_submit()
time.sleep(5)
#注冊功能測試
if testpage == '注冊':
url = driver.current_url
url = geturl(url) + 'user.php?act=register'
if driver.current_url != url:
driver.get(url)
userreg = RegistePage(driver, testdata)
if teststep == '用戶名':
userreg.input_username(testdata)
if teststep == 'email':
userreg.input_email(testdata)
if teststep == '密碼':
userreg.input_password(testdata)
if teststep == '確認密碼':
userreg.input_comfirpwd(testdata)
time.sleep(8)
if teststep == '注冊':
userreg.click_submit()
time.sleep(5)
if testpage == '主頁':
time.sleep(3)
url = driver.current_url
mainpage = MainPage(driver, url)
if teststep == '搜索':
mainpage.search_goods(testdata)
time.sleep(3)
if teststep == '購買':
mainpage.buy_goods()
time.sleep(3)
if teststep == '退出':
mainpage.exit_sys()
time.sleep(3)
if testpage == '其他主頁':
pass
except:
exec_script = False
url = geturl(driver.current_url)
driver.get(url)
return exec_script
4.read_testcase
read_testcase(testcasefile)是解析testcase文件如login.xlsx,userregister.xlsx等,參數是測試用例文件路徑。for irow in range(2, ws.max_row + 1)是從第二行開始遍歷,ws.max是獲得測試用例文件有測試腳本指令的行數,參數從2開始,是因為第一行是標題,第二行開始才是正式腳本。Testpage,teststep,testdata分別保存了測試用例文件(userregister.xlsx,login.xlsx)中的page,step,data數據,它們代表了頁面類,元素對象,元素數據。然后作為參數傳給exec_script函數。
read_testcase代碼如下:
#定義測試用例讀取函數
def read_testcase(testcasefile):
#設置測試用例讀取函數狀態標志位
read_testcase = True
#根據read_testsuite函數中給出的testcasefile測試用例名,拼接測試用例路徑信息
testcasefile=os.path.abspath('.')+'data'+testcasefile+'.xlsx'
#判斷需讀取執行的測試用例文件是否存在
if os.path.exists(testcasefile):
#如果存在,則寫日志,并讀取該用例的excel文件
http://logger.info('已找到 %s 測試用例,現在開始讀取該用例' %testcasefile)
wbexcel = load_workbook(testcasefile)
sheetnames = wbexcel.get_sheet_names()
ws = wbexcel.get_sheet_by_name(sheetnames[0])
#讀取測試用例中每個列的值,以便調用瀏覽器啟動函數或執行測試用例函數
for irow in range(2, ws.max_row + 1):
testpage = ws.cell(row=irow, column=1).value
teststep = ws.cell(row=irow, column=2).value
testdata = ws.cell(row=irow, column=4).value
#如果是瀏覽器,說明需啟動瀏覽器,調用瀏覽器啟動函數
if testpage=='瀏覽器':
http://logger.info('正在啟動瀏覽器')
testdriver=get_driver(testpage, teststep, testdata)
else:
#如果不是瀏覽器,則說明需執行測試用例,調用測試用例執行函數
flag=exec_script(testdriver,testpage, teststep, testdata)
#執行完成后退出瀏覽器
testdriver.quit()
else:
#如果測試用例文件不存在,則寫入日志,并提示檢查文件是否存在
http://logger.info('未發現 %s 測試用例,請確認該用例是否存在' %testcasefile)
#測試用例讀取失敗,狀態標志位設置為False
read_testcase = False
#返回測試用例讀取函數的狀態,便于read_testsuite函數調用判斷
