dt 是第三方模塊,需安裝, pip install ddt
DDT包含類的裝飾器ddt和兩個方法裝飾器data(直接輸入測試數據)
通常情況下,data中的數據按照一個參數傳遞給測試用例,如果data中含有多個數據,以元組,列表,字典等數據,需要自行在腳本中對數據進行分解或者使用unpack分解數據。
from ddt import ddt,data,unpack
import unittest
test_data1 = [{"username": "zhangsan", "pwd": "zhangsan"},
{"username": "lisi", "pwd": "lisi"},
{"username": "wangwu", "pwd": "wangwu"},
]
test_data2 = [{"username": "wukong", "pwd": "wukong"},
{"username": "wuneng", "pwd": "woneng"},
{"username": "wujing", "pwd": "wujing"},
]
@ddt
class Test(unittest.TestCase):
def setUp(self):
print("===Start!===")
def tearDown(self):
print("===end!===")
@data(*test_data1)
def test_ddt1(self, data):
print(data)
```
test_ddt1的測試結果是OK的,因為test_data2作為一個整體傳給了data,所以value打印的值為test_data1
```
@data(*test_data2)
def test_ddt2(self, data):
print(data['username'])
```
test_ddt2的測試結果是OK的,因為test_data2作為一個整體傳給了data,然后根據字典取出value值
```
@data([3,2,1],[5,3,2],[10,4,6])
@unpack #@unpack,那么[3,2,1]被分解開,按照用例中的三個參數傳遞
def test_minus(self,a,b,expected):
actual = int(a)-int(b)
expected = int(expected)
print(actual,expected)
self.assertEqual(actual, expected)
```
test_minus的測試結果也是ok的,由於在 @ data(...)下加了 @ unpack, 代表會把數據分解,得到3組測試數據
```
@data([2, 3], [4, 5]) #沒有@unpack,那么[2,3]當成一個參數傳入用例運行
def test_compare(self, a, b):
print(a,b)
self.assertEqual(a, b)
```
test_compare的測試結果是fail的,由於沒有加 @ unpack, 雖然還是會被理解成2組測試數據,但是[2, 3]
作為一個整體被傳給了a, 因為b就沒有值傳入了,所以一執行后報了
TypeError: test_compare() missing 1 required positional argument: 'b' 這句錯
```
if __name__ == "__main__":
unittest.main()