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)用判斷