iOS自动化探索自动化测试框架pytest - Assert断言的使用
Posted 一切都是最好的安排
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS自动化探索自动化测试框架pytest - Assert断言的使用相关的知识,希望对你有一定的参考价值。
使用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$
以上是关于iOS自动化探索自动化测试框架pytest - Assert断言的使用的主要内容,如果未能解决你的问题,请参考以下文章