Python+Selenium 之?dāng)?shù)據(jù)驅(qū)動(dòng)測(cè)試

一综慎、數(shù)據(jù)驅(qū)動(dòng)

模式的測(cè)試好處相比普通模式的測(cè)試就顯而易見了吧窗宦!使用數(shù)據(jù)驅(qū)動(dòng)的模式湖雹,可以根據(jù)業(yè)務(wù)分解測(cè)試數(shù)據(jù)咏闪,只需定義變量,使用外部或者自定義的數(shù)據(jù)使其參數(shù)化摔吏,從而避免了使用之前測(cè)試腳本中固定的數(shù)據(jù)鸽嫂。可以將測(cè)試腳本與測(cè)試數(shù)據(jù)分離征讲,使得測(cè)試腳本在不同數(shù)據(jù)集合下高度復(fù)用据某。不僅可以增加復(fù)雜條件場(chǎng)景的測(cè)試覆蓋,還可以極大減少測(cè)試腳本的編寫與維護(hù)工作诗箍。

下面將使用Python下的數(shù)據(jù)驅(qū)動(dòng)模式(ddt)庫癣籽,結(jié)合unittest庫以數(shù)據(jù)驅(qū)動(dòng)模式創(chuàng)建百度搜索的測(cè)試。

ddt庫包含一組類和方法用于實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)測(cè)試扳还〔疟埽可以將測(cè)試中的變量進(jìn)行參數(shù)化。

可以通過python自帶的pip命令進(jìn)行下載并安裝:pip install ddt .

二氨距、一個(gè)簡(jiǎn)單的數(shù)據(jù)驅(qū)動(dòng)測(cè)試

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

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

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

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

2、通過CSV獲取數(shù)據(jù)

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

接下來矗愧,先要?jiǎng)?chuàng)建一個(gè)get_data()方法,其中包括路徑(這里默認(rèn)使用當(dāng)前路徑)郑原、CSV文件名唉韭。調(diào)用CSV庫去讀取文件并返回一行數(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é)果也同上

3住诸、通過Excel獲取數(shù)據(jù)

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

接下來贱呐,先要?jiǎng)?chuàng)建一個(gè)get_data()方法,其中包括路徑(這里默認(rèn)使用當(dāng)前路徑)入桂、EXCEL文件名奄薇。調(diào)用xlrd庫去讀取文件并返回?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)

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

如果想從數(shù)據(jù)庫的庫表中獲取數(shù)據(jù),同樣也需要一個(gè)get_data()方法撮珠,并且通過DB相關(guān)的庫來連接數(shù)據(jù)庫沮脖、SQL查詢來獲取測(cè)試數(shù)據(jù)。以上內(nèi)容希望對(duì)你有幫助,有被幫助到的朋友歡迎點(diǎn)贊勺届,評(píng)論绷柒。如果對(duì)軟件測(cè)試、接口測(cè)試涮因、自動(dòng)化測(cè)試、面試經(jīng)驗(yàn)交流伺绽。感興趣可以加軟件測(cè)試交流:829792258养泡,還會(huì)有同行一起技術(shù)交流。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奈应,一起剝皮案震驚了整個(gè)濱河市澜掩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杖挣,老刑警劉巖肩榕,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惩妇,居然都是意外死亡株汉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門歌殃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乔妈,“玉大人,你說我怎么就攤上這事氓皱÷氛伲” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵波材,是天一觀的道長(zhǎng)股淡。 經(jīng)常有香客問我,道長(zhǎng)廷区,這世上最難降的妖魔是什么唯灵? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮隙轻,結(jié)果婚禮上早敬,老公的妹妹穿的比我還像新娘。我一直安慰自己大脉,他們只是感情好搞监,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镰矿,像睡著了一般琐驴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天绝淡,我揣著相機(jī)與錄音宙刘,去河邊找鬼。 笑死牢酵,一個(gè)胖子當(dāng)著我的面吹牛悬包,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馍乙,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼布近,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了丝格?” 一聲冷哼從身側(cè)響起撑瞧,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎显蝌,沒想到半個(gè)月后预伺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡曼尊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年酬诀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骆撇。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡料滥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艾船,到底是詐尸還是另有隱情葵腹,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布屿岂,位于F島的核電站践宴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏爷怀。R本人自食惡果不足惜阻肩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望运授。 院中可真熱鬧烤惊,春花似錦、人聲如沸吁朦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逗宜。三九已至雄右,卻和暖如春空骚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擂仍。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工囤屹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逢渔。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓肋坚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肃廓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子智厌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361