Time will tell.
1隙袁、使用assert
語句進(jìn)行斷言
Pytest 允許使用標(biāo)準(zhǔn)的 Python assert 語法嘱根,用來校驗expectation and value
是否一致统扳。
代碼:
def func():
return 3
def test_func():
assert func() == 4
結(jié)果:
(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'
結(jié)果:
(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$
2口猜、預(yù)期異常的斷言
Pytest 中使用with pytest.raises
來斷言預(yù)期異常伴网。
代碼:
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$
斷言上下文內(nèi)容(變量)是否相等,實例代碼:
def test_set_comparison():
set1 = set('1308')
set2 = set('8035')
assert set1 == set2
結(jié)果:
(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$
3烫幕、自定義斷言
可通過實現(xiàn)pytest_assertrepr_compare
方法俺抽,來自定義assert
實現(xiàn)。
比如一個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
結(jié)果:
(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)]
結(jié)果如下:
(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$
以上關(guān)于斷言分享就到這里捷犹,希望對看過本章節(jié)的你有所幫助弛饭,如果你喜歡軟件測試這個行業(yè),可以加入我們175317069一起學(xué)習(xí)萍歉,會有行業(yè)深潛多年的測試人技術(shù)分析講解侣颂。
祝愿你能成為一名優(yōu)秀的軟件測試工程師!
歡迎【評論】枪孩、【點贊】憔晒、【關(guān)注】~
Time will tell.(時間會證明一切)