pytest(5)-斷言


前言

斷言是完整的測試用例中不可或缺的因素,用例只有加入斷言,將實際結果與預期結果進行比對,才能判斷它的通過與否。

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 進行斷言,但這些情況在我們的測試中很少會用到,所以不做過多闡述。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM