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