pytest 常見問題解答 (FAQ)
1. 基礎問題
Q1: 如何讓 pytest 發現我的測試文件?
- 測試文件命名需符合
test_*.py
或*_test.py
模式 - 測試函數/方法需以
test_
開頭 - 測試類需以
Test
開頭(且不能有__init__
方法)
Q2: 如何運行特定測試?
pytest path/to/test_file.py::test_func # 運行單個測試
pytest -k "pattern" # 運行名稱匹配的測試
pytest -m mark_name # 運行特定標記的測試
Q3: 如何查看詳細的測試輸出?
pytest -v # 詳細模式
pytest -s # 顯示print輸出
pytest --tb=auto # 控制錯誤回溯顯示方式(native/short/no等)
2. 配置問題
Q4: 如何配置 pytest 默認選項?
在項目根目錄創建 pytest.ini
:
[pytest]
addopts = -v --tb=short
python_files = test_*.py
markers =slow: marks tests as slow
Q5: 如何跳過某些測試?
@pytest.mark.skip(reason="Not implemented yet")
def test_feature():...@pytest.mark.skipif(sys.version_info < (3, 8), reason="requires Python 3.8+")
def test_py38_feature():...
3. 高級用法問題
Q6: 什么是 fixture?如何使用?
Fixture 是 pytest 的依賴注入系統:
@pytest.fixture
def db_connection():conn = create_connection()yield conn # 測試執行前運行conn.close() # 測試執行后清理def test_query(db_connection): # 自動注入fixtureresult = db_connection.query("SELECT 1")assert result == 1
Q7: 如何參數化測試?
@pytest.mark.parametrize("input,expected", [("3+5", 8),("2+4", 6),
])
def test_eval(input, expected):assert eval(input) == expected
4. 常見錯誤解決
Q8: 遇到 “fixture not found” 錯誤?
- 確保 fixture 名稱拼寫正確
- 將常用 fixture 放在
conftest.py
文件中 - 檢查 fixture 作用域(如 module/session 級fixture不能用在函數級fixture中)
Q9: 如何解決插件沖突?
pip list | grep pytest # 查看已安裝插件
pytest --trace-config # 查看加載的插件
5. 集成與擴展
Q10: 如何生成覆蓋率報告?
pip install pytest-cov
pytest --cov=my_package --cov-report=html
Q11: 如何并行運行測試?
pip install pytest-xdist
pytest -n 4 # 使用4個worker
6. 調試技巧
Q12: 如何調試失敗的測試?
pytest --pdb # 失敗時進入pdb調試
pytest --trace # 立即進入調試在每個測試開始前
Q13: 如何查看fixture執行順序?
pytest --setup-show test_file.py
7. 最佳實踐
Q14: 如何組織大型測試套件?
- 按功能模塊組織測試文件
- 使用
conftest.py
共享 fixture - 合理使用標記分類測試
Q15: 如何測試異常?
def test_divide_by_zero():with pytest.raises(ZeroDivisionError):1 / 0# 也可以檢查異常信息with pytest.raises(ValueError, match="invalid literal"):int("a")
8. 性能問題
Q16: 如何加速測試執行?
- 使用
pytest-xdist
并行運行 - 減少 I/O 操作,使用 mock
- 將慢測試標記為
@pytest.mark.slow
并默認跳過