一星虹、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ù)交流