Python Selenium 之數據驅動測試

  數據驅動模式的測試好處相比普通模式的測試就顯而易見了吧!使用數據驅動的模式,能夠根據業務分解測試數據,只需定義變量,使用外部或者自定義的數據使其參數化,從而避免了使用以前測試腳本中固定的數據。能夠將測試腳本與測試數據分離,使得測試腳本在不一樣數據集合下高度複用。不只能夠增長複雜條件場景的測試覆蓋,還能夠極大減小測試腳本的編寫與維護工做。python

  下面將使用Python下的數據驅動模式(ddt)庫,結合unittest庫以數據驅動模式建立百度搜索的測試。web

  ddt庫包含一組類和方法用於實現數據驅動測試。能夠將測試中的變量進行參數化。數據庫

  能夠經過python自帶的pip命令進行下載並安裝:pip install ddt . 更多關於ddt的信息能夠參考:app

  https://pypi.org/project/ddt/測試

一個簡單的數據驅動測試ui

  爲了建立數據驅動測試,須要在測試類上使用@ddt裝飾符,在測試方法上使用@data裝飾符。@data裝飾符把參數看成測試數據,參數能夠是單個值、列表、元組、字典。對於列表,須要用@unpack裝飾符把元組和列表解析成多個參數。spa

  下面實現百度搜索測試,傳入搜索關鍵詞和指望結果,代碼以下:3d

import unittest
from selenium import webdriver
from ddt import ddt, data, unpack

@ddt
class SearchDDT(unittest.TestCase):
    '''docstring for SearchDDT'''
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.driver.maximize_window()
        self.driver.get("https://www.baidu.com")

    # specify test data using @data decorator
    @data(('python', 'PyPI'))
    @unpack
    def test_search(self, search_value, expected_result):
        search_text = self.driver.find_element_by_id('kw')
        search_text.clear()
        search_text.send_keys(search_value)

        search_button = self.driver.find_element_by_id('su')
        search_button.click()

        tag = self.driver.find_element_by_link_text("PyPI").text
        self.assertEqual(expected_result, tag)

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main(verbosity=2)

  在test_search()方法中,search_value與expected_result兩個參數用來接收元組解析的數據。當運行腳本時,ddt把測試數據轉換爲有效的python標識符,生成名稱爲更有意義的測試方法。結果以下:code

使用外部數據的數據驅動測試blog

  若是外部已經存在了須要的測試數據,如一個文本文件、電子表格或者數據庫,那也能夠用ddt來直接獲取數據並傳入測試方法進行測試。

  下面將藉助外部的CSV(逗號分隔值)文件和EXCLE表格數據來實現ddt。

經過CSV獲取數據

  同上在@data裝飾符使用解析外部的CSV(testdata.csv)來做爲測試數據(代替以前的測試數據)。其中數據以下:

  

  接下來,先要建立一個get_data()方法,其中包括路徑(這裏默認使用當前路徑)、CSV文件名。調用CSV庫去讀取文件並返回一行數據。再使用@ddt及@data實現外部數據驅動測試百度搜索,代碼以下:

import csv, unittest
from selenium import webdriver
from ddt import ddt, data, unpack

def get_data(file_name):
    # create an empty list to store rows
    rows = []
    # open the CSV file
    data_file = open(file_name, "r")
    # create a CSV Reader from CSV file
    reader = csv.reader(data_file)
    # skip the headers
    next(reader, None)
    # add rows from reader to list
    for row in reader:
        rows.append(row)
    return rows

@ddt
class SearchCSVDDT(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.driver.maximize_window()
        self.driver.get("https://www.baidu.com")

    # get test data from specified csv file by using the get_data funcion
    @data(*get_data('testdata.csv'))
    @unpack
    def test_search(self, search_value, expected_result):
        search_text = self.driver.find_element_by_id('kw')
        search_text.clear()
        search_text.send_keys(search_value)

        search_button = self.driver.find_element_by_id('su')
        search_button.click()

        tag = self.driver.find_element_by_link_text("PyPI").text
        self.assertEqual(expected_result, tag)

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main(verbosity=2)

  測試執行時,@data將調用get_data()方法讀取外部數據文件,並將數據逐行返回給@data。執行的結果也同上~

經過Excel獲取數據

  測試中常常用Excle存放測試數據,同上在也可使用@data裝飾符來解析外部的CSV(testdata.csv)來做爲測試數據(代替以前的測試數據)。其中數據以下:

  

  接下來,先要建立一個get_data()方法,其中包括路徑(這裏默認使用當前路徑)、EXCEL文件名。調用xlrd庫去讀取文件並返回數據。再使用@ddt及@data實現外部數據驅動測試百度搜索,代碼以下:

import xlrd, unittest
from selenium import webdriver
from ddt import ddt, data, unpack

def get_data(file_name):
    # create an empty list to store rows
    rows = []
    # open the CSV file
    book = xlrd.open_workbook(file_name)
    # get the frist sheet
    sheet = book.sheet_by_index(0)
    # iterate through the sheet and get data from rows in list
    for row_idx in range(1, sheet.nrows):  #iterate 1 to maxrows
        rows.append(list(sheet.row_values(row_idx, 0, sheet.ncols)))
    return rows

@ddt
class SearchEXCLEDDT(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.driver.maximize_window()
        self.driver.get("https://www.baidu.com")

    # get test data from specified excle spreadsheet by using the get_data funcion
    @data(*get_data('TestData.xlsx'))
    @unpack
    def test_search(self, search_value, expected_result):
        search_text = self.driver.find_element_by_id('kw')
        search_text.clear()
        search_text.send_keys(search_value)

        search_button = self.driver.find_element_by_id('su')
        search_button.click()

        tag = self.driver.find_element_by_link_text("PyPI").text
        self.assertEqual(expected_result, tag)

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    unittest.main(verbosity=2)

  與上面讀取CVS文件同樣,測試執行時,@data將調用get_data()方法讀取外部數據文件,並將數據逐行返回給@data。執行的結果也同上~

  若是想從數據庫的庫表中獲取數據,一樣也須要一個get_data()方法,而且經過DB相關的庫來鏈接數據庫、SQL查詢來獲取測試數據。

相關文章
相關標籤/搜索