數據驅動的意義:在自動化測試當中,我們通常會將測試數據從測試代碼中抽離出來放在單獨的文件中,既能減少代碼量,也能降低代碼的維護成本,通過數據的改變從而驅動自動化測試的執行。接觸python自動化測試的第一個框架通常都是unittest,使用@ddt裝飾器來完成數據驅動,ddt意思就是 “Data-Driven Tests”。

項目目錄結構

使用pycharm新建一個項目,目錄結構如下:

python ddt數據驅動_json


主要包含testcases 和testdata兩個包,testcases下面放測試腳本文件,testdata下面放測試數據文件。


2.2 直接在腳本文件中獲取測試數據

testcases package下新建test_ddt.py文件,編寫測試代碼如下:

import unittest
import ddt  # 導入ddt


# 測試數據
data = [
    {"phone": "dfasd132", "key": "dfabc"},
    {"phone": "dfsd134", "key": "dftest"},
    {"phone": "dfdfd188", "key": "dfmin"},
]


@ddt.ddt  # 聲明我們要用它
class Test_ddt(unittest.TestCase):


    def setUp(self):
        print("Before every test case!")


    @ddt.data(*data)#現在比較流行的處理方式,使用*.data直接做字典數據的注入
    def test_001(self, data):
        print("phone is:" +data['phone'])
        print("key is:" +data['key'])


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

執行結果為:

python ddt數據驅動_自動化測試_02


可以看到我們定義的字典data中有3組數據,用例總共執行了3次,按順序每次取一組數據作為入參。


2.3 從yml文件中獲取測試數據

在testdata package下新建testdata1.yml文件,文件中寫入測試數據如下:

#格式要求:
#"-"表示一個列表
#用tab鍵縮進


-
  name: 'testyy'
  age:  18


-
  name: 'testzz'
  age:  20

test_ddt.py文件中修改測試代碼如下:

import unittest
import ddt  # 導入ddt
import yaml


@ddt.ddt  # 聲明我們要用它
class Test_ddt(unittest.TestCase):


    def setUp(self):
        print("Before every test case!")


    @ddt.file_data("..\\testdata\\testdata1.yml")#括號裏寫yml文件的相對路徑
    def test_002(self,name,age):
        print('name is:' +str(name))
        print('age is:' + str(age))


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

執行結果為:

python ddt數據驅動_測試數據_03


可以看到yml文件中我們定義了2組數據,用例總共執行了2次,按順序每次取一組數據作為入參。


2.4 從json文件中獲取測試數據

在testdata package下新建testdata2.json文件,文件中寫入測試數據如下:

{
   "student1": {
       "name": "小明",
       "age": 12
   },
   "student2": {
       "name": "小張",
       "age": 20
   }
}

test_ddt.py文件中修改測試代碼如下:

import unittest
import ddt  # 導入ddt
import yaml


@ddt.ddt  # 聲明我們要用它
class Test_ddt(unittest.TestCase):


    def setUp(self):
        print("Before every test case!")


    @ddt.file_data("..\\testdata\\testdata2.json")#括號裏寫json文件的相對路徑
    def test_003(self,name,age):
        print("name is:"+str(name))
        print("age is:" +str(age))


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

執行結果為:

python ddt數據驅動_自動化測試_04


綜上,主要介紹了從腳本文件中直接獲取測試數據、從yml文件獲取測試數據、從Json文件獲取測試數據,應該已經可以滿足自動化測試需要了。