断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了。什么是断言呢? 简单来讲就是实际结果和期望结果去对比,符合预期那就测试 pass,不符合预期那就测试 failed
pytest 允许使用标准 Python 断言来验证 Python 测试中的期望和值。例如
断言 f()函数的返回值,接下来会看到断言失败,因为返回的值是 3,判断等于 4,所以失败了 从报错信息可以看到断言失败原因:E assert 3 == 4
import pytest def f(): return 3 def test_function(): assert f() == 4 if __name__=='__main__': pytest.main()
异常信息 接下来再看一个案例,如果想在异常的时候,输出一些提示信息,这样报错后,就方便查看是什么原因了
这样当断言失败的时候,会给出自己写的失败原因了 E AssertionError: 判断 a 为偶数,当前 a 的值为:3 import pytest def f(): return 3 def test_function(): a = f() assert a % 2 ==0, f'判断a为偶数,当前a的值为:{a}' if __name__=='__main__': pytest.main()
异常断言:为了写关于引发异常的断言,可以使用 pytest.raises 作为上下文管理器,如下
import pytest def test_zero_division(): with pytest.raises(ZeroDivisionError): 1 / 0 if __name__=='__main__': pytest.main()
如果我们要断言它抛的异常是不是预期的,比如执行:1/0,预期结果是抛异常:ZeroDivisionError: division by zero,那我们要断言这个异常,通常是断言异常的 type 和 value 值了。
这里 1/0 的异常类型是 ZeroDivisionError,异常的 value 值是 division by zero,于是用例可以这样设计
excinfo 是一个异常信息实例,它是围绕实际引发的异常的包装器。主要属性是.type、 .value 和 .traceback 注意:断言 type 的时候,异常类型是不需要加引号的,断言 value 值的时候需转 str 在上下文管理器窗体中,可以使用关键字参数消息指定自定义失败消息
import pytest def test_zero_division(): ''' 断言异常 ''' with pytest.raises(ZeroDivisionError) as excinfo: 1 / 0 # 断言异常类型 type assert excinfo.type == ZeroDivisionError # 断言异常value值 assert 'division by zero' in str(excinfo.value)
常用断言 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
import pytest def is_true(a): if a > 0: return True else: return False def test_01(): '''断言xx为真''' a = 5 b = -1 assert is_true(a) assert not is_true(b) def test_02(): '''断言b包含a''' a = 'hello' b = 'hello world' assert a in b def test_03(): '''断言相等''' a = "XXX" b = "XXX" assert a == b def test_04(): '''断言不等于''' a = 5 b = 6 assert a != b if __name__ == "__main__": pytest.main()