pytest运行命令
时间: 2025-07-08 10:43:38 浏览: 13
### pytest 常用运行命令及其用法
pytest 是一个功能强大的 Python 测试框架,支持多种命令行参数和插件来增强测试的灵活性和可扩展性。以下是 pytest 常用的运行命令及其详细用法说明:
#### 1. **基础命令**
- `pytest`
默认运行当前目录下所有以 `test_*.py` 或 `*_test.py` 命名的测试文件中的测试用例。
- `pytest test_file.py`
运行指定文件 `test_file.py` 中的所有测试用例。
- `pytest test_file.py::TestClass::test_method`
指定运行某个类中的某个方法,例如运行 `TestClass` 类中的 `test_method` 方法。
#### 2. **详细输出控制**
- `-v`, `--verbose`
提供更详细的输出信息,显示每个测试用例的执行结果。
```bash
pytest -v
```
- `--tb=long`
显示完整的错误堆栈跟踪信息。
- `--tb=short`
显示简要的错误信息。
- `--tb=line`
显示具体的错误信息,并生成跳转链接。
- `--tb=native`
结合了 `short` 和 `line` 的特点,提供一种更友好的错误信息展示方式 [^3]。
#### 3. **并行执行**
- `-n NUM`
使用 `pytest-xdist` 插件实现多进程并行执行测试用例,其中 `NUM` 表示并行进程数。
```bash
pytest -n 4
```
上述命令将测试分配到 4 个进程中并行执行 [^1]。
#### 4. **标记筛选**
- `-m MARKEXPR`
根据标记表达式运行特定标记的测试用例。例如:
```bash
pytest -m "smoke"
```
运行所有带有 `@pytest.mark.smoke` 标记的测试用例。
- 在 `pytest.ini` 文件中可以定义常用标记,例如:
```ini
[pytest]
markers =
smoke: 冒烟测试
slow: 慢测试
```
这样在运行时可以直接使用这些标记 [^4]。
#### 5. **测试生命周期控制**
pytest 支持多种级别的前置(setup)和后置(teardown)操作:
- **模块级别**:`setup_module()` 和 `teardown_module()`
分别在模块中所有测试用例执行前和执行后运行一次。
- **类级别**:`setup_class()` 和 `teardown_class()`
分别在类中所有测试用例执行前和执行后运行一次。
- **函数级别**:`setup_function()` 和 `teardown_function()`
分别在每个测试函数执行前和执行后运行 [^5]。
#### 6. **HTML 报告生成**
- `--html=report.html`
生成 HTML 格式的测试报告,方便查看测试结果。
```bash
pytest --html=report.html
```
可以结合 `pytest.ini` 文件设置默认生成报告路径 [^4]。
#### 7. **调试与断点**
- `-s`
允许在测试过程中打印标准输出内容,便于调试。
- `--pdb`
在测试失败时自动进入 Python 调试器(PDB),可以逐步调试代码。
#### 8. **其他实用选项**
- `-x`, `--exitfirst`
遇到第一个失败或错误时立即停止测试。
- `--maxfail=2`
在第一次失败后允许最多再运行两个测试用例,然后停止。
- `-k EXPRESSION`
根据测试用例名称匹配表达式运行测试,例如:
```bash
pytest -k "case3"
```
将运行所有包含 `case3` 的测试用例 [^2]。
---
### 示例代码
以下是一个简单的 pytest 测试脚本示例:
```python
import pytest
def setup_module(module):
print("模块级前置操作")
def teardown_module(module):
print("模块级后置操作")
class TestExample:
def setup_class(self):
print("类级前置操作")
def teardown_class(self):
print("类级后置操作")
def setup(self):
print("函数级前置操作")
def teardown(self):
print("函数级后置操作")
def test_case1(self):
assert 1 == 1
def test_case2(self):
assert 2 == 2
if __name__ == '__main__':
pytest.main(["-vs", "test_example.py"])
```
---
阅读全文
相关推荐


















