1. 程式人生 > 程式設計 >Python+unittest+DDT實現資料驅動測試

Python+unittest+DDT實現資料驅動測試

前言

資料驅動測試:

  • 避免編寫重複程式碼
  • 資料與測試指令碼分離
  • 通過使用資料驅動測試,來驗證多組資料測試場景
  • 通常來說,多用於單元測試和介面測試

ddt介紹

Data-Driven Tests(DDT)即資料驅動測試,可以實現不同資料運行同一個測試用例。ddt本質其實就是裝飾器,一組資料一個場景。

ddt模組包含了一個類的裝飾器ddt和三個個方法的裝飾器:

data:包含多個你想要傳給測試用例的引數,可以為列表、元組、字典等;

file_data:會從json或yaml中載入資料;

unpack:分割元素,如以下示例:

@data([a,d],[c,d])

如果沒有@unpack,那麼[a,b]當成一個引數傳入用例執行

如果有@unpack,那麼[a,b]被分解開,按照用例中的兩個引數傳遞

安裝

pip install ddt

使用data裝飾器

傳遞整體列表,字典、元組

import unittest
from ddt import ddt,data,unpack
def add(a,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  # @data([1,2,3,4,5,6,7])
  @data({"a":"1","b":2})
  # @data((1,3))
  def test(self,data):
    print(data)
if __name__ == '__main__':
  unittest.main(verbosity=2)

巢狀列表、元組、字典的整體傳遞方式

import unittest
from ddt import ddt,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  # @data(*[[1,3],[1,1],[0,0],1,3]])
  # @data(*[{"a":1},{"a":2},{"a":3},{"a":4}])
  @data(*[(1,5),(4,2),(6,7),(5,6)])
  def test(self,data):
    print(data)

if __name__ == '__main__':
  unittest.main(verbosity=2)

使用unpack裝飾器

unpack 依次傳遞元組

import unittest
from ddt import ddt,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  @data((1,3),(1,1),(0,0),3))
  @unpack
  def test(self,a,b,c):
    print(a,c)
    if a+b == c:
      print(True)
    else:
      print(False)
if __name__ == '__main__':
  unittest.main(verbosity=2)

輸出結果:

1 2 3
True
1 0 1
True
0 0 0
True
1 1 3
False

依次傳遞字典

import unittest
from ddt import ddt,unpack

def add(a,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  @data({"a":1,"b":1,"c":2},{"a":0,"b":0,"c":0},{"a":-1,"c":0})
  @unpack
  def test(self,c)
    if a + b == c:
      print(True)
    else:
      print(False)

if __name__ == '__main__':
  unittest.main(verbosity=2)

輸出結果:

1 1 2
True
0 0 0
True
-1 1 0
True

依次傳遞列表

import unittest
from ddt import ddt,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  @data([1,3])
  @unpack
  def test(self,c)
    if a + b == c:
      print(True)
    else:
      print(False)

if __name__ == '__main__':
  unittest.main(verbosity=2)

輸出結果:

1 2 3
True
1 0 1
True
0 0 0
True
1 1 3
False

使用file_data裝飾器

ddt支援從檔案中載入資料,@file_data()裝飾器會從json或yaml中載入資料。只有以“.yml” 和 “.yaml” 結尾的檔案被載入為Yaml檔案。所有其他格式檔案都作為json檔案載入,比如txt。

傳遞json資料

test.json檔案

{
  "case1": {
    "a": 1,"b": 1,"c": 2
  },"case2": {
    "a": -1,"c": 0
  },"case3": {
    "a": 0,"b": 0,"c": 0
  }
}
import unittest
from ddt import ddt,file_data

def add(a,b):
  return a+b

@ddt
class MyTest(unittest.TestCase):
  @file_data("test.json")
  def test(self,c)


if __name__ == '__main__':
  unittest.main(verbosity=2)

傳遞多層json檔案

test.json檔案

{
  "case1": {
    "data": {
      "a": 1,"b": 1
    },"result": 2
  },"case2": {
    "data": {
      "a": 0,"result": 1
  },"case3": {
    "data": {
      "a": 0,"b": 0
    },"result": 0
  }
}
import unittest
from ddt import ddt,result):
    print(data,result)

if __name__ == '__main__':
  unittest.main(verbosity=2)

傳遞yml資料

yml 需要安裝yml(pip install PyYAML)

test.yml

Python+unittest+DDT實現資料驅動測試

def add(a,b):
  return a+b
@ddt
class MyTest(unittest.TestCase):
  @file_data("test.yml")
  def test(self,c)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。