Data-Driven Tests(DDT)即數據驅動測試。它容許您經過不一樣的測試數據來運行同一個測試用例,使它做爲多個測試用例出現。其官方文檔給出的定義以下:app
DDT (Data-Driven Tests) allows you to multiply one test case by running it with different test data, and make it appear as multiple test cases.框架
DDT的經典使用場景之一是:測試用例的代碼不變,只有測試數據在變化。DDT做爲第三方庫,使用前須要先安裝:函數
sudo pip3 install ddt
@data()是一個裝飾器,它包含了您想提供給測試方法的值,個數和測試方法參數同樣多。使用方法:在測試類(繼承於unittest.TestCase)上面設置裝飾器@ddt,在測試方法上設置裝飾器@data()
[示例1] @data測試
#coding:utf-8 import unittest #從ddt模塊導入裝飾器ddt,file_data,unpack,data from ddt import ddt,file_data,unpack,data @ddt #定義測試類BoolTest class BoolTest(unittest.TestCase): @data(1,"hello",3>2) def test_true_001(self,value): self.assertTrue(value) @data("",1>2,{}) def test_false_002(self,value): self.assertFalse(value) if __name__ == "__main__": unittest.main()
示例1運行結果以下:
咱們只編寫了兩個測試方法,可是經過6組不一樣的測試數據,最終能夠達到運行6個測試用例的目的。這就是數據驅動測試的強大之處。再來看一個多個輸入值的示例。spa
@unpack 自動解壓元組,列表到多個參數;字典到多個關鍵字參數。設計
[示例2] unpack dict3d
#coding:utf-8 import unittest #從ddt模塊導入裝飾器ddt,file_data,unpack,data from ddt import ddt,file_data,unpack,data #測試取絕對值函數abs() @ddt class AbsTest(unittest.TestCase): @data({"val":1,"res":1}, {"val":0,"res":0}, {"val":-1,"res":1}) @unpack def test_abs(self,val,res): self.assertEqual(abs(val),res) if __name__ == "__main__": unittest.main()
示例2運行結果:
[示例3] unpack listcode
#測試取絕對值函數abs() @ddt class AbsTest(unittest.TestCase): # @data({"val":1,"res":1}, # {"val":0,"res":0}, # {"val":-1,"res":1}) @data([-1,1],[0,0],[1,1]) @unpack def test_abs(self,val,res): self.assertEqual(abs(val),res) if __name__ == "__main__": unittest.main()
示例3運行結果同示例2。blog
ddt支持從文件中加載數據,@file_data()裝飾器會從json或yaml中加載數據。只有以「.yml」 和 「.yaml」 結尾的文件被加載爲Yaml文件。全部其餘格式文件都做爲json文件加載,好比txt。修改示例3。
abs_data.json文件位於測試用例同級目錄,內容以下:
{ "case1":{ "val":1, "res":1 }, "case2":{ "val":-1, "res":1 }, "case3":{ "val":0, "res":0 } }
[示例4] load json
在測試方法test_abs上設置@file_data裝飾器:
#測試取絕對值函數abs() @ddt class AbsTest(unittest.TestCase): # @data({"val":1,"res":1}, # {"val":0,"res":0}, # {"val":-1,"res":1}) @file_data("./abs_data.json") def test_abs(self,val,res): self.assertEqual(abs(val),res) if __name__ == "__main__": unittest.main()
示例4運行結果:
使用數據驅動思想編寫測試用例有如下優點:
劣勢是對測試代碼的質量要求相對較高,試想若是由於測試數據的變化而須要頻繁改動測試方法,那也是一件很痛苦的事情哦。關於測試數據驅動測試,有的玩法是經過從Excel加載測試數據,這必定程度上來說也是可行的,可是碰到複雜的業務場景和測試數據比較多的狀況,很是容易翻車的哦。商用的系統業務場景通常都不簡單,畢業設計作的×××管理系統除外,並且使用Excel,測試依賴這個痛點也很差解決。後面有時間的話,寫一下關於Excel+request+unitest接口自動化測試框架的開發過程。
(完)
點擊這裏返回本篇目錄