簡介
DDT模塊主要用於遍歷測試數據,在一個測試用例方法中,可以循環遍歷入參的所有數據組情況。
- 適用情況:當測試一個接口,不同的測試入參數據組合時,比如登錄接口,需要驗證不同的情況(賬號錯誤、密碼錯誤、驗證碼錯誤等)
爲什麼使用ddt
起因:
在寫自動化接口測試的過程中,我沿用了之前使用過的的unittest框架,例如在一個case中寫登錄的方法,我希望寫一個登錄的方法,我傳參進入方法,然後進行登錄的接口發送。
例如:
import unittest
login = {"url": "http://test.com", "method": "post"}
class Demo(unittest.TestCase):
def test_login(self, login_message):
"""登錄的接口方法(簡化)"""
print("登錄請求 %s" % login_message)
if __name__ == '__main__':
# 運行這個登錄方法
Demo().test_login(login)
但是有一個問題,我想傳好幾組參數:登錄正常、賬號異常、密碼錯誤、密碼爲空…好幾種情況,這個時候我想要驗證的話,該怎麼辦呢。
第一種想法:
傳入一個列表,在方法裏進行循環:
import unittest
login_list = [{"url": "http://test.com", "method": "post"}]
class Demo(unittest.TestCase):
def test_login(self, login_message):
"""登錄的接口方法(簡化)"""
for i in login_message:
print("登錄請求 %s" % i)
if __name__ == '__main__':
Demo().test_login(login_list)
第二種想法:
我在調用登錄方法的時候,根據入參的個數,來多次調用方法:
import unittest
login_list = [{"url": "http://test.com", "method": "post"}]
class Demo(unittest.TestCase):
def test_login(self, login_message):
"""登錄的接口方法(簡化)"""
print("登錄請求 %s" % login_message)
if __name__ == '__main__':
# 運行這個登錄方法
for i in login_list:
Demo().test_login(i)
但是我覺得這兩種方法都不太好,於是我找到了ddt這個第三方模塊,通過這個模塊可以比較優雅的解決這個問題。
通過ddt這個模塊,可以將我們準備的數據作爲入參傳遞到方法中,如果是可以迭代的類型,例如list列表這樣可以迭代的數據類型,那就可以自動循環入參。
如果你把下面的代碼中,login_list改回字典類型的單個入參,你會發現仍然可以正常運行,也就是說ddt是能判斷我們入參的數據類型的。
加入ddt後的代碼
import unittest
import ddt
login_list = [{"url": "http://test.com", "method": "post"},
{"url": "http://csdn.com", "method": "post"}]
@ddt.ddt
class Demo(unittest.TestCase):
@ddt.data(*login_list)
def test_login(self, login_message):
"""登錄的接口方法(簡化)"""
print("登錄請求 %s" % login_message)
if __name__ == '__main__':
# 運行這個登錄方法
unittest.main()
如何使用
- 添加ddt 模塊(pycharm-setting-project Interpreter,點擊+號搜索ddt添加庫)
- 代碼中 import ddt
- 需要在運行測試用例的class上加入裝飾器:@ddt.ddt
- 需要在運行測試用例的def上,加入裝飾器:@ddt.data(*sampleData)來引用測試數據:sampleData
- 需要在運行測試用例的def中,傳入入參數據samData
- 注:(sampleData爲測試數據集,samData爲ddt自動分割的測試數據組,比如sampleData = [1,2,3] samData就爲單個元素1,2,3;用例會執行三次,每次傳入不同的samData數據)
sample代碼
# coding:utf-8
import ddt
import unittest
sampleData = [1,2,3]
@ddt.ddt
class ddtSample(unittest.TestCase):
def setUp(self):
pass
@ddt.data(*sampleData)
def test_ddtSample(self, samData):
print(data)
def tearDown(self):
pass
if __name__ == "__main__":
unittest.main()
實例代碼
# coding:utf-8
import ddt
import unittest
# 測試數據
test_data1 = [{"username": "張三", "pwd": "zhangsan"},
{"username": "李四", "pwd": "lisi"},
{"username": "王五", "pwd": "wangwu"},
]
test_data2 = [{"username": "悟空", "pwd": "wukong"},
{"username": "悟能", "pwd": "woneng"},
{"username": "悟淨", "pwd": "wujing"},
]
@ddt.ddt
class Test(unittest.TestCase):
def setUp(self):
print("Start!")
def tearDown(self):
print("end!")
@ddt.data(*test_data1)
def test_ddt1(self, data):
print(data)
@ddt.data(*test_data2)
def test_ddt2(self, data):
print(data)
if __name__ == "__main__":
unittest.main()
結果
{'pwd': 'zhangsan', 'username': '張三'}
end!
----------------------------------------------------------------------
Start!
Ran 6 tests in 0.001s
{'pwd': 'lisi', 'username': '李四'}
end!
OK
Start!
{'pwd': 'wangwu', 'username': '王五'}
end!
Start!
{'pwd': 'wukong', 'username': '悟空'}
end!
Start!
{'pwd': 'woneng', 'username': '悟能'}
end!
Start!
{'pwd': 'wujing', 'username': '悟淨'}
end!
Process finished with exit code 0
附錄
當初學習ddt時的參考資料地址:
http://www.cnblogs.com/lingzeng86/p/6790827.html
http://www.imooc.com/article/14861
http://blog.csdn.net/u013118036/article/details/45558951