@pytest.mark.parametrize传参
时间: 2023-04-23 07:01:05 浏览: 146
@pytest.mark.parametrize是pytest框架中的一个装饰器,用于参数化测试。它可以让我们在测试函数中传入多组参数,从而避免重复编写测试用例的繁琐过程。使用该装饰器时,我们需要在函数上方添加该装饰器,并在装饰器中指定参数名和参数值的列表。在测试函数中,我们可以通过参数名来引用传入的参数值,从而进行测试。
相关问题
pytest.mark.fixture详解
### Pytest Fixture 的详细用法
Pytest 提供了 `@pytest.fixture` 装饰器用于定义测试夹具 (fixture),这些夹具可以在多个测试函数之间共享状态并执行设置和清理操作。通过这种方式,可以简化测试代码编写过程,并提高可维护性和重用性。
#### 定义 Fixture 函数
要创建一个 fixture,只需简单地使用 `@pytest.fixture` 来装饰目标函数即可:
```python
import pytest
@pytest.fixture
def sample_fixture():
"""这是一个简单的 fixture 示例"""
data = {"key": "value"}
yield data # 返回数据给测试函数,在此之后的语句会在所有依赖它的测试结束后运行
print("Teardown actions") # 清理工作
```
上述例子展示了如何定义带有上下文管理功能的 fixture;当关联的测试完成时会自动触发 teardown 部分中的逻辑[^1]。
#### 使用 Fixture
一旦定义好了 fixture 后,则可以通过参数注入的方式将其传递给任何需要该资源的测试方法中去:
```python
def test_with_sample(sample_fixture):
assert isinstance(sample_fixture, dict)
assert 'key' in sample_fixture
```
这里演示了一个基本的例子来展示怎样利用之前声明过的 fixture 实现自动化验证流程[^2]。
对于更复杂的场景比如浏览器驱动实例初始化等也可以采用相同的方法处理不同类型的环境配置需求。
#### Scope 属性控制作用范围
除了默认的作用域外(即每次遇到请求都会重新构建一次),还可以指定其他级别的 scope 值以适应特定的应用程序结构或者性能考虑因素:
- **function**: 默认选项,默认情况下每个测试都将获得独立的新鲜副本;
- **class**: 对于整个类内的所有成员有效;
- **module**: 整个模块级别共用同一个 instance;
- **session**: 测试会话期间唯一存在.
例如下面这段代码设置了 session 级别的数据库连接池作为全局共享对象提供给各个地方调用而无需重复建立新链接:
```python
@pytest.fixture(scope="session")
def db_connection():
connection = establish_db_connection()
try:
yield connection
finally:
close_db_connection(connection)
```
#### Autouse 自动应用 Fixtures
如果希望某些 fixtures 不必显式传参就能被激活的话,那么就可以开启 autouse 特性开关让其自动生效而不受位置影响:
```python
@pytest.fixture(autouse=True)
def prepare_environment():
setup_env() # 设置环境变量或其他准备工作
yield
cleanup_env() # 结束后的恢复措施
```
这种机制非常适合用来做统一的日志记录、临时文件目录准备等工作项,从而减少冗余代码量的同时也增强了灵活性。
#### Parametrizing Fixtures 参数化 Fixtures
有时可能还需要针对同一套业务逻辑的不同输入条件来进行多轮次迭代式的考察分析,这时便可以用到 parametrize 功能配合 fixtures 达成目的:
```python
import pytest
@pytest.fixture(params=[1, 2, 3])
def number(request):
return request.param
def test_numbers(number):
assert isinstance(number, int), f"{number} is not an integer"
```
在这个案例里我们为名为 `number` 的 fixture 设定了三个整数值作为候选集,每当执行对应的单元检验环节就会依次取出每一个元素赋值给它进而形成一组完整的组合拳效果。
pytest中fixture如何传参
在 pytest 中,可以通过使用装饰器 `@pytest.fixture` 来创建 fixture 函数。fixture 函数可以接受参数,以便在测试函数中使用。
要在 fixture 函数中传递参数,可以通过在装饰器中指定参数名称和值来实现。下面是一个示例:
```python
import pytest
@pytest.fixture
def my_fixture(request):
# 获取参数值
param_value = request.param
# 在这里执行一些操作,例如初始化资源
# 返回 fixture 提供的值
yield param_value
# 在这里执行一些清理操作,例如释放资源
def test_my_test(my_fixture):
# 在测试函数中使用 fixture 的值
assert my_fixture == "参数值"
```
在上面的例子中,`my_fixture` 是一个 fixture 函数。它使用了 `@pytest.fixture` 装饰器来标识它是一个 fixture。
在测试函数 `test_my_test` 中,我们将 `my_fixture` 作为参数传递。当运行测试时,pytest 会根据 fixture 的名称来查找匹配的 fixture 函数,并将其返回值传递给测试函数。
要传递参数给 fixture 函数,可以使用 `@pytest.mark.parametrize` 装饰器来指定参数名称和值。例如:
```python
import pytest
@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):
param_value = request.param
yield param_value
@pytest.mark.parametrize("my_fixture", ["参数值"], indirect=True)
def test_my_test(my_fixture):
assert my_fixture == "参数值"
```
在上面的例子中,`@pytest.mark.parametrize` 装饰器指定了参数名称为 "my_fixture",并通过 `indirect=True` 来告诉 pytest 在传递参数时使用 fixture 函数。
注意,参数化的值必须与 fixture 函数的参数名称匹配。
希望这个例子能帮助你理解 pytest 中如何传递参数给 fixture 函数!如有更多问题,请随时提问。
阅读全文
相关推荐













