目錄:
- 安裝及入門
- 使用和調(diào)用方法
- 原有TestSuite使用方法
- 斷言的編寫和報告
- Pytest fixtures:清晰 模塊化 易擴展
- 使用Marks標記測試用例
- Monkeypatching/對模塊和環(huán)境進行Mock
- 使用tmp目錄和文件
- 捕獲stdout及stderr輸出
- 捕獲警告信息
- 模塊及測試文件中集成doctest測試
- skip及xfail: 處理不能成功的測試用例
- Fixture方法及測試用例的參數(shù)化
- 緩存: 使用跨執(zhí)行狀態(tài)
- unittest.TestCase支持
- 運行Nose用例
- 經(jīng)典xUnit風格的setup/teardown
- 安裝和使用插件
- 插件編寫
- 編寫鉤子(hook)方法
- 運行日志
- API參考
- 優(yōu)質(zhì)集成實踐
- 片狀測試
- Pytest導入機制及sys.path/PYTHONPATH
- 配置選項
- 示例及自定義技巧
- Bash自動補全設置
安裝及入門
Python支持版本: Python 2.6,2.7,3.3,3.4,3.5, Jython, PyPy-2.3
支持的平臺: Unix/Posix and Windows
PyPI包名: pytest
依賴項: py, colorama (Windows)
PDF文檔: 下載最新版本文檔
pytest是一個方便創(chuàng)建簡單病涨、可擴展性測試用例的框架。測試用例清晰觅够、易讀而無需大量的繁瑣代碼捧请。你幾分鐘內(nèi)便可針對你的應用程序或庫開展一個小型單元測試或者復雜功能測試。
安裝pytest
- 在你的命令行執(zhí)行以下命令
pip install -U pytest
- 檢查你是否安裝了正確的版本
$ pytest --version
This is pytest version 3.x.y, imported from $PYTHON_PREFIX/lib/python3.6/site-packages/pytest.py
創(chuàng)建你的第一個測試用例
使用簡單的4行代碼創(chuàng)建一個簡單的測試方法:
# test_sample.py文件內(nèi)容
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
就是這樣彰触。你可以執(zhí)行一下這個測試方法:
$ pytest
=========================== test session starts ============================
platform linux -- Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
rootdir: $REGENDOC_TMPDIR, inifile:
collected 1 item
test_sample.py F [100%]
================================= FAILURES =================================
_______________________________ test_answer ________________________________
def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + where 4 = func(3)
test_sample.py:5: AssertionError
========================= 1 failed in 0.12 seconds =========================
由于func(3)
并不等于5
,這次測試返回了一個失敗報告。
注意:
你可以使用assert
語句來驗證你測試用例的期望結果荞雏。pytest的高級斷言內(nèi)省機制可以智能地報告展示斷言表達式的中間值來避免來源于JUnit的方法中的變量名重復問題。
執(zhí)行多條測試
pytest
會執(zhí)行當前目錄及子目錄下所有test_*.py
及*_test.py
格式的文件平酿。一般來說凤优,它遵循標準的測試發(fā)現(xiàn)規(guī)則。
斷言指定異常
使用raise
可以用于斷言相應代碼的拋出的指定異常:
# test_sysexit.py文件內(nèi)容
import pytest
def f():
raise SystemExit(1)
def test_mytest():
with pytest.raises(SystemExit):
f()
使用“安靜”模式蜈彼,執(zhí)行這個測試方法:
$ pytest -q test_sysexit.py
. [100%]
1 passed in 0.12 seconds
使用類來組織測試用例
一旦你需要開發(fā)多條測試用例筑辨,你可能會想要使用類來組織它們。使用pytest可以很輕松的創(chuàng)建包含多條用例的測試類:
# test_class.py文件內(nèi)容
class TestClass(object):
def test_one(self):
x = "this"
assert 'h' in x
def test_two(self):
x = "hello"
assert hasattr(x, 'check')
pytest
可以發(fā)現(xiàn)所有遵循Python測試用例發(fā)現(xiàn)約定規(guī)則的用例幸逆,所以它能找到類外以及類中所有以test_
開頭的方法棍辕。測試類無需再繼承任何對象。我們只需要簡單地通過文件名來運行這個模塊还绘。
$ pytest -q test_class.py
.F [100%]
================================= FAILURES =================================
____________________________ TestClass.test_two ____________________________
self = <test_class.TestClass object at 0xdeadbeef>
def test_two(self):
x = "hello"
> assert hasattr(x, 'check')
E AssertionError: assert False
E + where False = hasattr('hello', 'check')
test_class.py:8: AssertionError
1 failed, 1 passed in 0.12 seconds
第一條用例執(zhí)行成功楚昭,第二天用例執(zhí)行失敗。你可以很容易地通過斷言中變量的中間值來理解失敗的原因拍顷。
功能測試中請求使用獨立的臨時目錄
pytest
提供了內(nèi)置fixtures及方法參數(shù)來請求任意資源抚太,比如一個獨立的臨時目錄:
# test_tmpdir.py文件內(nèi)容
def test_needsfiles(tmpdir):
print (tmpdir)
assert 0
在測試函數(shù)參數(shù)中使用tmpdir
,pytest將在測試函數(shù)調(diào)用之前查找并調(diào)用fixture工廠方法來創(chuàng)建資源。在測試運行之前尿贫,pytest創(chuàng)建一個每個測試唯一的臨時目錄:
$ pytest -q test_tmpdir.py
F [100%]
================================= FAILURES =================================
_____________________________ test_needsfiles ______________________________
tmpdir = local('PYTEST_TMPDIR/test_needsfiles0')
def test_needsfiles(tmpdir):
print (tmpdir)
> assert 0
E assert 0
test_tmpdir.py:3: AssertionError
--------------------------- Captured stdout call ---------------------------
PYTEST_TMPDIR/test_needsfiles0
1 failed in 0.12 seconds
有關tmpdir處理的更多信息电媳,請參見: 臨時目錄和文件
進一步閱讀
查看其他pytest文檔資源,來幫助你建立自定義測試用例及獨特的工作流:
- “使用pytest -m pytest來調(diào)用pyest” - 命令行調(diào)用示例
- “將pytest與原有測試套件一起使用”- 使用之前的測試用例
-
“使用屬性標記測試方法” -
pytest.mark
相關信息 - “pytest fixtures:顯式庆亡,模塊化匆背,可擴展” - 為您的測試提供功能基準
- “插件編寫” - 管理和編寫插件
- “優(yōu)質(zhì)集成實踐” - 虛擬環(huán)境和測試分層