在編寫接口用例的過程中,針對一個接口,往往只是參數不同,那么參數化就非常有必要了。
seldom 中參數化的用法非常靈活,這里僅介紹@file_data()
的N種玩法。
二維列表
當參數比較簡單時可以試試下面的方式。
- 參數化數據
{
"add_guest": [
["參數錯誤", "", "", 10021, "parameter error"],
["查詢為空", "tom", "13711001100", 10022, "event id null"],
]
}
- 測試用例
import seldom
from seldom import file_data
class AddGuestTest(seldom.TestCase):
@file_data("add_guest.json", key="add_guest")
def test_case(self, _, real_name, phone, status, msg):
payload = {"realname": real_name, "phone": phone}
self.post("/api/add_guest/", data=payload)
self.assertStatusCode(200)
self.assertPath("status", status)
self.assertPath("message", msg)
if __name__ == "__main__":
seldom.main(base_url="http://127.0.0.1:8000", debug=True)
列表嵌套字典
當參數很多時,不便於閱讀,可以通過字典的方式定義。
- 參數化數據
{
"add_guest": [
{
"name": "參數錯誤",
"real_name": "",
"phone": "",
"status": 10021,
"msg": "parameter error"
},
{
"name": "查詢為空",
"real_name": "tom",
"phone": "13711001100",
"status": 10022,
"msg": "event id null"
},
]
}
- 測試用例
import seldom
from seldom import file_data
class AddGuestTest(seldom.TestCase):
@file_data("add_guest.json", key="add_guest")
def test_case(self, _, real_name, phone, status, msg):
payload = {"realname": real_name, "phone": phone}
self.post("/api/add_guest/", data=payload)
self.assertStatusCode(200)
self.assertPath("status", status)
self.assertPath("message", msg)
if __name__ == "__main__":
seldom.main(base_url="http://127.0.0.1:8000", debug=True)
復雜的數據結構
我們可以將接口的入參、出參進一步拆分。
- 參數化數據
{
"add_guest": [
{
"name": "參數錯誤",
"req": {
"real_name": "",
"phone": ""
},
"resp": {
"status": 10021,
"msg": "parameter error"
}
},
{
"name": "查詢為空",
"req": {
"real_name": "tom",
"phone": "13711001100"
},
"resp": {
"status": 10022,
"msg": "event id null"
}
}
]
}
- 測試用例
import seldom
from seldom import file_data
class AddGuestTest(seldom.TestCase):
@file_data("add_guest.json", key="add_guest")
def test_case(self, _, req, resp):
payload = {"realname": req["real_name"], "phone": req["phone"]}
self.post("/api/add_guest/", data=payload)
self.assertStatusCode(200)
self.assertPath("status", resp["status"])
self.assertPath("message", resp["msg"])
if __name__ == "__main__":
seldom.main(base_url="http://127.0.0.1:8000", debug=True)
通過json編寫用例
雖然不推薦用文件寫用例,你想寫也是可以的。
- 測試用例文件
{
"cases": [
{
"name": "參數錯誤",
"method": "post",
"url": "/api/add_guest/",
"req": {
"eid": "",
"real_name": "",
"phone": ""
},
"resp": {
"status": 10021,
"msg": "parameter error"
}
},
{
"name": "查詢為空",
"method": "post",
"url": "/api/add_guest/",
"req": {
"eid": 901,
"real_name": "tom",
"phone": "13711001100"
},
"resp": {
"status": 10022,
"msg": "event id null"
}
}
]
}
- 解析測試用例
import seldom
from seldom import file_data
class SampleCaseTest(seldom.TestCase):
@file_data("test_case.json", key="cases")
def test_case(self, _, method, url, req, resp):
if method == "post":
payload = {"eid": req["eid"], "realname": req["real_name"], "phone": req["phone"]}
self.post(url, data=payload)
self.assertStatusCode(200)
self.assertPath("status", resp["status"])
self.assertPath("message", resp["msg"])
elif method == "get":
pass
if __name__ == "__main__":
seldom.main(base_url="http://127.0.0.1:8000", debug=True)
最后的這種寫法不是seldom推薦的,假如要測試的接口足夠簡單,設計一個測試方法來處理簡單的接口也未嘗不可。當然,往往實際項目中的用例並不足夠簡單。回到代碼的方式編寫才能足夠個兼具靈活性和易用性。