UI自動化測試框架:數據驅動
一、UI自動化框架介紹
測試框架使用了Po設計模式(Page Object),每一個頁面用一個類來對應,這個類里面要實現所有核心頁面元素的獲取方法,類里面提供操作頁面元素的所有方法。
這個框架實現幾點:
1.把常用的代碼進行了封裝,減少重復代碼的編寫。
比如說,操作excel 的方法,記錄日志的方法,創建文件的方法,查找元素的方法,解析ini配置文件的方法,還有記錄時間的方法,都進行封裝,在使用時直接進行調用。
2.做到了測試程序和測試數據進行了分離。
3.做到了定位表達式和程序的分離。
4.易于維護
5.能夠選擇不同的測試數據進行執行
6.有測試報告
7.可以在異常的時候進行截屏操作
8.可以記錄測試日志
二、框架的結構
1 配置信息:Conf
日志的配置文件,框架工程的全局變量,其他配置
2 日志:Log
執行的時候打印的日志
3 測試數據:TestData
測試的excel文件,元素的定位表達式文件,其他測試數據
4 測試邏輯封裝:Action
基于你的測試邏輯或者場景通過常見測試步驟的封裝,比如登錄。
5 測試框架的核心代碼:TestScript
數據驅動中執行的測試步驟; 讀取測試數據;執行測試腳本;收集測試結果;提供測試報告。
6 工程的全局封裝:Util
excel讀取;日志的使用;日期的封裝;目錄的封裝;頁面元素獲取的封裝;配置文件讀取的封裝
7 PageObject (homepage 頁面屬于的結構) PageObject
目錄結構如下:

三、代碼說明
1、Conf\PageElementLocator.ini
[crm_login] loginPage.username=xpath>//input[@id="txtUsername"] loginPage.password=xpath>//input[@id="txtPassword"] loginPage.loginbutton=xpath>//input[@type="submit"]
說明:
該文件的作用是實現定位表達式和程序的分離。讓每個定位表達式有個名字,方便使用和管理。
用到哪個頁面的元素就把對應的定義表達式更新到該文件中。
給每個頁面起個名字,作為section的名字,[crm_login]:
loginPage.username 是自己給每個元素取的名字;
=xpath 表示用xpath定位;
> 用于分割;
//input[@id="txtUsername"]是xpath表達式
2、Conf\ProjVar.py
放置當前工程路徑;配置文件路徑;數據文件路徑;測試數據Excel列。
代碼舉例:
import os # 當前工程的路徑 proj_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 配置文件的路徑 PageElementLocator_file_path = os.path.join(proj_path,r"Conf\PageElementLocator.ini") # 數據文件的路徑 test_data_file_path = os.path.join(proj_path,r"TestData\crm登錄賬號.xlsx") # "crm賬號"sheet頁名稱 test_user_info_sheet = "crm賬號" # "crm賬號"sheet頁列表的名稱 username_col = 1 password_col = 2 test_data_sheet_col = 3 execute_flag_col = 4 test_time_col = 5 test_user_info_result_col = 6 # "測試結果"sheet頁名稱 test_result_sheet = "測試結果"
3、Conf\Logger.conf
記錄日志的配置文件
同時將生成的日志寫入:Log\AutoTestLog.log 文件
4、PageObject\LoginPage.py
負責實現po的內容,一個頁面的所有操作,都寫到一個類里面。
舉例:LoginPage.py 實現登錄頁面的PO
get_login_link(self):獲取要操作的鏈接元素
click_login_link(self):點擊這個鏈接元素的動作
只寫怎么操作頁面元素,不寫任何測試邏輯
部分代碼示例:
class loginPage(): def __init__(self,driver): self.driver = driver def get_login_username(self): input = read_ini_file_option(PageElementLocator_file_path,"crm_login","loginPage.username") element = find_element(self.driver,input.split(">")[0],input.split(">")[1]) return element def input_login_username(self,username): self.get_login_username().send_keys(username)
5、ScreenPics
在代碼中,斷言失敗或執行失敗時,將當前頁面截圖,根據執行時間生成路徑并保存截圖。

6、TestData
將需要測試的數據放到該文件夾下,根據excel中的數據執行自動化測試腳本。
7、TestScript
該文件夾下的文件執行具體的測試步驟和用例。
如:AddNewCaseTestScript.py 從TestData的excel中,讀取測試數據,根據不同的測試數據創建case。
8、Util
放配置文件,如常用的 獲取時間,創建文件夾,讀寫Excel等文件封裝好,放到這里。使用時直接調用。
舉例1:TakePic.py 截圖配置文件
from Util.Dir import * from selenium import webdriver def take_pic(driver): file_path = make_time_dir() pic_path = os.path.join(file_path, TimeUtil().get_chinesedatetime() + ".png") try: result = driver.get_screenshot_as_file(pic_path) print(result) except IOError as e: print(e)
舉例2:ParseConfig.py 解析配置文件PageElementLocator.ini
#encoding=utf-8 # 解析配置文件 import configparser def read_ini_file_all_sections(ini_file_path): '''拿到所有的section''' cf = configparser.ConfigParser() cf.read(ini_file_path,encoding="utf-8") return cf.sections() def read_ini_file_section_all_options(ini_file_path,section_name): '''拿到指定的section的所有名稱''' cf = configparser.ConfigParser() cf.read(ini_file_path, encoding="utf-8-sig") return cf.options(section_name) def read_ini_file_option(ini_file_path,section_name,option_name): '''拿到指定section名稱的值''' cf = configparser.ConfigParser() cf.read(ini_file_path, encoding="utf-8-sig") try: value = cf.get(section_name,option_name) except: print ("the specific seciton or the specific option doesn't exit!") return None else: return value
舉例3:Dir.py 創建目錄
def make_dir(dir_path): if not os.path.exists(dir_path): try: os.makedirs(dir_path) print("創建目錄 %s 成功" %dir_path) except: print("創建目錄 %s 不成功" %dir_path ) def make_time_dir(): date = TimeUtil().get_chinesedate() dir_path = os.path.join(proj_path,"ScreenPics") dir_path = os.path.join(dir_path,date) dir_path = os.path.join(dir_path,str(TimeUtil().get_hour())) make_dir(dir_path) return dir_path
其他常用的方法可根據項目的需求進行封裝:

浙公網安備 33010602011771號