pytest公共用例如何传入不同的参数

在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):
    # 这里可以添加具体的测试逻辑
```

通过以上几种方法,你可以为公共用例传入不同的参数,从而实现更灵活的测试用例设计。

你可能感兴趣的:(pytest)