pytest 里写了conftest 在conftest写了fixture,在写test函数的时候会先走哪里
时间: 2024-06-07 21:06:18 浏览: 96
在运行 pytest 测试时,pytest 会首先收集测试用例,然后执行 conftest.py 文件中的 fixture。因此,在编写测试用例时,conftest.py 文件中的 fixture 会先于测试用例执行。这样可以确保在测试用例执行之前,所有需要的 fixture 都已经被创建并准备就绪。如果有多个 conftest.py 文件,pytest 会按照从上到下的顺序依次执行。在执行完所有的 fixture 后,pytest 会执行所有的测试用例。
相关问题
pytest 不使用conftest.py;另一个文件的fixture函数怎么被调用
Pytest是一个流行的Python测试框架,它支持模块级别的 fixtures(固定设置),即不需要放在`conftest.py`(默认的配置文件)里的功能。如果你想在其他文件中定义 fixture 函数并让其在整个项目中可用,可以按照以下步骤操作:
1. **创建fixture**: 首先,在你需要的文件中定义fixture函数。例如,假设你在`utils.py`文件中:
```python
# utils.py
import os
def setup_directory():
# 创建目录等准备工作...
os.makedirs('test_dir', exist_ok=True)
```
2. **标记fixture**:
如果你想在整个测试套件中全局使用这个fixture,可以在定义函数时加上`pytest.mark.fixture`装饰器,并指定`scope='session'`表示在整个测试会话期间只初始化一次:
```python
from _pytest.fixtures import fixture
@fixture(scope="session")
def setup_directory():
# ...
```
3. **在测试模块中引用fixture**:
在每个测试模块(通常以`.py`结尾的文件)里,你可以通过`setup_function`或直接导入的方式使用这个fixture。例如:
```python
# test_module.py
from .utils import setup_directory
def test_something(setup_directory):
assert os.path.exists('test_dir')
```
或者如果你想要在函数级别使用,可以这样引用:
```python
@pytest.fixture(autouse=True)
def per_test_setup(setup_directory):
# ...
```
在这里,`autouse=True`意味着这个fixture会在所有测试函数运行前自动设置。
pytest中向conftest.py中的fixture scope为module的function传参
要向conftest.py中的fixture scope为module的function传参,可以使用pytest的fixture参数化机制。
首先,在conftest.py中定义一个scope为module的fixture,例如:
```
import pytest
@pytest.fixture(scope="module")
def my_fixture(request):
param = request.param
# do something with param
return param
```
然后,在需要使用这个fixture的测试文件中,可以使用pytest.mark.parametrize装饰器来为fixture传递参数,例如:
```
import pytest
@pytest.mark.parametrize("my_fixture", ["param1", "param2"], indirect=True)
def test_my_test(my_fixture):
# do something with my_fixture
assert True
```
这样,pytest会自动将参数传递给conftest.py中的fixture,并在整个module的范围内使用同一个fixture实例。
阅读全文