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

使用assert语句进行断言

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

代码演示:

def func(): return 3def 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() == 4E assert 3 == 4E + where 3 = func()test_assert.py:5: AssertionError1 failed in 0.07 seconds(wda_python) bash-3.2$ 

 

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

def func(): return 3def 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 evenE AssertionError: Value was odd, should be evenE assert 3 == 4E + where 3 = func()test_assert.py:5: AssertionError1 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 pytestdef 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 pytestdef 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 raisedtest_assert.py:8: AssertionError1 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 == set2E AssertionError: assert set([0, 1, 3, 8]) == set([0, 3, 5, 8])E Extra items in the left set:E 1E Extra items in the right set:E 5E Full diff:E - set([0, 1, 3, 8])E ? -----...E E ...Full output truncated (3 lines hidden), use -vv to showtest_assert.py:4: AssertionError1 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.valdef 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 == f2E assert <test_foocompare.Foo object at 0x1029eb7d0> == <test_foocompare.Foo object at 0x1029eb290>test_foocompare.py:11: AssertionError1 failed in 0.09 seconds(wda_python) bash-3.2$ 

错误提示不够友好, 我们可以通过完成pytest_assertrepr_compare方法自定义

from test_foocompare import Foodef 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.0rootdir: /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 == f2E assert Comparing Foo instance:E vals: 1 != 2test_foocompare.py:11: AssertionError======================================================== 1 failed in 0.05 seconds ========================================================(wda_python) bash-3.2$ 

 

 

 

 

 

 

相关文章