數據驅動的意義:在自動化測試當中,我們通常會將測試數據從測試代碼中抽離出來放在單獨的文件中,既能減少代碼量,也能降低代碼的維護成本,通過數據的改變從而驅動自動化測試的執行。接觸python自動化測試的第一個框架通常都是unittest,使用@ddt裝飾器來完成數據驅動,ddt意思就是 “Data-Driven Tests”。
項目目錄結構
使用pycharm新建一個項目,目錄結構如下:
主要包含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()
執行結果為:
可以看到我們定義的字典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()
執行結果為:
可以看到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()
執行結果為:
綜上,主要介紹了從腳本文件中直接獲取測試數據、從yml文件獲取測試數據、從Json文件獲取測試數據,應該已經可以滿足自動化測試需要了。