iOS自动化探索(五)自动化测试框架pytest - Assert断言的使用

使用assert语句进行断言

pytest允许使用标准的python assert语法,用来校验expectation and value是否一致

代码演示:

def func():
return def test_func():
assert func() ==

执行结果:

(wda_python) bash-3.2$ pytest -q test_assert.py
F [%]
================================================================ FAILURES ================================================================
_______________________________________________________________ test_func ________________________________________________________________ def test_func():
> assert func() ==
E assert ==
E + where = func() test_assert.py:: AssertionError
failed in 0.07 seconds
(wda_python) bash-3.2$

同时支持在assert后面添加描述信息:

def func():
return def test_func():
assert func() == , 'Value was odd, should be even'

执行结果:

(wda_python) bash-3.2$ pytest -q test_assert.py
F [%]
================================================================ FAILURES ================================================================
_______________________________________________________________ test_func ________________________________________________________________ def test_func():
> assert func() == , 'Value was odd, should be even'
E AssertionError: Value was odd, should be even
E assert ==
E + where = func() test_assert.py:: AssertionError
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
. [%]
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
. [%]
passed in 0.03 seconds
(wda_python) bash-3.2$

如果不匹配的话就会报错:

import pytest

def func():
raise SystemError("Exception 12 raised") def test_func():
with pytest.raises(SystemError, match=r'.* 123 .*'):
func()

输出:

(wda_python) bash-3.2$ pytest -q test_assert.py
F [%]
================================================================ 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:: AssertionError
failed in 0.07 seconds
(wda_python) bash-3.2$

断言上下文内容(变量)是否相等

实例代码:

def test_set_comparison():
set1 = set('')
set2 = set('')
assert set1 == set2

运行结果:

(wda_python) bash-3.2$ pytest -q test_assert.py
F [%]
================================================================ FAILURES ================================================================
__________________________________________________________ test_set_comparison ___________________________________________________________ def test_set_comparison():
set1 = set('')
set2 = set('')
> assert set1 == set2
E AssertionError: assert set(['', '', '', '']) == set(['', '', '', ''])
E Extra items in the left set:
E ''
E Extra items in the right set:
E ''
E Full diff:
E - set(['', '', '', ''])
E ? -----...
E
E ...Full output truncated ( lines hidden), use '-vv' to show test_assert.py:: AssertionError
failed in 0.10 seconds
(wda_python) bash-3.2$

自定义断言

官方解释如下

 

iOS自动化探索(五)自动化测试框架pytest - Assert断言的使用

我们可以通过实现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()
f2 = Foo(1)
assert f1 == f2

运行结果如下:

(wda_python) bash-3.2$ pytest -q test_foocompare.py
F [%]
================================================================ FAILURES ================================================================
______________________________________________________________ test_compare ______________________________________________________________ def test_compare():
f1 = Foo()
f2 = Foo()
> assert f1 == f2
E assert <test_foocompare.Foo object at 0x1029eb7d0> == <test_foocompare.Foo object at 0x1029eb290> test_foocompare.py:: AssertionError
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., pytest-4.1., py-1.7., pluggy-0.8.
rootdir: /Users/jackey/Documents/iOS/code/iOS-Auto/Agent_Test, inifile:
collected item test_foocompare.py F [%] ================================================================ FAILURES ================================================================
______________________________________________________________ test_compare ______________________________________________________________ def test_compare():
f1 = Foo()
f2 = Foo()
> assert f1 == f2
E assert Comparing Foo instance:
E vals: != test_foocompare.py:: AssertionError
======================================================== failed in 0.05 seconds ========================================================
(wda_python) bash-3.2$
上一篇:ext2文件系统


下一篇:函数buf_page_init_for_read