一篇文章快速教你如何搭建數據驅動自動化測試框架?

測試架構師百里 發佈 2022-06-24T20:41:05.367349+00:00

前言說到數據驅動自動化測試,你會不會有這樣的疑問:數據怎麼管理?數據怎麼才能驅動測試用例執行?到底怎麼樣才算數據驅動?

前言

說到數據驅動自動化測試,你會不會有這樣的疑問:數據怎麼管理?數據怎麼才能驅動測試用例執行?到底怎麼樣才算數據驅動?那麼本篇文章就教你如何進行數據驅動測試,相信你一定能對數據驅動的自動化測試有一個不一樣的理解,希望這篇文章能幫助還在懵懵懂懂的你了解數據驅動測試,如何來做數據驅動測試?那麼就跟上我的腳步吧^_^

一、項目介紹

地址:https://www.126.com/

1.實現126郵箱登錄功能的驗證

2.實現126郵箱添加新聯繫人功能的驗證

二、目錄結構

三、項目源碼

1.新建config目錄存放和業務無關的數據文件,比如PageElementLocator.ini 用來存放我們每個頁面的定位元素表達式。

[126mail_login]
loginPage.frame=xpath>//div[@id='loginDiv']/iframe
loginPage.username=xpath>//input[@name='email']
loginPage.password=xpath>//input[@name='password']
loginPage.loginBtn=xpath>//a[@id='dologin']
[126mail_homePage]
HomePage.addressbook=id>_mail_tabitem_1_4text
[126mail_addContactPage]
addContactPage.newContact=xpath>//span[text()='新建聯繫人']
addContactPage.newName=id>input_N
addContactPage.newMail=xpath>//div[@id='iaddress_MAIL_wrap']//input[@class='nui-ipt-input']
addContactPage.newMark=xpath>//span[@class='nui-chk-text']/preceding-sibling::span/b
addContactPage.newPhone=xpath>//div[@id='iaddress_TEL_wrap']//input[@class='nui-ipt-input']
addContactPage.newComment=id>input_DETAIL
addContactPage.newCommit=xpath>//span[text()='確 定']

2.有了上面元素的表達式我們又該如何查找我們的元素呢?這時候我們需要封裝一套無論何種定位方式都可以使用的通用的查找方法。新建util目錄(util目錄主要存放和我們業務無關的公共方法),此目錄下新建ObjectMap.py文件

from selenium.webdriver.support.wait import WebDriverWait
 
  def getElement(driver, by, locate):
     '''
      查找單一個元素
      :param driver: 瀏覽器驅動
      :param by: 定位方式,id, name, class, xpath...
      :param locate: 定位表達式
      :return: 元素
     '''
     try:
         element = WebDriverWait(driver, 30).until(lambda x :x.find_element(by, locate))
     except Exception as e:
        raise e
     else:
         return element
 def getElelments(driver, by, locate):
     '''
     查找一組元素
     :param driver: 瀏覽器驅動
     :param by: 定位方式
     :param locate: 定位表達式
     :return: 一組元祖組成的列表
     '''
     try:
         elements = WebDriverWait(driver, 30).until(lambda x :x.find_elements(by, locate))
     except Exception as e:
         raise e
     else:
         return elements
 if __name__=='__main__':
     from selenium import webdriver
     driver = webdriver.Firefox()
     driver.get('http://www.baidu.com')
     inputBaidu = getElement(driver, 'id', 'kw')
     inputBaidu.send_keys('python')

3.定位表達式有了,查找元素的方法封裝好了,下面我們需要解析配置文件,獲取配置文件中我們需要的定位方式和定位表達式。同樣在util目下新建ParseConfigurationFile.py文件用來解析配置文件

from config.varCondig import pageElementLocatorPath
 2 import configparser
 3 
 4 class ParseConfigFile(object):
 5     '''
 6     解析ini配置文件
 7     '''
 8     def __init__(self):
 9         try:
10             self.cf = configparser.ConfigParser() # 獲取配置文件對象
11             self.cf.read(pageElementLocatorPath, encoding='utf-8') # 加載配置文件到內存中
12         except Exception as e:
13             raise e
14 
15     def getItemsSection(self, sectionName):
16         '''
17         獲取section下面所有section的鍵值
18         :param sectionName:
19         :return:
20         '''
21         try:
22             vlaues = dict(self.cf.items(sectionName))
23         except Exception as e:
24             raise e
25         else:
26             return vlaues
27 
28     def getElementValue(self, sectionName, optionName):
29         try:
30             locator = self.cf.get(sectionName, optionName).split('>')
31         except Exception as e:
32             raise e
33         else:
34             return locator # 獲取option鍵對應的value
35 
36     def getAllSections(self):
37         try:
38             allsections = self.cf.sections()
39         except Exception as e:
40             raise e
41         else:
42             return allsections # 所有的sections返回值是個列表
43 
44     def getAllOptions(self, section):
45         try:
46             options = self.cf.options(section)
47         except Exception as e:
48             raise e
49         else:
50             return options # 某個section下面的鍵
51 
52 if __name__=='__main__':
53     cf = ParseConfigFile()
54     locator = cf.getElementValue('126mail_login','loginPage.username')
55     # print(locator)
56     print(cf.getItemsSection('126mail_login'))
57     print(cf.getAllSections())
58     print(cf.getAllOptions('126mail_addContactPage'))

4.我們獲取到了每一個元素的定位方式和定位表達式,接下來我們又該如何查找到我們的元素對象呢?這時候我們會想到PO(pageObject)設計模式,把我們每一個page頁面的元素保存到對應頁面的文件中。

新建pageObjects目錄,在此目錄下分別創建HomePage.py LoginPage.py NewContact.py 三個頁面文件

LoginPage.py文件存放我們登錄頁面所需要的元素, HomePage.py 存放登錄成功後首頁所需要的頁面元素, NewContact.py文件存放我們添加聯繫人頁面所需要的元素。

from util.ObjectMap import *
 2 from util.ParseConfigurationFile import ParseConfigFile
 3 class LoginPage(object):
 4     '''
 5     登錄頁面所有的操作元素對象
 6     '''
 7     def __init__(self, driver):
 8         self.driver = driver
 9         self.cf = ParseConfigFile()
10 
11     def switchToFrame(self):
12         '''
13         切換到frame中
14         :return:
15         '''
16         by, locator = self.cf.getElementValue('126mail_login', 'loginPage.frame')
17         try:
18             self.driver.switch_to.frame(getElement(self.driver, by,locator))
19         except Exception as e:
20             raise e
21 
22     def switchToDefaultFrame(self):
23         '''
24         跳出frame
25         :return:
26         '''
27         try:
28             self.driver.switch_to.default_content()
29         except Exception as e:
30             raise e
31 
32     def userNameObj(self): # 用戶名輸入框
33         by, locator = self.cf.getElementValue('126mail_login', 'loginPage.username')
34 
35         username = getElement(self.driver, by, locator)
36         return username
37 
38     def passwordObj(self): # 密碼輸入框
39         by, locator = self.cf.getElementValue('126mail_login', 'loginPage.password')
40 
41         password = getElement(self.driver, by, locator)
42         return password
43 
44     def loginBtnObj(self): # 登錄按鈕
45         by, locator = self.cf.getElementValue('126mail_login', 'loginPage.loginBtn')
46 
47         loginbtn = getElement(self.driver, by, locator)
48         return loginbtn
49 
50 if __name__=='__main__':
51     from selenium import webdriver
52     import time
53     driver = webdriver.Firefox()
54     driver.get('https://mail.126.com')
55     login = LoginPage(driver)
56     time.sleep(5)
57     login.switchToFrame()
58     login.userNameObj().send_keys('linuxxiaochao')
59     login.passwordObj().send_keys('xiaochao11520')
60     login.loginBtnObj().click()
61     login.switchToDefaultFrame()
62     driver.quit()from util.ObjectMap import * #查找元素的模塊
 2 from util.ParseConfigurationFile import ParseConfigFile
 3 
 4 class HomePage(object):
 5 
 6     def __init__(self, driver):
 7         self.driver = driver
 8         self.cf = ParseConfigFile()
 9 
10     def addressLink(self):
11         '''
12         通訊錄菜單對象
13         :return:
14         '''
15         by, locator = self.cf.getElementValue('126mail_homePage','homePage.addressbook')
16 
17         elementObj = getElement(self.driver, by, locator)
18         return elementObj
19 
20 if __name__=='__main__':
21     from selenium import webdriver
22     from pageObjects.LoginPage import LoginPage
23     import time
24     driver = webdriver.Firefox()
25     driver.get('https://mail.126.com')
26     login = LoginPage(driver)
27     homePage = HomePage(driver)
28     time.sleep(5)
29     login.switchToFrame()
30     login.userNameObj().send_keys('linuxxiaochao')
31     login.passwordObj().send_keys('xiaochao11520')
32     login.loginBtnObj().click()
33     login.switchToDefaultFrame()
34     time.sleep(3)
35     homePage.addressLink().click()
36     time.sleep(10)
37     driver.quit()from util.ParseConfigurationFile import ParseConfigFile
 2 from util.ObjectMap import *
 3 
 4 class AddContactPage(object):
 5     '''
 6     添加聯繫人頁面所有操作元素對象
 7     '''
 8     def __init__(self, driver):
 9         self.driver = driver
10         self.cf = ParseConfigFile()
11 
12     def newContact(self): # 新建聯繫人
13         by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newContact')
14 
15         element = getElement(self.driver, by, locator)
16         return element
17 
18     def addName(self): # 姓名輸入框
19         by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newName')
20 
21         element = getElement(self.driver, by, locator)
22         return element
23 
24     def addMail(self): # 電子郵件輸入框
25         by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newMail')
26 
27         element = getElement(self.driver, by, locator)
28         return element
29 
30     def markStar(self): # 設為星際聯繫人
31         by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newMark')
32 
33         element = getElement(self.driver, by, locator)
34         return element
35 
36     def addPhone(self): # 手機號碼輸入框
37         by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newPhone')
38 
39         element = getElement(self.driver, by, locator)
40         return element
41 
42     def addContent(self): # 備註
43         by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newComment')
44 
45         element = getElement(self.driver, by, locator)
46         return element
47 
48     def clickCommitBtn(self): # 確定按鈕
49         by, locator = self.cf.getElementValue('126mail_addContactPage', 'addContactPage.newCommit')
50 
51         element = getElement(self.driver, by, locator)
52         return element
53 
54 if __name__=='__main__':
55     from selenium import webdriver
56     import time
57     from pageObjects.HomePage import HomePage
58     from appModules.LoginAction import LoginAction
59 
60     driver = webdriver.Firefox()
61     driver.get('https://mail.126.com')
62     time.sleep(3)
63     # 登錄
64     LoginAction.login(driver,'linuxxiaochao', 'xiaochao11520')
65     # 主頁面
66     homepage = HomePage(driver)
67     homepage.addressLink().click()
68     time.sleep(5)
69     # 添加聯繫人頁面
70     addcontact = AddContactPage(driver)
71     addcontact.newContact().click()
72     time.sleep(2)
73     addcontact.addName().send_keys('test')
74     addcontact.addMail().send_keys('13691579846@qq.com')
75     addcontact.addPhone().send_keys('13691579846')
76     addcontact.addContent().send_keys('ceshi')
77     addcontact.markStar().click()
78     time.sleep(3)
79     addcontact.clickCommitBtn().click()

5.接下來考慮,我們的框架需要數據驅動?那麼我們該怎麼用數據驅動我們測試呢?是不是應該通過修改測試數據能夠控制我們用例的執行還是不執行呢?沒錯,大概就是這個樣子,那我們又該如何來設計我們的數據呢?大概最好的辦法就是使用excel文件來存儲或者如果你有能力可以考慮使用資料庫來存儲,看下我們的表格是什麼樣子。

新建testData目錄存放我們測試過程中所有和業務數據相關的數據文件,並新建126MailContact.xlsx 文件,文件中分兩個sheet 126account 和 126contact 分別存放登錄和聯繫人數據


6.通過上面的表我們可以看到兩列數據「是否執行」,沒錯了我們就是通過這來控制數據是否驅動用例執行的,用例執行後寫入測試是否通過和測試執行時間(代碼中我沒加寫入時間,感興趣的自己在用例只加就行了)

7.有了這些數據我們又該如何讀取到這些數據應用到我們的用例中呢?在util目錄下新建ParseExcel.py 用來解析excel文件

from openpyxl import load_workbook
 2 from config.varCondig import *
 3 class ParseExcel(object):
 4     '''
 5     解析excel文件的封裝
 6     '''
 7     def __init__(self):
 8         # 加載excel文件到內存
 9         self.wb = load_workbook(testExcelValuePath)
10 
11     def getRowValue(self, sheetName, rawNo):
12         '''
13         獲取某一行的數據
14         :param sheetName:
15         :param rawNo:
16         :return: 列表
17         '''
18         sh = self.wb[sheetName]
19         rowValueList = []
20         for y in range(2, sh.max_column+1):
21             value = sh.cell(rawNo,y).value
22             rowValueList.append(value)
23         return rowValueList
24     def getColumnValue(self, sheetName, colNo):
25         '''
26         獲取某一列的數據
27         :param sheetName:
28         :param colNo:
29         :return: 列表
30         '''
31         sh = self.wb[sheetName]
32         colValueList = []
33         for x in range(2, sh.max_row +1):
34             value = sh.cell(x, colNo).value
35             colValueList.append(value)
36         return colValueList
37 
38     def getCellOfValue(self, sheetName, rowNo, colNo):
39         '''
40         獲取某一個單元格的數據
41         :param sheetName:
42         :param rowNo:
43         :param colNo:
44         :return: 字符串
45         '''
46         sh = self.wb[sheetName]
47         value = sh.cell(rowNo, colNo).value
48         return value
49     def writeCell(self, sheetName, rowNo, colNo, value):
50         '''
51         向某個單元格寫入數據
52         :param rowNo: 行號
53         :param colNo: 列號
54         :param value:
55         :return: 無
56         '''
57         sh = self.wb[sheetName]
58         sh.cell(rowNo, colNo).value = value
59         self.wb.save(testExcelValuePath)
60 if __name__=='__main__':
61     p = ParseExcel()
62     print(p.getRowValue('126account',2))
63     print(p.getColumnValue('126account',3))
64     print(p.getCellOfValue('126account', 2, 3))

8.在config目錄下新建varConfig.py文件來存儲一些目錄信息和數據表對應的列號

 1  import os
 2 
 3 # print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 4 # 項目目錄
 5 parentDirPath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 6 # init文件路徑
 7 pageElementLocatorPath = parentDirPath+r'\config\PageElementLocator.ini'
 8 # excel文件路徑
 9 testExcelValuePath = parentDirPath+r'\testData\126MailContact.xlsx'
10 # 日誌文件存放路徑
11 logPath = parentDirPath + r'\log'
12 
13 # 126username 表,每列對用的序號
14 account_userName = 2
15 account_passWord = 3
16 account_dataBook = 4
17 account_isExecute = 5
18 account_testResult = 6
19 
20 # 126聯繫人表,每列對應的序號
21 contact_contactName = 2
22 contact_contactMail = 3
23 contact_contactStar = 4
24 contact_contactPhone = 5
25 contact_contactComment = 6
26 contact_contactKeyWords = 7
27 contact_contactIsExcute = 8
28 contact_contactExcuteTime = 9
29 contact_contactTestResult = 10
30 
31 if __name__=='__main__':
32 
33     print(pageElementLocatorPath)
34     print(testExcelValuePath)
35     print(logPath)

9.所有的數據已經準備完全,我們可以編寫用例了把?等等! 我們是不是要考慮把業務功能封裝一下呢?這樣也方便以後依賴這些功能的用例直接調用!新建目錄appModules 此目錄用來存放業務功能代碼,

目錄下新建LoginAction.py 和 AddContact.py 文件

# 封裝登錄方法
 2 
 3 from pageObjects.LoginPage import LoginPage
 4 class LoginAction(object):
 5     def __init__(self):
 6         pass
 7 
 8     @staticmethod #
 9     def login(driver, username, password):
10         '''
11         登錄場景
12         :param driver:
13         :param username:
14         :param password:
15         :return:
16         '''
17         login = LoginPage(driver)
18         login.switchToFrame()
19         login.userNameObj().send_keys(username)
20         login.passwordObj().send_keys(password)
21         login.loginBtnObj().click()
22         login.switchToDefaultFrame()
23 
24 if __name__=='__main__':
25     from selenium import webdriver
26     driver = webdriver.Firefox()
27     driver.get('https://mail.126.com')
28     LoginAction.login(driver, 'linux', 'chao')   from pageObjects.HomePage import HomePage
 2 from pageObjects.NewContact import AddContactPage
 3 from selenium.webdriver.support.wait import WebDriverWait
 4 from selenium.webdriver.support import expected_conditions as EC
 5 from util.ParseConfigurationFile import ParseConfigFile
 6 
 7 class NewContactPersonAction(object):
 8     def __init__(self):
 9         pass
10 
11     @staticmethod
12     def addressLink(driver):
13         '''
14         點擊通訊錄按鈕
15         :param driver:
16         :return:
17         '''
18         homePage = HomePage(driver)
19         # 點擊通訊錄
20         homePage.addressLink().click()
21     @staticmethod
22     def addContact(driver, contactName, contactMail, isSatr, contactPhone, contactComment):
23         '''
24         添加聯繫人場景
25         :param driver:
26         :param contactName:
27         :param contactMail:
28         :param isSatr:
29         :param contactPhone:
30         :param contactComment:
31         :return:
32         '''
33         # 點擊新建聯繫人
34         addContact = AddContactPage(driver)
35         # 調試的時候這邊有時候會報錯。點擊不到[新建聯繫人]這個按鈕,所以加了一個顯示等待
36         by, locator = ParseConfigFile().getElementValue('126mail_addContactPage', 'addContactPage.newContact')
37         WebDriverWait(driver, 30).until(EC.element_to_be_clickable((by, locator)))
38         addContact.newContact().click()
39         if contactName:
40             # 非必填項
41             addContact.addName().send_keys(contactName)
42         # 必填項
43         addContact.addMail().send_keys(contactMail)
44         if isSatr == '是':
45             addContact.markStar().click()
46         if contactPhone:
47             addContact.addPhone().send_keys(contactPhone)
48         if contactComment:
49             addContact.addContent().send_keys(contactComment)
50         addContact.clickCommitBtn().click()
51 
52 if __name__=='__main__':
53     from appModules.LoginAction import LoginAction
54     import time
55     from selenium import webdriver
56     driver = webdriver.Firefox()
57     driver.get('https://mail.126.com')
58     time.sleep(5)
59     LoginAction.login(driver, 'linux', 'chao')
60     NewContactPersonAction.addressLink(driver)
61     NewContactPersonAction.addContact(driver, '','123456@qq.com', '是', '','')
62     time.sleep(5)
63     driver.quit()

10.我們的大體框架就已經搭建完成了,貌似還少了個執行日誌,我們在util目錄下新建log.py封裝日誌模塊, 加入到我們想加入的任何地方(用例中我就加了幾條,可以自己任意加在想加的位置)

import logging
 2 import time
 3 from config.varCondig import *
 4 
 5 class Logger(object):
 6     '''
 7     封裝的日誌模塊
 8     '''
 9     def __init__(self, logger, CmdLevel=logging.INFO, FileLevel=logging.INFO):
10         """
11 
12         :param logger:
13         :param CmdLevel:
14         :param FileLevel:
15         """
16         self.logger = logging.getLogger(logger)
17         self.logger.setLevel(logging.DEBUG)  # 設置日誌輸出的默認級別
18         # 日誌輸出格式
19         fmt = logging.Formatter('%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s')
20         # 日誌文件名稱
21         # self.LogFileName = os.path.join(conf.log_path, "{0}.log.txt".format(time.strftime("%Y-%m-%d")))# %H_%M_%S
22         currTime = time.strftime("%Y-%m-%d")
23         self.LogFileName = logPath+r'\log'+currTime+'.txt'
24         # 設置控制台輸出
25         # sh = logging.StreamHandler()
26         # sh.setFormatter(fmt)
27         # sh.setLevel(CmdLevel)# 日誌級別
28 
29         # 設置文件輸出
30         fh = logging.FileHandler(self.LogFileName)
31         fh.setFormatter(fmt)
32         fh.setLevel(FileLevel)# 日誌級別
33 
34         # self.logger.addHandler(sh)
35         self.logger.addHandler(fh)
36 
37 if __name__ == '__main__':
38     logger = Logger("fox",CmdLevel=logging.DEBUG, FileLevel=logging.DEBUG)
39     logger.logger.debug("debug")
40     logger.logger.log(logging.ERROR,'%(module)s %(info)s',{'module':'log日誌','info':'error'}) #ERROR,log日誌 error

11.目前為止我們的框架就算已經搭建完成了,接下來就是編寫我們的測試用例了^_^,新建testCases目錄存放測試用例,並新建TestMail126.py編寫用例

1 from selenium import webdriver
 2 import time
 3 from appModules.LoginAction import LoginAction
 4 from appModules.AddContact import NewContactPersonAction
 5 from config.varCondig import *
 6 from util.ParseExcel import ParseExcel
 7 from util.Log import Logger
 8 import logging
 9 import traceback
10 
11 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
12 p = ParseExcel()
13 sheetName = p.wb.sheetnames # 獲取所有的sheetname 是個列表
14 
15 # print(sheetName)
16 def bDriver():
17     try:
18         driver = webdriver.Firefox()
19         driver.get('https://mail.126.com')
20         driver.implicitly_wait(30)
21     except Exception as e:
22         raise e
23     else:
24         return driver
25 
26 def testMailLogin(driver):
27     '''
28     測試用例
29     :return:
30     '''
31     # 是否執行列數據
32     isExcute = p.getColumnValue(sheetName=sheetName[0], colNo=account_isExecute)
33     # print(isExcute)
34     for idx,value in enumerate(isExcute[:]):
35         # print(idx, value) # 獲取是否執行列數據列表的索引和數據
36         if value.lower() == 'y':
37             userRowValue = p.getRowValue(sheetName[0], idx+2) # 獲取執行狀態為y所在行的數據
38             userName = userRowValue[account_userName-2]
39             passWord = userRowValue[account_passWord-2]
40             # driver = bDriver()
41             # 登錄
42             LoginAction.login(driver,userName, passWord)
43             time.sleep(10) # 足夠的時間加載登錄成功的頁面
44             try:
45                 assert '通訊錄' in driver.page_source
46             except Exception as e:
47                 log.logger.info('斷言"通訊錄"失敗,錯誤信息{}'.format(traceback.format_exc()))
48                 p.writeCell(sheetName[0], idx + 2, account_testResult, 'failed')
49                 # raise e
50             else:
51                 log.logger.info('{},{}登錄成功, 斷言」通訊錄「成功'.format(userName, passWord))
52                 p.writeCell(sheetName[0], idx + 2, account_testResult, 'pass')
53             # 獲取聯繫人數據表中是否執行列的數據
54                 isExcute = p.getColumnValue(sheetName=sheetName[1], colNo=contact_contactIsExcute)
55                 for idx, value in enumerate(isExcute):
56                     if value.lower() == 'y':
57                         # 獲取y表示行的數據
58                         contactPersonValue = p.getRowValue(sheetName[1], idx+2)
59                         # 獲取添加聯繫人所需的數據
60                         # 聯繫人姓名
61                         contactPersonName = contactPersonValue[contact_contactName-2]
62                         # 聯繫人郵箱
63                         contactPersonMail = contactPersonValue[contact_contactMail-2]
64                         # 是否為星級聯繫人
65                         contactPersonStar = contactPersonValue[contact_contactStar-2]
66                         # 聯繫人手機號
67                         contactPersonPhone = contactPersonValue[contact_contactPhone-2]
68                         # 聯繫人備註
69                         contactPersonComment = contactPersonValue[contact_contactComment-2]
70                         # 驗證頁面包含的關鍵字
71                         contactAssert = contactPersonValue[contact_contactKeyWords-2]
72                         NewContactPersonAction.addressLink(driver)
73                         NewContactPersonAction.addContact(driver, contactPersonName, contactPersonMail
74                                                           , contactPersonStar, contactPersonPhone, contactPersonComment)
75                         try:
76                             assert contactAssert in driver.page_source
77                         except Exception as e:
78                             p.writeCell(sheetName[1], idx + 2, contact_contactTestResult, 'failed')
79                             raise e
80                         else:
81                             p.writeCell(sheetName[1], idx+2, contact_contactTestResult, 'pass')
82                         # 設置足夠長的時間 讓添加聯繫人成功後的提示框自動消失,當然可以自己寫代碼關閉
83                         time.sleep(10)
84             driver.quit()
85 
86 if __name__=='__main__':
87     driver = bDriver()
88     testMailLogin(driver)

12.用例編寫完成,我們再來編寫一個統一執行用例的入口文件,在項目根目錄下新建RunTest.py

1 from selenium import webdriver
 2 import time
 3 from appModules.LoginAction import LoginAction
 4 from appModules.AddContact import NewContactPersonAction
 5 from config.varCondig import *
 6 from util.ParseExcel import ParseExcel
 7 from util.Log import Logger
 8 import logging
 9 import traceback
10 
11 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
12 p = ParseExcel()
13 sheetName = p.wb.sheetnames # 獲取所有的sheetname 是個列表
14 
15 # print(sheetName)
16 def bDriver():
17     try:
18         driver = webdriver.Firefox()
19         driver.get('https://mail.126.com')
20         driver.implicitly_wait(30)
21     except Exception as e:
22         raise e
23     else:
24         return driver
25 
26 def testMailLogin(driver):
27     '''
28     測試用例
29     :return:
30     '''
31     # 是否執行列數據
32     isExcute = p.getColumnValue(sheetName=sheetName[0], colNo=account_isExecute)
33     # print(isExcute)
34     for idx,value in enumerate(isExcute[:]):
35         # print(idx, value) # 獲取是否執行列數據列表的索引和數據
36         if value.lower() == 'y':
37             userRowValue = p.getRowValue(sheetName[0], idx+2) # 獲取執行狀態為y所在行的數據
38             userName = userRowValue[account_userName-2]
39             passWord = userRowValue[account_passWord-2]
40             # driver = bDriver()
41             # 登錄
42             LoginAction.login(driver,userName, passWord)
43             time.sleep(10) # 足夠的時間加載登錄成功的頁面
44             try:
45                 assert '通訊錄' in driver.page_source
46             except Exception as e:
47                 log.logger.info('斷言"通訊錄"失敗,錯誤信息{}'.format(traceback.format_exc()))
48                 p.writeCell(sheetName[0], idx + 2, account_testResult, 'failed')
49                 # raise e
50             else:
51                 log.logger.info('{},{}登錄成功, 斷言」通訊錄「成功'.format(userName, passWord))
52                 p.writeCell(sheetName[0], idx + 2, account_testResult, 'pass')
53             # 獲取聯繫人數據表中是否執行列的數據
54                 isExcute = p.getColumnValue(sheetName=sheetName[1], colNo=contact_contactIsExcute)
55                 for idx, value in enumerate(isExcute):
56                     if value.lower() == 'y':
57                         # 獲取y表示行的數據
58                         contactPersonValue = p.getRowValue(sheetName[1], idx+2)
59                         # 獲取添加聯繫人所需的數據
60                         # 聯繫人姓名
61                         contactPersonName = contactPersonValue[contact_contactName-2]
62                         # 聯繫人郵箱
63                         contactPersonMail = contactPersonValue[contact_contactMail-2]
64                         # 是否為星級聯繫人
65                         contactPersonStar = contactPersonValue[contact_contactStar-2]
66                         # 聯繫人手機號
67                         contactPersonPhone = contactPersonValue[contact_contactPhone-2]
68                         # 聯繫人備註
69                         contactPersonComment = contactPersonValue[contact_contactComment-2]
70                         # 驗證頁面包含的關鍵字
71                         contactAssert = contactPersonValue[contact_contactKeyWords-2]
72                         NewContactPersonAction.addressLink(driver)
73                         NewContactPersonAction.addContact(driver, contactPersonName, contactPersonMail
74                                                           , contactPersonStar, contactPersonPhone, contactPersonComment)
75                         try:
76                             assert contactAssert in driver.page_source
77                         except Exception as e:
78                             p.writeCell(sheetName[1], idx + 2, contact_contactTestResult, 'failed')
79                             raise e
80                         else:
81                             p.writeCell(sheetName[1], idx+2, contact_contactTestResult, 'pass')
82                         # 設置足夠長的時間 讓添加聯繫人成功後的提示框自動消失,當然可以自己寫代碼關閉
83                         time.sleep(10)
84             driver.quit()
85 
86 if __name__=='__main__':
87     driver = bDriver()
88     testMailLogin(driver)

總結

以上就是整個數據驅動測試框架的完整代碼,希望可以幫助到大家,喜歡的小夥伴可以點讚收藏評論加關注。

關鍵字: