使用assert语句进行断言
pytest允许使用标准的python assert语法,用来校验expectation and value是否一致
代码演示:
def func(): return 3 def test_func(): assert func() == 4
执行结果:
(wda_python) bash-3.2$ pytest -q test_assert.py F [100%] ================================================================ FAILURES ================================================================ _______________________________________________________________ test_func ________________________________________________________________ def test_func(): > assert func() == 4 E assert 3 == 4 E + where 3 = func() test_assert.py:5: AssertionError 1 failed in 0.07 seconds (wda_python) bash-3.2$
同时支持在assert后面添加描述信息:
def func(): return 3 def test_func(): assert func() == 4, 'Value was odd, should be even'
执行结果:
(wda_python) bash-3.2$ pytest -q test_assert.py F [100%] ================================================================ FAILURES ================================================================ _______________________________________________________________ test_func ________________________________________________________________ def test_func(): > assert func() == 4, 'Value was odd, should be even' E AssertionError: Value was odd, should be even E assert 3 == 4 E + where 3 = func() test_assert.py:5: AssertionError 1 failed in 0.07 seconds (wda_python) bash-3.2$
预期异常的断言
pytest中使用with pytest.raises: 来断言预期异常
代码演示:
import pytest
def func():
raise SystemExit(1)
def test_func():
with pytest.raises(SystemExit):
func()
执行输出:
(wda_python) bash-3.2$ pytest -q test_sysexit.py . [100%] 1 passed in 0.04 seconds (wda_python) bash-3.2$
还可以自定义错误描述:
import pytest def func(): raise SystemError("Exception 123 raised") def test_func(): with pytest.raises(SystemError, match=r'.* 123 .*'): func()
输出:
(wda_python) bash-3.2$ pytest -q test_assert.py . [100%] 1 passed in 0.03 seconds (wda_python) bash-3.2$
如果不匹配的话就会报错:
import pytest def func(): raise SystemError("Exception 124 raised") def test_func(): with pytest.raises(SystemError, match=r'.* 123 .*'): func()
输出:
(wda_python) bash-3.2$ pytest -q test_assert.py F [100%] ================================================================ FAILURES ================================================================ _______________________________________________________________ test_func ________________________________________________________________ def test_func(): with pytest.raises(SystemError, match=r'.* 123 .*'): > func() E AssertionError: Pattern '.* 123 .*' not found in 'Exception 124 raised' test_assert.py:8: AssertionError 1 failed in 0.07 seconds (wda_python) bash-3.2$
断言上下文内容(变量)是否相等
实例代码:
def test_set_comparison(): set1 = set('1308') set2 = set('8035') assert set1 == set2
运行结果:
(wda_python) bash-3.2$ pytest -q test_assert.py F [100%] ================================================================ FAILURES ================================================================ __________________________________________________________ test_set_comparison ___________________________________________________________ def test_set_comparison(): set1 = set('1308') set2 = set('8035') > assert set1 == set2 E AssertionError: assert set(['0', '1', '3', '8']) == set(['0', '3', '5', '8']) E Extra items in the left set: E '1' E Extra items in the right set: E '5' E Full diff: E - set(['0', '1', '3', '8']) E ? -----... E E ...Full output truncated (3 lines hidden), use '-vv' to show test_assert.py:4: AssertionError 1 failed in 0.10 seconds (wda_python) bash-3.2$
自定义断言
官方解释如下
我们可以通过实现pytest_assertrepr_compare方法,来自定义assert实现
比如一个Class Foo,我们比较f1和f2
class Foo(object): def __init__(self, val): self.val = val def __eq__(self, other): return self.val == other.val def test_compare(): f1 = Foo(1) f2 = Foo(1) assert f1 == f2
运行结果如下:
(wda_python) bash-3.2$ pytest -q test_foocompare.py F [100%] ================================================================ FAILURES ================================================================ ______________________________________________________________ test_compare ______________________________________________________________ def test_compare(): f1 = Foo(1) f2 = Foo(2) > assert f1 == f2 E assert <test_foocompare.Foo object at 0x1029eb7d0> == <test_foocompare.Foo object at 0x1029eb290> test_foocompare.py:11: AssertionError 1 failed in 0.09 seconds (wda_python) bash-3.2$
错误提示不够友好, 我们可以通过完成pytest_assertrepr_compare方法自定义
from test_foocompare import Foo def pytest_assertrepr_compare(op, left, right): if isinstance(left, Foo) and isinstance(right, Foo) and op == "==": return ['Comparing Foo instance:', 'vals: %s != %s' % (left.val, right.val)]
运行结果如下:
(wda_python) bash-3.2$ pytest ========================================================== test session starts =========================================================== platform darwin -- Python 2.7.15, pytest-4.1.0, py-1.7.0, pluggy-0.8.0 rootdir: /Users/jackey/Documents/iOS/code/iOS-Auto/Agent_Test, inifile: collected 1 item test_foocompare.py F [100%] ================================================================ FAILURES ================================================================ ______________________________________________________________ test_compare ______________________________________________________________ def test_compare(): f1 = Foo(1) f2 = Foo(2) > assert f1 == f2 E assert Comparing Foo instance: E vals: 1 != 2 test_foocompare.py:11: AssertionError ======================================================== 1 failed in 0.05 seconds ======================================================== (wda_python) bash-3.2$