python自動(dòng)化測(cè)試Data?Driven?Testing(DDT)用例解析
What is Data Driven Testing
數(shù)據(jù)驅(qū)動(dòng)測(cè)試(Data-driven test)是一種軟件測(cè)試方法,其中測(cè)試數(shù)據(jù)以表格或電子表格格式存儲(chǔ)。數(shù)據(jù)驅(qū)動(dòng)測(cè)試允許測(cè)試人員輸入一個(gè)單一的測(cè)試腳本,可以對(duì)表格中的所有測(cè)試數(shù)據(jù)執(zhí)行測(cè)試,并期望在同一表格中的測(cè)試輸出。它也被稱為表驅(qū)動(dòng)測(cè)試或參數(shù)化測(cè)試。尤其是針對(duì)于自動(dòng)化測(cè)試,DDT幾乎是所有自動(dòng)化測(cè)試默認(rèn)遵循的規(guī)范。當(dāng)我們執(zhí)行自動(dòng)化測(cè)試的時(shí)候,都會(huì)遵照DDT的要求,盡量將測(cè)試中的可變數(shù)據(jù)抽象出來,變成單獨(dú)的文件,這個(gè)文件的格式可以是csv、xslx,也可以是json、xml或者是database。
Why Data Driven Testing
DDT的數(shù)據(jù)一般包括支持自動(dòng)化測(cè)試用例執(zhí)行的測(cè)試數(shù)據(jù),UI測(cè)試使用的元素定位數(shù)據(jù),和測(cè)試產(chǎn)生的測(cè)試結(jié)果。使用DDT的方式編寫我們的測(cè)試腳本可以
1. 盡量保證test case和容易發(fā)生變化的數(shù)據(jù)解耦。這樣當(dāng)容易發(fā)生變化的數(shù)據(jù)變更后可以在統(tǒng)一的位置進(jìn)行維護(hù)。同時(shí)腳本的實(shí)現(xiàn)方式發(fā)生變化的時(shí)候不影響用例本身的執(zhí)行。
2. 可以復(fù)用代碼,避免重復(fù)冗余的代碼。
How to create a Data Driven Automation Framework
DDT究竟怎么落地到實(shí)際的測(cè)試中呢?舉個(gè)例子,最簡(jiǎn)單的登陸注冊(cè)頁面,正確的用戶名,錯(cuò)誤的密碼;正確的密碼,錯(cuò)誤的用戶名;正確的用戶名,正確的密碼; 甚至輸入用戶名的格式和密碼的格式不同都會(huì)產(chǎn)生不同的用例。那我們可以把這些不同的數(shù)據(jù)存在一個(gè)文件中,用變量的方式把數(shù)據(jù)傳遞到登陸的方法中,這樣就完成了一個(gè)簡(jiǎn)單的DDT測(cè)試腳本。
為了能更加方便的使用DDT的方式編寫測(cè)試,有很多工具來輔助我們更簡(jiǎn)單的實(shí)現(xiàn)DDT。如果你的常用編程語言是python,可以了解下python中的selenium-ddt庫。里面的常用方法是@data、@ddt、@unpack、@file_data這四種裝飾器。
import os from ddt import ddt, data, unpack, file_data import unittest def get_data(): testdata = [{'name': 'tom', 'age': 20}, {'name': 'kite', 'age': 30}] return testdata @ddt class MyTestCase(unittest.TestCase): @data(1, 2, 3) //單組元組數(shù)據(jù) def test1(self, value): print(value) @data((1, 2, 3), (4, 5, 6)) def test2(self, value): print(value) @data((1, 2, 3), (4, 5, 6)) //多組元組數(shù)據(jù) @unpack // 加入unpack方法后使用兩組數(shù)據(jù)執(zhí)行該用例 def test3(self, value1, value2, value3): print(value1, value2, value3) @data([{'name': 'tom', 'age': 20}, {'name': 'kite', 'age': 30}]) //列表數(shù)據(jù) def test4(self, value): print(value) @data({'name': 'tom', 'age': '20'}, {'name': 'kite', 'age': '30'})//字典數(shù)據(jù) def test5(self, value): print(value) @data({'name': 'tom', 'age': '20'}, {'name': 'kite', 'age': '30'})//多組字典數(shù)據(jù)拆分 @unpack def test6(self, name, age): print(name, age) testdata = [{'name': 'tom', 'age': 20}, {'name': 'kite', 'age': 30}] # @data(*testdata) @data(get_data()) //可以引用其他方法中的數(shù)據(jù) def test7(self, value): print(value) @file_data(os.getcwd() + '/test.json')//讀取文件應(yīng)用文件中的數(shù)據(jù) def test8(self, value2): print(value2) if __name__ == '__main__': unittest.main()
代碼比較簡(jiǎn)單但是可以說明問題,感興趣的同學(xué)可以自己嘗試運(yùn)行一下,查看結(jié)果??梢钥吹絛dt中支持多種多樣數(shù)據(jù)結(jié)構(gòu)的同時(shí),也支持不同獲取數(shù)據(jù)的來源,可以是定義在腳本中的數(shù)據(jù),也可以是函數(shù)的返回?cái)?shù)據(jù),還可以讀取文件中的數(shù)據(jù)。雖然在pytest支持參數(shù)化注解后就很少人使用selenium-ddt了,但是其中的設(shè)計(jì)思想還是值得參考。
下面是一個(gè)pytest參數(shù)化的。pytest的參數(shù)化是通過@pytest.mark.parametrize注解來實(shí)現(xiàn)的。
@pytest.mark.parametrize的內(nèi)部是ParametrizeMarkDecorator,ParametrizeMarkDecorator的類中傳入了MarkDecorator裝飾器,這個(gè)裝飾器被調(diào)用后,會(huì)將標(biāo)記附加在類中,自動(dòng)應(yīng)用到類中找到的所有用例里面。
這就是為什么使用注解后的用例可以全部被執(zhí)行的原因。而讀取這些數(shù)據(jù)解析出來,是因?yàn)镻arametrizeMarkDecorator的實(shí)現(xiàn)是一個(gè)Iterable,當(dāng)傳入的data是一個(gè)可迭代對(duì)象的時(shí)候,就可以將data中的數(shù)據(jù)unpack出來。
login_data = [ ('test001', 'test001@qq.com', '123456', '123456', '666', '驗(yàn)證碼不正確'), ('test200', 'test009@qq.com', '123456', '123456', '111', '注冊(cè)成功,點(diǎn)擊確定進(jìn)行登錄。'), ] @pytest.mark.parametrize('username,email,pwd,expected', login_data) def test1_register(self, username, email, pwd, expected): self.driver.find_element(By.NAME, 'username').send_keys(username) self.driver.find_element(By.NAME, 'email').send_keys(email) self.driver.find_element(By.NAME, 'pwd').send_keys(pwd) self.driver.find_element(By.NAME, 'comfirmed').click() WebDriverWait(self.driver, 5).until(EC.alert_is_present()) alert = self.driver.switch_to.alert assert alert.text == expected alert.accept()
Best practices of Data Driven testing
- 在數(shù)據(jù)驅(qū)動(dòng)測(cè)試過程中,使用真實(shí)的數(shù)據(jù)是最理想的。
- 測(cè)試流程應(yīng)該在編寫在測(cè)試腳本內(nèi)。
- 使用數(shù)據(jù)來驅(qū)動(dòng)斷言。
- 測(cè)試數(shù)據(jù)要包含積極和消極的結(jié)果。
- 將數(shù)據(jù)驅(qū)動(dòng)的功能測(cè)試復(fù)用在其他形式的測(cè)試,如安全或者性能測(cè)試。
Disadvantages of Data Driven testing
- 測(cè)試的質(zhì)量取決于實(shí)施團(tuán)隊(duì)的自動(dòng)化技能。
- 當(dāng)測(cè)試腳本需要大量的數(shù)據(jù)時(shí),數(shù)據(jù)驗(yàn)證的工作也會(huì)比較復(fù)雜。
- 維護(hù)測(cè)試是一個(gè)大問題,因?yàn)閿?shù)據(jù)驅(qū)動(dòng)測(cè)試需要大量的編碼。
- 使用DDT完成測(cè)試腳本的開發(fā)需要比較高水平的coding能力。
- 會(huì)產(chǎn)生很多文件。主要是與管理測(cè)試腳本和測(cè)試結(jié)果有關(guān)。
DDT是一種編寫自動(dòng)化測(cè)試的規(guī)范或者說是一個(gè)框架,用文件的形式存儲(chǔ)測(cè)試數(shù)據(jù),達(dá)到數(shù)據(jù)和測(cè)試腳本物理上的隔離,從而達(dá)到更好維護(hù)用例和更make sense的結(jié)果。
以上就是python自動(dòng)化測(cè)試Data Driven Testing(DDT)用例解析的詳細(xì)內(nèi)容,更多關(guān)于python自動(dòng)化測(cè)試DDT的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python自動(dòng)化測(cè)試工具Helium使用示例
- Python?pytest自動(dòng)化測(cè)試庫十個(gè)強(qiáng)大用法示例
- Python UI自動(dòng)化測(cè)試Web frame及多窗口切換
- python自動(dòng)化測(cè)試中APScheduler?Flask的應(yīng)用示例
- python自動(dòng)化測(cè)試用例全對(duì)偶組合與全覆蓋組合比較
- python自動(dòng)化測(cè)試通過日志3分鐘定位bug
- python自動(dòng)化測(cè)試selenium屏幕截圖示例
- python自動(dòng)化測(cè)試selenium定位frame及iframe示例
- python?Helium自動(dòng)化庫的功能特性探索
相關(guān)文章
python pywinauto使用過程及問題小結(jié)
在pywinauto庫中,uia即UIAutomation,是微軟提供的用于用戶界面自動(dòng)化測(cè)試和輔助功能訪問的技術(shù)框架,UIAutomation支持自動(dòng)化腳本與各種UI元素交互,本文給大家介紹python pywinauto使用過程及問題小結(jié),感興趣的朋友一起看看吧2024-10-10Python實(shí)現(xiàn)批量識(shí)別銀行卡號(hào)碼以及自動(dòng)寫入Excel表格步驟詳解
這篇文章主要介紹了使用Python實(shí)現(xiàn)高效摸魚,批量識(shí)別銀行卡號(hào)碼并且自動(dòng)寫入Excel表格,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01Python無權(quán)點(diǎn)文件轉(zhuǎn)化成鄰接矩陣方式
這篇文章主要介紹了Python無權(quán)點(diǎn)文件轉(zhuǎn)化成鄰接矩陣方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Python實(shí)現(xiàn)的樸素貝葉斯分類器示例
這篇文章主要介紹了Python實(shí)現(xiàn)的樸素貝葉斯分類器,結(jié)合具體實(shí)例形式分析了基于Python實(shí)現(xiàn)的樸素貝葉斯分類器相關(guān)定義與使用技巧,需要的朋友可以參考下2018-01-01讓Python程序定時(shí)執(zhí)行的8種方法整理
在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),一種方式是采用?Linux?系統(tǒng)自帶的?crond?結(jié)合命令行實(shí)現(xiàn),另外一種方式是直接使用Python。本文整理了一下?Python?定時(shí)任務(wù)的實(shí)現(xiàn)方式,希望對(duì)大家有所幫助2023-01-01python實(shí)現(xiàn)發(fā)送郵件及附件功能
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)發(fā)送郵件及附件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05