UI自動化測試框架:資料驅動

2021-05-17 07:00:10

一、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

其他常用的方法可根據專案的需求進行封裝:
在這裡插入圖片描述
在這裡插入圖片描述

最後:資源分享

這些資料,對於【軟體測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你

加粗樣式

關注我的微信公眾號 :【程式媛木子】 免費獲取~

我的學習交流群:644956177群裡有技術大牛一起交流分享~