前言
Pytest 相对于unittest 其丰富多样的断言形式就精简了很多
Pytest使用的是python自带的assert关键字来进行断言
Assert关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行成功,否则用例执行失败
Pytest 兼容unittest 的断言
1. 常用断言方法
Pytest 里面断言实际上就是 python标准库里面的 assert 断言方法,常用的有以下几种:
- assert xx :判断 xx 为真
- assert not xx :判断 xx 不为真
- assert a in b :判断 b 包含 a
- assert a == b :判断 a 等于 b
- 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 =========================
说明:
- 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