前言

  • Pytest 相对于unittest 其丰富多样的断言形式就精简了很多

  • Pytest使用的是python自带的assert关键字来进行断言

  • Assert关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行成功,否则用例执行失败

  • Pytest 兼容unittest 的断言

1. 常用断言方法

  1. Pytest 里面断言实际上就是 python标准库里面的 assert 断言方法,常用的有以下几种:
  2. - assert xx :判断 xx 为真
  3. - assert not xx :判断 xx 不为真
  4. - assert a in b :判断 b 包含 a
  5. - assert a == b :判断 a 等于 b
  6. - assert a != b :判断 a 不等于 b

例子 7-1

代码:

# -*- coding:utf-8 -*-
# Author: tang_ren_li
# 2021-1-25 22:45

thisdict = {'Name': 'Runoob', 'Age': 7}

class Test_Assert_1():

      def test_assert_case_1(self):
          print("assert xx :判断 xx 为真")
          assert 8>4 # 这里一般接一个逻辑表达式

      def test_assert_case_2(self):
          print("assert xx :判断 xx 不为真")
          assert not 'test' != 'test'  # 这里一般接一个逻辑表达式

      def test_assert_case_3(self):
          print("assert a in b :判断 b 是否包含 a")
          assert  'Age' in thisdict  # 字典thisdict包含Age

      def test_assert_case_4(self):
          print("assert a == b :判断 a 等于 b")
          assert 'test'=='test' # 这里一般接一个逻辑表达式

      def test_assert_case_5(self):
          print("assert a != b :判断 a 不等于 b")
          assert 'test'!='test1'  # 这里一般接一个逻辑表达式

      def test_assert_case_6(self):
          print(" 执行多个断言 ")
          assert 'test1'!='test1'  # 这里一般接一个逻辑表达式
          print(" 测试用例已经终止,运行结果看不到我!")
          assert 'test' == 'test'

运行结果:

========================= test session starts =============================

collecting … collected 6 items

Test_Assert_1.py::Test_Assert_1::test_assert_case_1
Test_Assert_1.py::Test_Assert_1::test_assert_case_2
Test_Assert_1.py::Test_Assert_1::test_assert_case_3
Test_Assert_1.py::Test_Assert_1::test_assert_case_4
Test_Assert_1.py::Test_Assert_1::test_assert_case_5
Test_Assert_1.py::Test_Assert_1::test_assert_case_6 PASSED [ 16%]assert xx :判断 xx 为真
PASSED [ 33%]assert xx :判断 xx 不为真
PASSED [ 50%]assert a in b :判断 b 是否包含 a
PASSED [ 66%]assert a == b :判断 a 等于 b
PASSED [ 83%]assert a != b :判断 a 不等于 b
FAILED [100%]执行多个重断言

Test_Assert_1.py:29 (Test_Assert_1.test_assert_case_6)
‘test1’ != ‘test1’
预期:’test1’
实际:’test1’
<点击以查看差异>

self =
def test_assert_case_6(self):
print(“执行多个重断言”)
> assert ‘test1’!=’test1’ # 这里一般接一个逻辑表达式
E AssertionError: assert ‘test1’ != ‘test1’
Test_Assert_1.py:33: AssertionError

========================= 1 failed, 5 passed in 0.13s =========================

说明:

  1. pytest也可以写多个断言,但一个失败,后面的断言将不再执行

2. 异常断言方法

2.1 使用 pytest.raises

        使用 pytest.raises 作为上下文管理器,对预期异常进行捕捉抛出,当抛出异常时可以获取<br />            到对应的异常实例

代码:

# -*- coding:utf-8 -*-
# Author: tang_ren_li
# 2021-1-25 22:45

def test_zero_division_1(self):

    with pytest.raises(ZeroDivisionError) as excptionErr: #断言下面代码块产生的异常是否和抛出的异常对象类型一致

        1/0

        assert  excptionErr.type==ZeroDivisionError

        assert "division by zero" in str(excptionErr.value)
<br />**执行结果:**

Test_Assert_1.py::Test_Assert_1::test_zero_division_1 PASSED [100%]

2.2 使用检查断言装饰器


对于检查未修复的错误(即可能会发生异常,已知异常),使用检查断言 装饰器@pytest.mark.xfail(raises=ZeroDivisionError) 可能会更好

代码:

  @pytest.mark.xfail(raises=ZeroDivisionError)
      def test_zero_division_2(self):
               1 / 0

执行结果:

Test_Assert_1.py::test_zero_division_2 XFAIL [100%]
@pytest.mark.xfail(raises=ZeroDivisionError)
def test_zero_division_2():
> 1 / 0
E ZeroDivisionError: division by zero
Test_Assert_1.py:53: ZeroDivisionError

说明:
**1. 这里直接报的预期失败状态XFAIL