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函數調用判斷