Python3|ddt|unittest|淺議數據驅動測試


一、DDT簡介

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裝飾器

@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 自動解壓元組,列表到多個參數;字典到多個關鍵字參數。設計

三、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

四、file_data裝飾器

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接口自動化測試框架的開發過程。

(完)
點擊這裏返回本篇目錄

相關文章
相關標籤/搜索