目錄:
- 安裝及入門
- 使用和調(diào)用方法
- 原有TestSuite使用方法
- 斷言的編寫和報(bào)告
- Pytest fixtures:清晰 模塊化 易擴(kuò)展
- 使用Marks標(biāo)記測試用例
- Monkeypatching/對(duì)模塊和環(huán)境進(jìn)行Mock
- 使用tmp目錄和文件
- 捕獲stdout及stderr輸出
- 捕獲警告信息
- 模塊及測試文件中集成doctest測試
- skip及xfail: 處理不能成功的測試用例
- Fixture方法及測試用例的參數(shù)化
- 緩存: 使用跨執(zhí)行狀態(tài)
- unittest.TestCase支持
- 運(yùn)行Nose用例
- 經(jīng)典xUnit風(fēng)格的setup/teardown
- 安裝和使用插件
- 插件編寫
- 編寫鉤子(hook)方法
- 運(yùn)行日志
- API參考
- 優(yōu)質(zhì)集成實(shí)踐
- 片狀測試
- Pytest導(dǎo)入機(jī)制及sys.path/PYTHONPATH
- 配置選項(xiàng)
- 示例及自定義技巧
- Bash自動(dòng)補(bǔ)全設(shè)置
緩存:使用跨執(zhí)行狀態(tài)
版本2.8中的新功能。
用法
該插件提供了兩個(gè)命令行選項(xiàng),用于重新運(yùn)行上次pytest
調(diào)用的失敗:
-
--lf
轮蜕,--last-failed
- 只重新運(yùn)行故障娇钱。 -
--ff
娇昙,--failed-first
- 先運(yùn)行故障然后再運(yùn)行其余的測試旁钧。
對(duì)于清理(通常不需要)骗露,--cache-clear
選項(xiàng)允許在測試運(yùn)行之前刪除所有跨會(huì)話緩存內(nèi)容杯拐。
其他插件可以訪問config.cache對(duì)象以在調(diào)用之間設(shè)置/獲取 json可編碼值pytest
霞篡。
注意
此插件默認(rèn)啟用,但如果需要可以禁用:請(qǐng)參閱 按名稱取消激活/取消注冊(cè)插件(此插件的內(nèi)部名稱為 cacheprovider
)端逼。
首先只重新運(yùn)行故障或故障
首先朗兵,讓我們創(chuàng)建50個(gè)測試調(diào)用,其中只有2個(gè)失敹ヌ病:
# content of test_50.py
import pytest
@pytest.mark.parametrize("i", range(50))
def test_num(i):
if i in (17, 25):
pytest.fail("bad luck")
如果你是第一次運(yùn)行它余掖,你會(huì)看到兩個(gè)失敗:
$ pytest -q
.................F.......F........................ [100%]
================================= FAILURES =================================
_______________________________ test_num[17] _______________________________
i = 17
@pytest.mark.parametrize("i", range(50))
def test_num(i):
if i in (17, 25):
> pytest.fail("bad luck")
E Failed: bad luck
test_50.py:6: Failed
_______________________________ test_num[25] _______________________________
i = 25
@pytest.mark.parametrize("i", range(50))
def test_num(i):
if i in (17, 25):
> pytest.fail("bad luck")
E Failed: bad luck
test_50.py:6: Failed
2 failed, 48 passed in 0.12 seconds
如果你然后運(yùn)行它--lf
:
$ pytest --lf
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 50 items / 48 deselected / 2 selected
run-last-failure: rerun previous 2 failures
test_50.py FF [100%]
================================= FAILURES =================================
_______________________________ test_num[17] _______________________________
i = 17
@pytest.mark.parametrize("i", range(50))
def test_num(i):
if i in (17, 25):
> pytest.fail("bad luck")
E Failed: bad luck
test_50.py:6: Failed
_______________________________ test_num[25] _______________________________
i = 25
@pytest.mark.parametrize("i", range(50))
def test_num(i):
if i in (17, 25):
> pytest.fail("bad luck")
E Failed: bad luck
test_50.py:6: Failed
================= 2 failed, 48 deselected in 0.12 seconds ==================
你只運(yùn)行了上次運(yùn)行中的兩個(gè)失敗測試礁鲁,??而尚未運(yùn)行48個(gè)測試(“取消選擇”)盐欺。
現(xiàn)在,如果使用該--ff
選項(xiàng)運(yùn)行仅醇,將運(yùn)行所有測試冗美,但首先執(zhí)行先前的失敗(從一系列FF
和點(diǎn)中可以看出):
$ pytest --ff
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
collected 50 items
run-last-failure: rerun previous 2 failures first
test_50.py FF................................................ [100%]
================================= FAILURES =================================
_______________________________ test_num[17] _______________________________
i = 17
@pytest.mark.parametrize("i", range(50))
def test_num(i):
if i in (17, 25):
> pytest.fail("bad luck")
E Failed: bad luck
test_50.py:6: Failed
_______________________________ test_num[25] _______________________________
i = 25
@pytest.mark.parametrize("i", range(50))
def test_num(i):
if i in (17, 25):
> pytest.fail("bad luck")
E Failed: bad luck
test_50.py:6: Failed
=================== 2 failed, 48 passed in 0.12 seconds ====================
新的--nf
析二,--new-first
選項(xiàng):首先運(yùn)行新的測試粉洼,然后是其余的測試,在這兩種情況下叶摄,測試也按文件修改時(shí)間排序属韧,最新的文件首先出現(xiàn)。
上次運(yùn)行中沒有測試失敗時(shí)的行為
如果在上次運(yùn)行中沒有測試失敗蛤吓,或者沒有lastfailed
找到緩存數(shù)據(jù)宵喂,pytest
則可以使用該--last-failed-no-failures
選項(xiàng)配置運(yùn)行所有測試或不運(yùn)行測試,該選項(xiàng)采用以下值之一:
pytest --last-failed --last-failed-no-failures all # run all tests (default behavior)
pytest --last-failed --last-failed-no-failures none # run no tests and exit
新的config.cache對(duì)象
插件或conftest.py支持代碼可以使用pytest config
對(duì)象獲取緩存值柱衔。這是一個(gè)實(shí)現(xiàn)pytest fixture的基本示例插件:顯式樊破,模塊化愉棱,可伸縮唆铐,它在pytest調(diào)用中重用以前創(chuàng)建的狀態(tài):
# content of test_caching.py
import pytest
import time
def expensive_computation():
print("running expensive computation...")
@pytest.fixture
def mydata(request):
val = request.config.cache.get("example/value", None)
if val is None:
expensive_computation()
val = 42
request.config.cache.set("example/value", val)
return val
def test_function(mydata):
assert mydata == 23
如果你是第一次運(yùn)行此命令哲戚,則可以看到print語句:
$ pytest -q
F [100%]
================================= FAILURES =================================
______________________________ test_function _______________________________
mydata = 42
def test_function(mydata):
> assert mydata == 23
E assert 42 == 23
test_caching.py:17: AssertionError
-------------------------- Captured stdout setup ---------------------------
running expensive computation...
1 failed in 0.12 seconds
如果再次運(yùn)行它,將從緩存中檢索該值艾岂,并且不會(huì)打印任何內(nèi)容:
$ pytest -q
F [100%]
================================= FAILURES =================================
______________________________ test_function _______________________________
mydata = 42
def test_function(mydata):
> assert mydata == 23
E assert 42 == 23
test_caching.py:17: AssertionError
1 failed in 0.12 seconds
有關(guān)更多詳細(xì)信息顺少,請(qǐng)參閱config.cache。
檢查緩存內(nèi)容
你始終可以使用--cache-show
命令行選項(xiàng)查看緩存的內(nèi)容 :
$ pytest --cache-show
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-4.x.y, py-1.x.y, pluggy-0.x.y
cachedir: $PYTHON_PREFIX/.pytest_cache
rootdir: $REGENDOC_TMPDIR
cachedir: $PYTHON_PREFIX/.pytest_cache
------------------------------- cache values -------------------------------
cache/lastfailed contains:
{'test_50.py::test_num[17]': True,
'test_50.py::test_num[25]': True,
'test_assert1.py::test_function': True,
'test_assert2.py::test_set_comparison': True,
'test_caching.py::test_function': True,
'test_foocompare.py::test_compare': True}
cache/nodeids contains:
['test_caching.py::test_function']
cache/stepwise contains:
[]
example/value contains:
42
======================= no tests ran in 0.12 seconds =======================
清除緩存內(nèi)容
你可以通過添加如下--cache-clear
選項(xiàng)來指示pytest清除所有緩存文件和值:
pytest --cache-clear
對(duì)于Continuous Integration服務(wù)器的調(diào)用王浴,建議使用此選項(xiàng)脆炎,其中隔離和正確性比速度更重要。
逐步修復(fù)失敗用例
作為替代方案氓辣,尤其是對(duì)于你希望測試套件的大部分都會(huì)失敗的情況秒裕,允許你一次修復(fù)一個(gè)。測試套件將運(yùn)行直到第一次失敗然后停止钞啸。在下次調(diào)用時(shí)几蜻,測試將從上次失敗測試?yán)^續(xù),然后運(yùn)行直到下一次失敗測試体斩。你可以使用該選項(xiàng)忽略一個(gè)失敗的測試梭稚,并在第二個(gè)失敗的測試中停止測試執(zhí)行。如果你遇到失敗的測試而只是想稍后忽略它絮吵,這將非常有用弧烤。--lf -x``--sw``--stepwise``--stepwise-skip