依赖注入
fixture 允许你将测试所需的依赖项(如数据库连接、测试数据、API 客户端等)通过参数自动注入到测试函数中,无需手动实例化。
1 2 3 4 5 6 7 8
| import pytest
@pytest.fixture def user(): return {"name": "Alice", "id": 1}
def test_user_name(user): assert user["name"] == "Alice"
|
资源管理
1 2 3 4 5 6 7 8 9 10 11
| fixture 可以管理资源的生命周期(如创建/销毁数据库连接、临时文件等),通过 yield或 addfinalizer实现清理逻辑。
@pytest.fixture def db_connection(): conn = create_db_connection() yield conn conn.close()
def test_db_query(db_connection): data = db_connection.query("SELECT * FROM users") assert len(data) > 0
|
作用域控制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 通过 scope参数控制 fixture 的创建频率,避免重复初始化,提升测试效率:
function(默认):每个测试函数执行一次。
class:每个测试类执行一次。
module:每个模块执行一次。
package:每个包执行一次。
session:整个测试会话执行一次。
@pytest.fixture(scope="session") def heavy_resource(): return initialize_expensive_resource()
|
参数化 fixture(X)
1 2 3 4 5 6 7 8
| 通过 params参数为 fixture 提供多组输入,使测试覆盖不同场景。
@pytest.fixture(params=["admin", "guest", "user"]) def role(request): return request.param
def test_permissions(role): assert role in ["admin", "user", "guest"]
|
fixture 依赖
1 2 3 4 5 6 7
| @pytest.fixture def database(): return Database()
@pytest.fixture def current_user(database): return database.get_user(id=1)
|
自动执行
1 2 3 4 5 6 7
| 设置 autouse=True,fixture 会自动应用于所有作用域内的测试,无需显式声明。
@pytest.fixture(autouse=True) def setup_logging(): logging.info("测试开始") yield logging.info("测试结束")
|
工厂模式
1 2 3 4 5 6 7 8 9 10 11
| fixture 可以返回一个工厂函数,延迟生成资源。
@pytest.fixture def create_user(): def _create_user(name): return User(name=name) return _create_user
def test_user_creation(create_user): user = create_user("Bob") assert user.name == "Bob"
|
参数化测试
参数化测试