前言
斷言是完整的測試用例中不可或缺的因素,用例只有加入斷言,將實際結果與預期結果進行比對,才能判斷它的通過與否。
unittest 框架提供了其特有的斷言方式,如:assertEqual、assertTrue、assertIn等,pytest 同樣有自己的斷言方式,即使用assert
進行斷言。
assert
pytest 中使用python源生態assert
字段進行斷言。
常用斷言方式
pytest常用的斷言方式如下:
- 判斷是否相等,assert Actual(實際結果) == Expected(期望結果)
- 判斷是否不相等,assert Actual != Expected,其他如 >、<、>=、<= 都可直接使用。
- 判斷xx是否為真,assert xx
- 判斷xx是否不為真,assert not xx
- 判斷b是否包含a,assert a in b
- 判斷b不包含a,assert a not in b
assert 斷言的對象可以是字符串、int、float、list、dict、tuple 任一類型。
使用示例
自定義了一個查詢所有用戶信息接口,返回參數格式如下:
{
"code": 1000,
"data": [
{"id": 1, "username": "劉德華", "sex": 0, "telephone": "12306", "address": "香港九龍區"},
{"id": 2, "username": "梅艷芳", "sex": 1, "telephone": "95511", "address": "上海黃浦區"},
{"id": 3, "username": "陳百強", "sex": 0, "telephone": "10086", "address": "北京海淀區"},
]
}
用例斷言如下:
def test_get_all_users():
'''查詢所有用戶信息'''
url = "http://127.0.0.1:5000/users"
res = requests.get(url=url).text
res = json.loads(res)
# 斷言是否相等
assert res['code'] == 1000
# 斷言返回結果中data是否為True(這里其實就是判斷是否為空)
assert res['data']
Andy = {"id": 1, "username": "劉德華", "sex": 0, "telephone": "12306", "address": "香港九龍區"}
# 斷言返回結果中data是否包含劉德華的信息
assert Andy in res['data']
斷言通過:
我們修改一下腳本讓斷言不通過,如下:
def test_get_all_users():
'''查詢所有用戶信息'''
url = "http://127.0.0.1:5000/users"
res = requests.get(url=url).text
res = json.loads(res)
# 斷言是否相等
assert res['code'] == 1001
# 斷言返回結果中data是否為True(這里其實就是判斷是否為空)
assert not res['data']
Andy = {"id": 1, "username": "劉德華", "sex": 0, "telephone": "12306", "address": "香港九龍區"}
# 斷言返回結果中data是否包含劉德華的信息
assert Andy not in res['data']
運行結果如下:
可以看到,code 的 Actual 為1000,而 Excepted 為1001,所以斷言直接報錯,不繼續執行后面的代碼。
斷言結果添加異常信息
我們可以在斷言異常的時候,輸出一些提示信息,這樣斷言報錯后,可以方便我們查看原因。
自定義的用戶信息接口可以查詢某個用戶的信息,對它編寫測試腳本如下:
def test_get_user():
'''查詢所有用戶信息'''
url = "http://127.0.0.1:5000/users/1"
res = requests.get(url=url).text
res = json.loads(res)
assert res['code'] == 1000
assert res['data']['username'] == "張學友", "判斷返回是否為張學友,實際返回:{}".format(res['data']['username'])
運行結果如下:
總結
pytest 還能對執行過程中產生的 Exception 及 Warnning 進行斷言,但這些情況在我們的測試中很少會用到,所以不做過多闡述。