iOS自動化探索(五)自動化測試框架pytest - Assert斷言的使用
阿新 • • 發佈:2019-01-09
使用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$