數(shù)據(jù)驅(qū)動(dòng)—ddt


一星虹、ddt安裝

ddt是python的第三方庫(kù),安裝非常簡(jiǎn)單:

pip install ddt

ddt官方文檔地址:https://pypi.org/project/ddt/

二谐岁、ddt模塊組成

1价脾、ddt模塊包含類的裝飾器ddt和兩個(gè)方法裝飾器data

1.ddt.ddt:裝飾類,也就是繼承TestCase的類复哆。

2.ddt.data:裝飾測(cè)試方法瘦馍,參數(shù)是一系列的值歼秽。

3.ddt.file_data:裝飾測(cè)試方法,參數(shù)是文件名情组。文件可以是json或者yaml類型燥筷。

注意,如果文件是以“.yml”或者".yaml"結(jié)尾院崇,ddt會(huì)作為yaml類型處理肆氓,其他文件都會(huì)作為json文件處理。

如果文件是列表亚脆,列表的值會(huì)作為測(cè)試用例參數(shù)做院,同時(shí),會(huì)作為測(cè)試用例方法名后綴顯示濒持。

如果文件是字典键耕,字典的key會(huì)作為測(cè)試用例方法的后綴顯示,字典的value會(huì)作為測(cè)試用例參數(shù)柑营。

1.ddt.unpack:傳遞的是復(fù)雜的數(shù)據(jù)結(jié)構(gòu)時(shí)使用屈雄,比如使用列表或者元組,添加unpack后官套,ddt會(huì)自動(dòng)把元組或者列表對(duì)應(yīng)到多個(gè)參數(shù)上酒奶。

2、測(cè)試用例方法名生成規(guī)則

使用ddt后奶赔,會(huì)產(chǎn)生一個(gè)新的測(cè)試用例方法名惋嚎,即定義的測(cè)試用例方法名,比如:def test_one()站刑,這里就是test_one另伍。

data:如果傳遞過(guò)來(lái)的數(shù)據(jù)存在__ name__ 屬性,則這里就是該數(shù)據(jù)的__ name__ 值绞旅。如果未定義__ name__ 屬性摆尝,ddt會(huì)盡量將傳遞過(guò)來(lái)的值轉(zhuǎn)化為python標(biāo)識(shí)符,作為data顯示因悲。

三堕汞、示例

1、使用data傳參數(shù)給測(cè)試用例

from ddt import ddt,data,file_data,unpack

import unittest

@ddt

class MyTestDdt(unittest.TestCase):

? ? def setUp(self):

? ? ? ? print('start')

? ? @data(2,4)#使用data傳參數(shù)給測(cè)試用例

? ? def test_one(self,value):

? ? ? ? print(f'the @data number is :{value}')

? ? def tearDown(self):

? ? ? ? print('end')

if __name__ == '__main__':

? ? unittest.main(verbosity=2)

結(jié)果:

start

test_one_1_2 (__main__.MyTestDdt) ... ok

the @data number is :2

end

start

the @data number is :4

test_one_2_4 (__main__.MyTestDdt) ... ok

end

----------------------------------------------------------------------

Ran 2 tests in 0.000s

OK

2晃琳、使用unpack分解list或者tuple

from ddt import ddt,data,file_data,unpack

import unittest

@ddt

class MyTestDdt(unittest.TestCase):

? ? def setUp(self):

? ? ? ? print('start')

? ? @data((1,2),(4,5)) #元組

? ? @unpack #分解

? ? def test_one(self,value1,value2):

? ? ? ? print(f'the @data number is :{value1,value2}')

? ? def tearDown(self):

? ? ? ? print('end')

if __name__ == '__main__':

? ? unittest.main(verbosity=2)

結(jié)果:

start

the @data number is :(1, 2)

end

test_one_1__1__2_ (__main__.MyTestDdt) ... ok

start

the @data number is :(4, 5)

test_one_2__4__5_ (__main__.MyTestDdt) ... ok

end

----------------------------------------------------------------------

Ran 2 tests in 0.002s

OK

3讯检、用unpack分解字典

from ddt import ddt,data,file_data,unpack

import unittest

@ddt

class MyTestDdt(unittest.TestCase):

? ? def setUp(self):

? ? ? ? print('start')

? ? @data({'value1':1,'value2':2},{'value1':3,'value2':4}) #字典

? ? @unpack

? ? def test_one(self,value1,value2):

? ? ? ? print(f'the @data number is :{value1,value2}')

? ? def tearDown(self):

? ? ? ? print('end')

if __name__ == '__main__':

? ? unittest.main(verbosity=2)

結(jié)果:

test_one_1 (__main__.MyTestDdt) ... ok

start

test_one_2 (__main__.MyTestDdt) ... ok

the @data number is :(1, 2)

----------------------------------------------------------------------

end

Ran 2 tests in 0.000s

start

the @data number is :(3, 4)

OK

end

4琐鲁、自動(dòng)化測(cè)試實(shí)戰(zhàn)

這里我們登錄新浪郵箱,并利用數(shù)據(jù)驅(qū)動(dòng)的方式帶參進(jìn)行測(cè)試

import unittest

from ddt import ddt,data,unpack

from selenium import webdriver

def testdata():

? ? '''測(cè)試數(shù)據(jù)'''

? ? return [('', '', '請(qǐng)輸入郵箱名'), ('', '123456', '請(qǐng)輸入郵箱名'),

? ? ? ? ? ? ('123456', '', '您輸入的郵箱名格式不正確')]

@ddt

class MyMailLogin(unittest.TestCase):

? ? def setUp(self):

? ? ? ? self.url = 'https://mail.sina.com.cn/'

? ? ? ? self.driver = webdriver.Chrome()

? ? ? ? self.driver.maximize_window()

? ? ? ? self.driver.get(self.url)

? ? ? ? self.driver.implicitly_wait(30)

? ? @data(*testdata()) #這里加*后會(huì)將返回?cái)?shù)據(jù)分為一個(gè)個(gè)的元組

? ? @unpack

? ? def test_login(self,username,password,result):

? ? ? ? '''測(cè)試郵箱登錄'''

? ? ? ? self.driver.find_element_by_id('freename').clear()

? ? ? ? self.driver.find_element_by_id('freename').send_keys(username)

? ? ? ? self.driver.find_element_by_id('freepassword').clear()

? ? ? ? self.driver.find_element_by_id('freepassword').send_keys(password)

? ? ? ? self.driver.find_element_by_link_text('登錄').click()

? ? ? ? freeError = self.driver.find_element_by_xpath('//div[@class="freeError"]//span').text

? ? ? ? self.assertEqual(freeError,result)

? ? def tearDown(self):

? ? ? ? self.driver.quit()

if __name__ == '__main__':

? ? unittest.main(verbosity=2)

結(jié)果:

test_login_1___________請(qǐng)輸入郵箱名__ (__main__.MyMailLogin)

測(cè)試郵箱登錄 ... ok

test_login_2_______123456____請(qǐng)輸入郵箱名__ (__main__.MyMailLogin)

測(cè)試郵箱登錄 ... ok

test_login_3___123456________您輸入的郵箱名格式不正確__ (__main__.MyMailLogin)

測(cè)試郵箱登錄 ... ok

需要注意@data( * testdata()) 這里加*后會(huì)將返回?cái)?shù)據(jù)分為一個(gè)個(gè)的元組人灼,否則unpack無(wú)法分解數(shù)據(jù)绣否,就會(huì)報(bào)錯(cuò),列如:

def testdata():

? ? return (('', '', '請(qǐng)輸入郵箱名'), ('', '123456', '請(qǐng)輸入郵箱名'),

? ? ? ? ? ? ('123456', '', '您輸入的郵箱名格式不正確'))

print(*testdata()) #三個(gè)元組

print(testdata()) #一個(gè)元組

結(jié)果:

('', '', '請(qǐng)輸入郵箱名') ('', '123456', '請(qǐng)輸入郵箱名') ('123456', '', '您輸入的郵箱名格式不正確') (('', '', '請(qǐng)輸入郵箱名'), ('', '123456', '請(qǐng)輸入郵箱名'), ('123456', '', '您輸入的郵箱名格式不正確'))

筆者創(chuàng)建了一個(gè)測(cè)試交流群挡毅,如果對(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閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晴埂,居然都是意外死亡究反,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門儒洛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)精耐,“玉大人,你說(shuō)我怎么就攤上這事琅锻∝酝#” “怎么了唐瀑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵瞳收,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我邀跃,道長(zhǎng)处硬,這世上最難降的妖魔是什么小槐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮郁油,結(jié)果婚禮上本股,老公的妹妹穿的比我還像新娘。我一直安慰自己桐腌,他們只是感情好拄显,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著案站,像睡著了一般躬审。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天承边,我揣著相機(jī)與錄音遭殉,去河邊找鬼。 笑死博助,一個(gè)胖子當(dāng)著我的面吹牛险污,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播富岳,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蛔糯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了窖式?” 一聲冷哼從身側(cè)響起蚁飒,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萝喘,沒(méi)想到半個(gè)月后淮逻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阁簸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年爬早,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片强窖。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凸椿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翅溺,到底是詐尸還是另有隱情脑漫,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布咙崎,位于F島的核電站优幸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏褪猛。R本人自食惡果不足惜网杆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伊滋。 院中可真熱鬧碳却,春花似錦、人聲如沸笑旺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筒主。三九已至关噪,卻和暖如春鸟蟹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背使兔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工建钥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虐沥。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓熊经,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親欲险。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奈搜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354