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

1 from selenium.webdriver.support.wait import WebDriverWait 2 3 def getElement(driver, by, locate): 4 ''' 5 查找單一個元素 6 :param driver: 瀏覽器驅動 7 :param by: 定位方式,id, name, class, xpath... 8 :param locate: 定位表達式 9 :return: 元素 10 ''' 11 try: 12 element = WebDriverWait(driver, 30).until(lambda x :x.find_element(by, locate)) 13 except Exception as e: 14 raise e 15 else: 16 return element 17 def getElelments(driver, by, locate): 18 ''' 19 查找一組元素 20 :param driver: 瀏覽器驅動 21 :param by: 定位方式 22 :param locate: 定位表達式 23 :return: 一組元祖組成的列表 24 ''' 25 try: 26 elements = WebDriverWait(driver, 30).until(lambda x :x.find_elements(by, locate)) 27 except Exception as e: 28 raise e 29 else: 30 return elements 31 if __name__=='__main__': 32 from selenium import webdriver 33 driver = webdriver.Firefox() 34 driver.get('http://www.baidu.com') 35 inputBaidu = getElement(driver, 'id', 'kw') 36 inputBaidu.send_keys('python')
3.定位表達式有了,查找元素的方法封裝好了,下面我們需要解析配置文件,獲取配置文件中我們需要的定位方式和定位表達式。同樣在util目下新建ParseConfigurationFile.py文件用來解析配置文件

1 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文件存放我們添加聯系人頁面所需要的元素。

1 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()

1 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()

1 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文件

1 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 文件

1 # 封裝登錄方法 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')

1 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封裝日志模塊, 加入到我們想加入的任何地方(用例中我就加了幾條,可以自己任意加在想加的位置)

1 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 ''' 2 用例執行入口 3 ''' 4 5 import sys 6 sys.path.append(r'.') 7 8 if __name__=='__main__': 9 from testCases.TestMail126 import * 10 11 driver = bDriver() 12 testMailLogin(driver)
總結
以上就是整個數據驅動測試框架的完整代碼,后續還會更新關鍵字驅動框架和混合測試框架的設計,大家敬請期待!
原代碼在我的github https://github.com/13691579846/DataDriverTestFrameWork上大家可以下載學習, QQ交流群:878565760