【pytest】assert 斷言

使用 assert 斷言:

assert 斷言是判斷測試執行結果是否符合預期的重要方法!

pytest 中的 assert 要比 unittest 中的 assertEqual 等斷言方法靈活很多,它支持各種條件表達式,只要表達式成立(條件最終爲True),便是斷言通過,如果表達式失敗(條件最終爲False),便是斷言失敗。

assert 支持的表達式:

# test_moduleName.py  測試模塊名

class TestClassName:
    """測試類"""

    def test_func_name(self):
        """測試方法"""

        # 預期結果
        a = ...

        # 用例執行結果
        x = ''

        # 斷言
        assert x == a  # 是否相等
        assert x != a  # 是否不相等
        assert x is a  # 是否是同一內存地址
        assert x in a  # a 是否包含 x
        assert x not in a  # a 是否不包含 x
        assert x > a  # 是否大於 a
        assert x < a  # 是否小於 a
        assert isinstance(x, dict)  # x 是否是 dict 類型
        ...

斷言結果分析:

當斷言通過時,pytest 便只會輸出用例執行結果:PASSED;

class TestClassName:
    """測試類"""

    def test_func_name(self):
        """測試方法"""
        
        a = 1
        b = 2

        # 斷言失敗
        assert a < b
============================= test session starts =============================
platform win32 -- Python 3.7.4, pytest-5.3.0, py-1.8.0, pluggy-0.13.1
rootdir: E:\PycharmProject\Demo, inifile: pytest.ini
collected 1 item

test_moduleName.py::TestClassName::test_func_name PASSED                 [100%]

============================== 1 passed in 0.04s ==============================

當斷言失敗時,pytest 便會打印斷言失敗的回溯信息,顯示斷言失敗的位置和變量值等信息:

class TestClassName:
    """測試類"""

    def test_func_name(self):
        """測試方法"""
        
        a = 1
        b = 2

        # 斷言失敗
        assert a == b
============================= test session starts =============================
platform win32 -- Python 3.7.4, pytest-5.3.0, py-1.8.0, pluggy-0.13.1
rootdir: E:\PycharmProject\Demo, inifile: pytest.ini
collected 1 item

test_moduleName.py::TestClassName::test_func_name FAILED                 [100%]

================================== FAILURES ===================================
________________________ TestClassName.test_func_name _________________________

self = <pytestDemo.pytest_new_demo.test_moduleName.TestClassName object at 0x0000021C6850B148>

    def test_func_name(self):
        """測試方法"""
    
        a = 1
        b = 2
    
>       assert a == b
E       assert 1 == 2
E         -1
E         +2

test_moduleName.py:60: AssertionError
============================== 1 failed in 0.48s ==============================

斷言異常信息:

pytest 的 assert 除了可以斷言一般的條件表達式外,還可以斷言異常信息!

使用上下文管理器 with 結合 pytest.raises(xxx) 來斷言是否拋出 xxx 異常,如是則用例 pass,如沒有拋出 xxx 異常信息,則用例 failed;

  1. 下面這段代碼 pytest 檢測到預期的異常信息,所以用例 PASSED;
class TestClassName:
    """測試類"""

    def test_func_name(self):
        """測試方法"""

        # 斷言是否拋出 ZeroDivisionError
        with pytest.raises(ZeroDivisionError):
            # 除法運算中分母不能爲 0 ,否則會拋出異常 ZeroDivisionError;
            assert 1 / 0  

    2. 這段代碼 pytest 未檢測到預期的異常信息,所以用例 Failed;

class TestClassName:
    """測試類"""

    def test_func_name(self):
        """測試方法"""

        # 斷言是否拋出 ZeroDivisionError
        with pytest.raises(ZeroDivisionError):
            # 不會拋出 ZeroDivisionError ,用例會失敗;
            assert 5 // 2
============================= test session starts =============================
platform win32 -- Python 3.7.4, pytest-5.3.0, py-1.8.0, pluggy-0.13.1
rootdir: E:\PycharmProject\Demo, inifile: pytest.ini
collected 1 item

test_moduleName.py::TestClassName::test_func_name FAILED                 [100%]

================================== FAILURES ===================================
________________________ TestClassName.test_func_name _________________________

self = <pytestDemo.pytest_new_demo.test_moduleName.TestClassName object at 0x000001F1F87CB588>

    def test_func_name(self):
        """測試方法"""
    
        # 斷言是否拋出 ZeroDivisionError
        with pytest.raises(ZeroDivisionError):
            # 除法運算中分母不能爲 0 ,否則會拋出異常 ZeroDivisionError;
>           assert 5 // 2
E           Failed: DID NOT RAISE <class 'ZeroDivisionError'>

test_moduleName.py:60: Failed
============================== 1 failed in 0.07s ==============================

Process finished with exit code 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章