溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在Python中使用Selenium 實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)測(cè)試

發(fā)布時(shí)間:2021-06-03 17:00:18 來(lái)源:億速云 閱讀:360 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

怎么在Python中使用Selenium 實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)測(cè)試?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

為了創(chuàng)建數(shù)據(jù)驅(qū)動(dòng)測(cè)試,需要在測(cè)試類上使用@ddt裝飾符,在測(cè)試方法上使用@data裝飾符。@data裝飾符把參數(shù)當(dāng)作測(cè)試數(shù)據(jù),參數(shù)可以是單個(gè)值、列表、元組、字典。對(duì)于列表,需要用@unpack裝飾符把元組和列表解析成多個(gè)參數(shù)。

下面實(shí)現(xiàn)百度搜索測(cè)試,傳入搜索關(guān)鍵詞和期望結(jié)果,代碼如下:

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兩個(gè)參數(shù)用來(lái)接收元組解析的數(shù)據(jù)。當(dāng)運(yùn)行腳本時(shí),ddt把測(cè)試數(shù)據(jù)轉(zhuǎn)換為有效的python標(biāo)識(shí)符,生成名稱為更有意義的測(cè)試方法。結(jié)果如下:

怎么在Python中使用Selenium 實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)測(cè)試

使用外部數(shù)據(jù)的數(shù)據(jù)驅(qū)動(dòng)測(cè)試

如果外部已經(jīng)存在了需要的測(cè)試數(shù)據(jù),如一個(gè)文本文件、電子表格或者數(shù)據(jù)庫(kù),那也可以用ddt來(lái)直接獲取數(shù)據(jù)并傳入測(cè)試方法進(jìn)行測(cè)試。

下面將借助外部的CSV(逗號(hào)分隔值)文件和EXCLE表格數(shù)據(jù)來(lái)實(shí)現(xiàn)ddt。

通過(guò)CSV獲取數(shù)據(jù)

同上在@data裝飾符使用解析外部的CSV(testdata.csv)來(lái)作為測(cè)試數(shù)據(jù)(代替之前的測(cè)試數(shù)據(jù))。其中數(shù)據(jù)如下:

怎么在Python中使用Selenium 實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)測(cè)試

接下來(lái),先要?jiǎng)?chuàng)建一個(gè)get_data()方法,其中包括路徑(這里默認(rèn)使用當(dāng)前路徑)、CSV文件名。調(diào)用CSV庫(kù)去讀取文件并返回一行數(shù)據(jù)。再使用@ddt及@data實(shí)現(xiàn)外部數(shù)據(jù)驅(qū)動(dòng)測(cè)試百度搜索,代碼如下:

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)

測(cè)試執(zhí)行時(shí),@data將調(diào)用get_data()方法讀取外部數(shù)據(jù)文件,并將數(shù)據(jù)逐行返回給@data。執(zhí)行的結(jié)果也同上~

通過(guò)Excel獲取數(shù)據(jù)

測(cè)試中經(jīng)常用Excle存放測(cè)試數(shù)據(jù),同上在也可以使用@data裝飾符來(lái)解析外部的CSV(testdata.csv)來(lái)作為測(cè)試數(shù)據(jù)(代替之前的測(cè)試數(shù)據(jù))。其中數(shù)據(jù)如下:

怎么在Python中使用Selenium 實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)測(cè)試

接下來(lái),先要?jiǎng)?chuàng)建一個(gè)get_data()方法,其中包括路徑(這里默認(rèn)使用當(dāng)前路徑)、EXCEL文件名。調(diào)用xlrd庫(kù)去讀取文件并返回?cái)?shù)據(jù)。再使用@ddt及@data實(shí)現(xiàn)外部數(shù)據(jù)驅(qū)動(dòng)測(cè)試百度搜索,代碼如下:

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)

關(guān)于怎么在Python中使用Selenium 實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)測(cè)試問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI