1.断言
即然是测试框架,自然应该有对测试结果的验证,执行的测试用例是Pass还是Fail,需要有预期结果与实际结果的比对,结果匹配测试结果Pass,反之则失败。pytest使用标准的python 断言验证测试结果的值。
可过以下几种方式进行断言校验:
- assert a == b 判断a等于b
- assert a != b 判断a不等于b
- assert a in b 判断b包含b
- assert a 判断a为真
- assert not a 判断a不为真
运行结果如下:
2.预期异常
为了写有关引发异常的断言,可以用pytest.raises作为上下文管理器
def test_zero_division():
with pytest.raises(ZeroDivisionError):
1 / 0
如果您需要访问实际的异常信息,可以使用:
with pytest.raises(RuntimeError) as excinfo:
def f():
f()
f()
assert excinfo.type == RuntimeError
assert "maximum recursion" in str(excinfo.value)
exinfo是一个ExceptionInfo实例,它是实际引发异常的包装器。主要属性有**.type、.value和.traceback**。
注意:断言type的时候,异常类型是不需要加引号的,断言value值的时候需转str。
可以将match关键字参数传递给上下文管理器进行测试,通过正则表达式是否与异常的字符串表示形式匹配(类似于测试用例.assertraiseregexp来自unittest的方法):
import pytest
def myfunc():
raise ValueError("Exception 123 raised")
def test_match():
with pytest.raises(ValueError, match=r".* 123 .*"):
myfunc()
在版本3.0中已修改:上下文管理中,可使用参数message指定自定义失败信息:
with pytest.raises(ZeroDivisionError, message="Expecting ZeroDivisionError"):
pass
结果:Failed: Expecting ZeroDivisionError
python 2.4中需要使用以下方式来测试预期的异常:
pytest.raises(ExpectedException, func, *args, **kwargs)
3.使用上下文进行对比
pytest在校验对比时提供了丰富的上下文对比信息,例如:
# content of test_assert2.py
def test_set_comparison():
set1 = set("1308")
set2 = set("8035")
assert set1 == set2
可得到以下结果
对一些特殊情况的用例进行了比较:
- 比较长字符串:显示上下文差异
- 比较长序列:显示第一个失败的索引
- 比较字典:显示不同的key-value键对值
4.举例接口测试时的校验
import pytest
def request_code(act_code=None):
act_code = 400
return act_code
def request_meg(act_msg=None):
act_msg = 'success'
return act_msg
def test__code():
assert request_code() == 200
def test_msg():
assert request_meg() in 'message": "success感谢***提供***赞助'
if __name__ == "__main__":
pytest.main(['test_assert3.py'])
运行结果如下: