在pytest中,如果你想要为公共用例传入不同的参数,可以使用参数化的方法。以下是几种常见的方法:
### 方法一:使用 `@pytest.mark.parametrize` 装饰器
`@pytest.mark.parametrize` 装饰器允许你为测试函数或fixture传入不同的参数组合。
```python
# common_utils.py
import pytest
@pytest.fixture(scope="module")
def common_case(request):
param = request.param
print(f"执行公共用例,参数: {param}")
# 这里可以添加具体的测试逻辑
yield
```
然后在测试文件中使用 `@pytest.mark.parametrize` 装饰器来传入不同的参数:
```python
# test_system1.py
import pytest
from common_utils import common_case
@pytest.mark.parametrize("common_case", ["参数1"], indirect=True)
def test_case1(common_case):
# 这里可以添加具体的测试逻辑
@pytest.mark.parametrize("common_case", ["参数2"], indirect=True)
def test_case2(common_case):
# 这里可以添加具体的测试逻辑
```
```python
# test_system2.py
import pytest
from common_utils import common_case
@pytest.mark.parametrize("common_case", ["参数3"], indirect=True)
def test_case3(common_case):
# 这里可以添加具体的测试逻辑
@pytest.mark.parametrize("common_case", ["参数4"], indirect=True)
def test_case4(common_case):
# 这里可以添加具体的测试逻辑
```
### 方法二:使用 `pytest_generate_tests` 钩子函数
`pytest_generate_tests` 钩子函数允许你在运行时动态生成测试用例。
1. **定义fixture**:
```python
# conftest.py
import pytest
@pytest.fixture(scope="module")
def common_case(request):
param = request.param
print(f"执行公共用例,参数: {param}")
# 这里可以添加具体的测试逻辑
yield
```
2. **使用 `pytest_generate_tests` 钩子函数**:
```python
# conftest.py
def pytest_generate_tests(metafunc):
if "common_case" in metafunc.fixturenames:
params = ["参数1", "参数2", "参数3", "参数4"]
metafunc.parametrize("common_case", params, indirect=True)
```
3. **在测试文件中使用fixture**:
```python
# test_system1.py
def test_case1(common_case):
# 这里可以添加具体的测试逻辑
def test_case2(common_case):
# 这里可以添加具体的测试逻辑
```
```python
# test_system2.py
def test_case3(common_case):
# 这里可以添加具体的测试逻辑
def test_case4(common_case):
# 这里可以添加具体的测试逻辑
```
### 方法三:使用 `pytest.fixture` 的 `params` 参数
你也可以直接在fixture定义中使用 `params` 参数来传入不同的参数组合。
```python
# conftest.py
import pytest
@pytest.fixture(scope="module", params=["参数1", "参数2", "参数3", "参数4"])
def common_case(request):
param = request.param
print(f"执行公共用例,参数: {param}")
# 这里可以添加具体的测试逻辑
yield
```
然后在测试文件中使用这个fixture:
```python
# test_system1.py
def test_case1(common_case):
# 这里可以添加具体的测试逻辑
def test_case2(common_case):
# 这里可以添加具体的测试逻辑
```
```python
# test_system2.py
def test_case3(common_case):
# 这里可以添加具体的测试逻辑
def test_case4(common_case):
# 这里可以添加具体的测试逻辑
```
通过以上几种方法,你可以为公共用例传入不同的参数,从而实现更灵活的测试用例设计。