1.內容介紹
- 什么是關鍵字驅動?
- 如何設計關鍵字驅動?
- 具體如何實現的?
- 框架詳細分析
2.什么是關鍵字驅動
2.1.解決什么問題?
在回歸測試的時候有很多重復測試的用例,我們希望這部分用例能自動化執行,減少人的重復性勞動。使用傳統的全寫代碼模式進行自動化測試,如果測試人員不懂代碼,那么自動化測試就無法開展,對技能要求太高,能不能有這個樣的一個工具或框架,部分測試人員不寫代碼也能進行自動化測試?
我們先來看看之前我們設計的用例。

我們要怎樣把上面的用例做成自動化用例?讓代碼實現如下功能。
- 打開瀏覽器
- 輸入網站
- 輸入框輸入內容
- 點擊搜索按鈕
- 自動判斷結果並把結果寫回excle
2.2.如何來做?
如果用以前的用例格式來直接轉換成自動化用例能行嗎?
- 操作步驟每個人的描述不一致,無法通過程序准確調用某功能。
- 操作步驟中沒有提供具體的元素定位及操作方法,代碼上如何才能明白你操作的那個按鈕?
- 結果驗證方法也需要調用程序代碼,需要告訴程序通過什么驗證。
我的設計方法:

- 操作瀏覽器的方法都固定下來,不能變。
- 操作方法需要的字段(定位方法,定位表達式,操作的值)用單獨的列表示。
- 程序運行異常后需要有錯誤信息和錯誤截圖
2.3.概念
我們把上面的這種設計方法叫做關鍵字驅動,總結以下兩點。
- 關鍵字驅動框架是一種功能自動化測試框架
- 被稱為表格驅動測試
- 被稱為基於動作字的測試。
- 關鍵字驅動的框架的重要組成部分
- 測試步驟(Test Step),
- 測試步驟中的對象(Test Object) --鼠標、鍵盤、瀏覽器等對象
- 測試對象執行的動作(Action)
- 測試對象需要的數據(Test Data)
3.如何設計關鍵字驅動
3.1.如何設計程序?
從上面設計的用例出發,我們依次來分析需要實現的功能。

我們希望的是自動化框架腳本能讀取每一行用例,然后在執行后把測試結果也填好,如果執行出錯要有錯誤信息、錯誤截圖。那我們需要完成以下代碼的編寫。
- Excel操作(讀、寫)
- 讀取關鍵字名稱、操作元素定位方式、操作元素定位表達式、操作值
- 執行完成后寫入執行時間、測試結果、錯誤信息、截圖文件位置
- 根據關鍵字名稱、操作元素定位方式、操作元素定位表達式、操作值開發web操作腳本
- 執行用例的方法腳本
- 錯誤信息記錄方法腳本
- 錯誤截圖方法腳本
3.2.Cases編寫
主要實現根據excel表格中的用例自動轉換成的用例
from openpyxl import load_workbook from datetime import datetime from PIL import ImageGrab from action.pageAction import KeyWordTest import traceback import os def TestCase(filename): wb = load_workbook(filename) #獲取sheet_names for sheetname in wb.sheetnames: ws = wb[sheetname] #獲取最大行數 ws_rows_max = ws.max_row #sheet.rows為生成器, 里面是每一行的數據,每一行又由一個tuple包裹 idx = 2 while idx <= ws_rows_max: # 指定的關鍵字 essential = ws.cell(row=idx, column=3).value # 定位方式 Targeting = ws.cell(row=idx, column=4).value # 元素定位表達式 Element_positioning = ws.cell(row=idx, column=5).value # 操作值 Manipulated_value = ws.cell(row=idx, column=6).value try: #根據傳入的方法名來確定每一步執行哪一個方法 if essential == 'open_browser': dirver = KeyWordTest('Chrome') elif essential == 'open_url': dirver.open_url(Manipulated_value) elif essential == 'maximize_browser': dirver.maximize_browser() elif essential == 'input_text': dirver.input_text(Targeting, Element_positioning, Manipulated_value) elif essential == 'click_btn': dirver.click_btn(Targeting, Element_positioning) elif essential == 'quit_browser': dirver.quit_browser() elif essential == 'assert_driver_title_is': title_text = dirver.assert_driver_title_is() #斷言 if title_text == Manipulated_value: #print(dirver.assert_driver_title_is()) #如果執行無誤則將執行結果寫入Pass ws.cell(row=idx, column=8).value = 'Pass' else: # 如果執行無誤則將執行結果寫入Pass ws.cell(row=idx, column=8).value = 'Fail' wb.save(filename) return # 如果執行無誤則將執行結果寫入Pass ws.cell(row=idx, column=8).value = 'Pass' # 獲取當前系統時間,作為測試用例執行時間 curr_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') ws.cell(row=idx, column=7).value = curr_time except Exception: #出現錯誤時截圖保存到表格:只用到一個PIL模塊,但PIL是Python2專有的,沒有Python3版本。Python3應安裝pillow,用的時候和PIL是一樣的。 im = ImageGrab.grab() imagepath = f'screenshot/{idx-1}.png' im.save(imagepath) ws.cell(row=idx, column=10).value = imagepath # 如果執行出現異常,測試結果寫入 異常,同時將異常信息寫入到表格中 ws.cell(row=idx, column=8).value = '異常' # 寫入異常信息 ws.cell(row=idx, column=9).value = traceback.format_exc() idx += 1 wb.save(filename)
3.3.Web操作腳本
主要實現頁面元素查找功能的封裝和頁面校驗斷言assert的封裝
from selenium import webdriver import time class KeyWordTest: def __init__(self, type_browser): self.driver = self.open_browser(type_browser) self.driver.implicitly_wait(20) #隱式等待 self.maximize_browser() #瀏覽器最大化 #打開瀏覽器 def open_browser(self, type_browser): if type_browser == 'Chrome': self.driver = webdriver.Chrome() elif type_browser == 'Firefox': self.driver = webdriver.Firefox() elif type_browser == 'Edge': self.driver = webdriver.Edge() else: self.driver = 'type error' return self.driver #打開網頁 def open_url(self, url): self.driver.get(url) #瀏覽器最大化 def maximize_browser(self): self.driver.maximize_window() #元素定位 def locator(self, locator_type, element): element_object = None if locator_type == 'id': element_object = self.driver.find_element_by_id(element) elif locator_type == 'name': element_object = self.driver.find_element_by_name(element) elif locator_type == 'class_name': element_object = self.driver.find_element_by_class_name(element) elif locator_type == 'css': element_object = self.driver.find_element_by_css_selector(element) elif locator_type == 'xpath': element_object = self.driver.find_element_by_xpath(element) return element_object #輸入內容定位 def input_text(self, targeting, element, content): self.locator(targeting, element).send_keys(content) #點擊按鈕 def click_btn(self, targeting, element): self.locator(targeting, element).click() #關閉瀏覽器 def quit_browser(self): self.driver.quit() #獲取 title信息 def assert_driver_title_is(self):return self.driver.title
3.4.運行
- 自定義一個在excle寫結果的函數
- 執行用例的步驟
- 先獲取要執行的用例,遍歷找到要具體執行用例的sheet表。
- 執行sheet表中的步驟。
- 根據sheet中的步驟判斷當前用例執行是否成功(需要執行的用例數等於執行通過的用例數,則執行成功)
- 如果有錯誤就截圖,並保存錯誤日志
- 測試過程中統計執行了多少用例,成功多少,失敗多少。
- 把執行結果寫到excle中
4.項目代結構展示
5.框架分析
- 使用外部測試數據文件,使用Excel管理測試用例的集合和每個測試用例的所有測試步驟,實現一個文件中完成測試用例的維護
- 每個測試用例的測試結果在一個文件中查看和統計
- 通過定義關鍵字,操作元素的定位方式及定位表達式和操作值就可以實現每個測試用例步驟的執行,可以更加靈活地實現自動化測試的需求
- 實現定位表達式和測試代碼的分離,實現定位表達式直接在測試數據文件中進行維護。
- 框架提供日志功能,方便調試和監控自動化測試程序的執行
- 基於關鍵字測試框架,即使不懂開發技術的測試人員也可以實施自動化測試,便於在整個測試團隊中推廣和使用自動化測試技術,降低自動化測試實施的技術門檻
- 基於關鍵字的方式,可以進行任意關鍵字的擴展,以滿足更加復雜項目的自動化測試需求

