前言
我們?cè)谶M(jìn)行接口測(cè)試時(shí),大多數(shù)時(shí)候都是針對(duì)接口的參數(shù)設(shè)計(jì)用例進(jìn)行測(cè)試,而相應(yīng)的測(cè)試步驟基本相同(調(diào)用接口,檢查返回碼,檢查返回?cái)?shù)據(jù))。這種場(chǎng)景非常適合使用數(shù)據(jù)驅(qū)動(dòng)的測(cè)試。數(shù)據(jù)驅(qū)動(dòng)測(cè)試的理念是將測(cè)試數(shù)據(jù)和測(cè)試步驟分離開,使得測(cè)試代碼更加簡(jiǎn)潔,增加測(cè)試數(shù)據(jù)就能增加測(cè)試用例,這樣使得測(cè)試更加方便快捷?,F(xiàn)本文主要介紹python中的ddt框架ddt。
場(chǎng)景
假設(shè)現(xiàn)在有一個(gè)待測(cè)接口為創(chuàng)建用戶:CreateUser,創(chuàng)建用戶的參數(shù)信息如下:
| 參數(shù) | 說明 |
|---|---|
| username | 長(zhǎng)度3-10,必填 |
| phone | 11位數(shù)字,必填 |
| 選填 | |
| sex | 默認(rèn)值0,0代表男 1代表女 |
針對(duì)這個(gè)說明可以設(shè)計(jì)幾個(gè)測(cè)試用例如下(包括但不限于):
| 參數(shù)數(shù)值 (順序跟上表一致) | 預(yù)期結(jié)果 |
|---|---|
| "ab","13800000000", | 返回400,username不符合要求 |
| "abc","13800000001", | 返回200 |
| "abc1234567","13800000002", None, 1 | 返回200 |
| "abc123456","13800000003", None, 3 | 返回400,性別不符合要求 |
假設(shè)接口的授權(quán)調(diào)用已經(jīng)在MyRequst中實(shí)現(xiàn),則調(diào)用測(cè)試接口的步驟大致如下:
import MyRequst
para={"username": "ab",
"phone": "3800000000"
}
ret = MyRequst.post(para)
assert ret.status_code == 200
assert ret.msg == None
ddt的具體實(shí)踐
如果不使用數(shù)據(jù)驅(qū)動(dòng)測(cè)試,我們的測(cè)試可能會(huì)按如下這種模式寫:
import unittest
import MyRequst
class TestCreateUser(unittest.TestCase):
def test1(self):
para={"username": "ab",
"phone": "3800000000"
}
ret = MyRequst.post(para)
assert ret.status_code == 400
assert ret.msg == "username is invalid"
def test2(self):
para={"username": "abc",
"phone": "3800000001"
}
ret = MyRequst.post(para)
assert ret.status_code == 200
assert ret.msg == None
可見測(cè)試代碼太冗長(zhǎng),如果想增加新的測(cè)試用例,代碼還會(huì)越來越長(zhǎng)。而使用ddt可以將測(cè)試數(shù)據(jù)分離出去,代碼如下:
import unittest
from ddt import ddt, data, file_data, unpack
import MyRequst
@ddt
class TestCreateUser(unittest.TestCase):
#使用外部文件作為測(cè)試數(shù)據(jù)
@file_data('data/test_data_dict_dict.json')
def test(self, username, phone, email, sex, code, msg):
para={"username": username,
"phone": phone,
"email": email,
"sex": sex
}
ret = MyRequst.post(para)
assert ret.status_code == code
assert ret.msg == msg
而其中test_data_dict_dict.json文件中保存測(cè)試數(shù)據(jù)
{
"1":{
"username":"ab",
"phone":"3800000000",
"email":None,
"sex": None,
"code": 400,
"msg":"username is invalid"
},
"2":{
"username":"abc",
"phone":"3800000001",
"email":None,
"sex": None,
"code": 200,
"msg":None
}
}
增加測(cè)試用例只需要在測(cè)試數(shù)據(jù)文件中增加相應(yīng)dict即可,無需要改動(dòng)測(cè)試代碼,這樣非常便于管理,測(cè)試步驟和測(cè)試用例都非常清晰明了。
如果不想使用外部文件,ddt還提供了在data方法可以在測(cè)試用例文件中使用元祖列表等傳入測(cè)試數(shù)據(jù),具體用法可參考官方文檔