【Selenium08篇】python+selenium實現Web自動化:數據驅動框架,ddt,關鍵字驅動框架


一、前言

最近問我自動化的人確實有點多,個人突發奇想:想從0開始講解python+selenium實現Web自動化測試,請關注博客持續更新!

這是python+selenium實現Web自動化第八篇博文

二、Selenium前七篇博文地址:

【Selenium01篇】python+selenium實現Web自動化:搭建環境,Selenium原理,定位元素以及瀏覽器常規操作!

【Selenium02篇】python+selenium實現Web自動化:鼠標操作和鍵盤操作!

【Selenium03篇】python+selenium實現Web自動化:元素三類等待,多窗口切換,警告框處理,下拉框選擇

【Selenium04篇】python+selenium實現Web自動化:文件上傳,Cookie操作,調用 JavaScript,窗口截圖

【Selenium05篇】python+selenium實現Web自動化:讀取ini配置文件,元素封裝,代碼封裝,異常處理,兼容多瀏覽器執行

【Selenium06篇】python+selenium實現Web自動化:日志處理

【Selenium07篇】python+selenium實現Web自動化:PO模型,PageObject模式!

三、Selenium之-數據驅動框架

那么問題來了,什么是數據驅動呢?就是,數據的改變從而驅動自動化測試的執行,最終引起測試結果的改變,也就是參數的應用化。

  這里對於數據驅動測試,總結起來就是,數據驅動絕非讀取文件(excel、csv、xml)中數據進行參數的賦值測試,因為采用的這種方式的測試,工作重心反而變成了如何讀寫文件,而對於自動化測試中關心的執行結果統計、斷言結果反而不是那么容易去實現。尤其是測試頁面結構發生大的調整時,文件類的字段調整獲取也要發生較大的修改,所以文件數據驅動測試也是可以的,但是並不是最優解。

  那么什么才是最優的數據驅動測試呢?是的,用單元測試 unittest 結合 ddt 庫。使用單元測試可以很方便的解決兩個問題:

(1)斷言。利用單元測試的斷言機制,我們可以方便的進行預期結果和實際結果的對比;
(2)數據統計。執行完測試用例后,一共執行了多少條用例,執行成功多少,失敗多少,失敗的用例錯誤在哪里?單元測試框架會幫我們統計展示。

1. DDT 入門

 Python 的 unittest 沒有自帶數據驅動功能,如果使用 unittest, 同時又想使用數據驅動,就用 DDT 吧。奉上 ddt 官方文檔 《DDT 官方文檔》。

DDT 的使用方法:

(1) ddt.ddt --- 裝飾類,也就是繼承自 TestCase 的類;
(2) ddt.data --- 裝飾測試方法,參數是一系列的值。
(3) ddt.file_data --- 裝飾測試方法,參數是文件名。文件可以是 json 或 yaml 類型,除.yaml結尾的文件,其他文件均會作為json文件處理。
(4) ddt.unpack --- 傳遞的是復雜的數據結構是使用。如:元組或列表。添加到 unpack 上之后,ddt 會自動把元組或者列表對應到多個參數上。
(5) 測試用例方法名生成規則 --- 

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公眾號:軟測之家  更多技術干貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術群:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""

import unittest
import ddt

@ddt.ddt
class DDTExample(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print(cls.__name__)

    @classmethod
    def tearDownClass(cls) -> None:
        print('...end...')

    @ddt.data(
        [1, 2],
        [3, 4],
        [5, 6]
    )
    @ddt.unpack
    def test_add(self, a, b):
        print(a + b)

if __name__ == "__main__":
    unittest.main()

2. 實踐應用

 將 ddt 引入到自動化測試中。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公眾號:軟測之家  更多技術干貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術群:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""

import ddt
from page_object_model.register_business import RegisterBusiness
from selenium import webdriver
import unittest
from time import sleep

@ddt.ddt
class RegisterDdtCases(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        cls.register_url = 'http://www.5itest.cn/register'
        cls.driver = webdriver.Chrome('../tools/chromedriver.exe')
        cls.driver.maximize_window()
        cls.driver.get(cls.register_url)
        sleep(3)
        cls.rb = RegisterBusiness(cls.driver)

    @classmethod
    def tearDownClass(cls) -> None:
        sleep(2)
        cls.driver.close()

    # 郵箱錯誤測試的測試用例
    @ddt.data(
        # 順序分別是:注冊郵箱、用戶昵稱、注冊密碼、驗證碼、錯誤信息定位元素、錯誤提示信息
        ['123', 'test01', 'test01abc', 'tyu9'],
        ['@163.com', 'test01', 'test01abc', 'tyu9'],
        ['@163', 'test01', 'test01abc', 'tyu9']
    )
    @ddt.unpack
    def test_ddt_email_error(self, register_email, nickname, password, captcha):
        register_email_error = self.rb.register_email_error(register_email, nickname, password, captcha)
        print("register_email_error: ", register_email_error)
        self.assertFalse(register_email_error, '你輸入的郵箱錯誤,但此條測試用例執行成功')

if __name__ == "__main__":
    unittest.main()

四、關鍵字驅動框架

關鍵字簡單來說就是,把我們的執行操作每一個關鍵步驟當成一個關鍵字來對待,用來驅動程序的設計開發。例如:進行web自動化我們的首要是打開瀏覽器,是的 “打開瀏覽器” 我們就可以作為一個關鍵字來對待它,關鍵字就是來驅動我們程序設計的關鍵步驟。通過關鍵字的改變從而驅動自動化測試的執行,最終引起測試結果的改變。

  對於測試一個注冊頁面,我們來梳理下看有哪些關鍵詞,更深層次了解下關鍵詞模型:

(1) 打開瀏覽器 --->  打開瀏覽器
(2) 輸入注冊頁面的url --->  輸入測試地址
(3) 頁面加載等待 ---> 頁面加載等待
(4) 輸入(注冊郵箱、用戶名、密碼、驗證碼)--->  輸入元素
(5) 點擊注冊按鈕 ---> 點擊元素
(6) 退出瀏覽器 

1. 構建關鍵詞類

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公眾號:軟測之家  更多技術干貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術群:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""

class RegisterKeyword(object):
    def __init__(self, driver):
        self.fe = FindElement(driver)

    # 打開瀏覽器
    def open_browser(self, browser):
        if browser == 'chrome':
            self.driver = webdriver.Chrome('../tools/chromedriver.exe')
        elif browser == 'firefox':
            self.driver = webdriver.Firefox()
        else:
            self.driver = webdriver.Edge()

    # 輸入測試地址
    def get_url(self, url):
        self.driver.get(url)

    # 定位元素
    def get_element(self, key):
        return self.fe.get_element(key)

    # 輸入元素
    def send_element_key(self, key, value):
        get_element = self.get_element(key)
        get_element.send_keys(value)

    # 點擊元素
    def click_element(self, key):
        self.fe.get_element(key).click()

    # 頁面等待
    @staticmethod
    def wait_loading():
        sleep(3)

    # 關閉瀏覽器
    def close_browser(self):
        self.driver.close()

if __name__ == "__main__":
    register_url = 'http://www.5itest.cn/register'
    driver = webdriver.Chrome('../tools/chromedriver.exe')
    driver.get(register_url)
    rk = RegisterKeyword(driver)
    print(rk.get_element('register_email'))
    driver.close()

2. 關鍵詞模型測試用例

我們關鍵詞方法直接從 register_keyword 中讀取即可,但是測試數據從哪獲取到從而傳給相應的關鍵詞方法呢?為了方便測試數據方便管理,我們可以將其存儲到 Excel中去並獲取。

2.1 讀取Excel

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公眾號:軟測之家  更多技術干貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術群:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
"""
import xlrd from xlutils.copy import copy class ReadExcel(object): def __init__(self, excel_path=None, index=None): if excel_path is None: self.excel_path = '../data/register_keyword_testdata.xls' self.index = 0 else: self.excel_path = excel_path self.index = index # 打開 excel 文件,獲取數據列表 self.data = xlrd.open_workbook(self.excel_path) # 讀取第一 sheet 頁的數據 self.table = self.data.sheets()[0] def get_data(self): result = [] rows = self.get_lines() if rows != '': for i in range(rows): col = self.table.row_values(i) result.append(col) return result return None # 獲取 excel 行數 def get_lines(self): rows = self.table.nrows if rows >= 1: return rows return None # 獲取單元格的值 def get_cell(self, row, col): if self.get_lines() > row: data = self.table.cell(row, col).value return data return None def write_data(self, row, col, value): read_data = xlrd.open_workbook(self.excel_path) write_data = copy(read_data) write_data.get_sheet(self.index).write(row, col, value) write_data.save("../data/register_keyword_testdata.xls") write_data.save(self.excel_path) if __name__ == "__main__": re = ReadExcel() print(re.get_data()) print(re.get_lines()) print(re.get_cell(0, 0)) re.write_data(11, 0, 123456)

2.2 測試用例實踐

前面將測試測數據存在到excel中了,接下來怎么寫關鍵字對應的測試用例。

(1) 拿到操作值,是否執行
(2) 拿到執行方法
(3) 拿到輸入數據
(4) 是否有輸入數據
        執行方法(輸入數據,操作元素)
    沒有輸入數據
        執行方法(操作元素)
     
(5) 對比預期結果和實際結果的值
    對比結果一樣,測試結論為pass;否則為fail

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Time    :   2020/4/17
@Author  :   公眾號:軟測之家  更多技術干貨,軟測視頻,面試資料請關注!
@Contact :   軟件測試技術群:695458161
@License :   (C)Copyright 2017-2019, Micro-Circle
@Desc    :   None
""" from util.read_excel import ReadExcel from keyword_model.register_keyword import RegisterKeyword from selenium import webdriver class RegisterKeywordCases(object): def __init__(self): self.rk = RegisterKeyword() self.excel_path = '../data/register_keyword_testdata.xls' # 執行關鍵字測試方法 def run_keyword_method(self, keyword_method, operator_element='', send_value=''): print('keyword_method ---> ', keyword_method) print("operator_element ---> ", operator_element) print("send_value ---> ", send_value) execute_method = getattr(self.rk, keyword_method) print(execute_method) if operator_element is '' and send_value is not '': result = execute_method(send_value) elif operator_element is not '' and send_value is '': result = execute_method(operator_element) elif operator_element is '' and send_value is '': result = execute_method() else: result = execute_method(operator_element, send_value) return result # 執行關鍵詞測試用例 def run_keyword_excel_cases(self): handle_excel = ReadExcel(self.excel_path) # 獲取 excel 關鍵詞測試用例的條數 cases_numbers = handle_excel.get_lines() print("注冊頁獲取到的關鍵詞測試的測試用例條數為:%s" % cases_numbers) # 循環遍歷測試用例 if cases_numbers: # 第 0 行是標題行不作為用例執行 for i in range(1, cases_numbers): # 獲取測試用例的名稱 testcase_name = handle_excel.get_cell(i, 0) # 獲取用例是否執行 is_run = handle_excel.get_cell(i, 1) if is_run == 'yes': keyword_method = handle_excel.get_cell(i, 2) operator_element = handle_excel.get_cell(i, 3) send_value = handle_excel.get_cell(i, 4) except_result = handle_excel.get_cell(i, 5) actual_result = handle_excel.get_cell(i, 6) # 反射 self.run_keyword_method(keyword_method, operator_element, send_value) # if except_result is not '': # except_value = self.run_keyword_method(keyword_method) else: print('第 %s 條用例不執行,用例名稱是: [%s],無預期結果' % (i, testcase_name)) else: print("略略略~,請檢查你是否有寫測試用例!") if __name__ == "__main__": rkc = RegisterKeywordCases() # rkc.run_keyword_method('open_browser', '', 'chrome') # rkc.run_keyword_method('get_url', '', 'http://www.5itest.cn/register') rkc.run_keyword_excel_cases()

五、行為驅動模型

什么是行為驅動測試呢?行為驅動(Behave Driven Development)測試,是一種敏捷的開發方法,通常應用在自動化測試中,通過使用自然描述語言確定自動化腳本。不喜歡這種方式用在自動化腳本里。

六、持續更新中請關注

如果你對此文有任何疑問,如果你覺得此文對你有幫助,如果你對軟件測試、接口測試、自動化測試、面試經驗交流感興趣歡迎加入:

軟件測試技術群:695458161,群里發放的免費資料都是筆者十多年測試生涯的精華。還有同行大神一起交流技術哦。

作者:來自公眾號:軟測之家
出處:https://www.cnblogs.com/csmashang/p/12719150.html
原創不易,歡迎轉載,但未經作者同意請保留此段聲明,並在文章頁面明顯位置給出原文鏈接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM