自动化测试|Pytest中的fixture装饰器详解
pytest是Python生态中最流行的自动化测试框架它通过简洁的语法、强大的功能(如fixture、参数化、插件扩展等)和丰富的插件生态帮助开发者高效完成单元测试、集成测试和端到端测试。fixture是pytest框架中最核心、最强大的功能之一它提供了一种优雅的方式来管理测试依赖项(如数据库连接、测试数据、API客户端等)实现了测试代码的模块化和复用。1fixture基础概念1. fixture的作用依赖注入自动将资源(如数据库连接)注入到测试函数中资源管理统一管理测试资源的创建和清理复用性多个测试用例可以共享同一个fixture2. 基本语法import pytest pytest.fixture def fixture_name(): # 初始化代码 resource create_resource() yield resource # 返回资源给测试用例使用 # 清理代码测试完成后执行 resource.cleanup()2fixture核心特性1. 作用域控制通过scope参数控制fixture的生命周期function(默认)每个测试函数执行一次class每个测试类执行一次module每个Python模块执行一次package每个包执行一次session整个测试会话执行一次pytest.fixture(scopemodule) def shared_resource(): return create_expensive_resource()2. 自动使用通过autouseTrue让fixture自动执行无需显式调用pytest.fixture def db_connection(): return connect_to_database() pytest.fixture def user_repo(db_connection): return UserRepository(db_connection)3. 依赖其他fixturefixture可以依赖其他fixturepytest.fixture def db_connection(): return connect_to_database() pytest.fixture def user_repo(db_connection): return UserRepository(db_connection)3fixture使用案例1)API客户端初始化import pytest import requests pytest.fixture(scopemodule) def api_client(): client requests.Session() client.base_url https://api.example.com client.headers {Authorization: Bearer test_token} yield client # 整个测试模块共享同一个客户端 client.close() # 模块测试完成后关闭 def test_get_user(api_client): response api_client.get(/users/1) assert response.status_code 200 assert response.json()[name] Alice2)Web浏览器实例管理结合Seleniumimport pytest from selenium import webdriver pytest.fixture(scopeclass) def browser(): driver webdriver.Chrome() driver.implicitly_wait(10) yield driver # 整个测试类共享同一个浏览器实例 driver.quit() # 类测试完成后关闭浏览器 class TestWebLogin: def test_login(self, browser): browser.get(https://example.com/login) browser.find_element(#username).send_keys(admin) browser.find_element(#password).send_keys(secret) browser.find_element(#submit).click() assert Dashboard in browser.title4fixture高级技巧1动态fixture参数化pytest.fixture(params[sqlite, mysql, postgres]) def database(request): return create_db_connection(request.param) def test_db_operations(database): assert database.execute(SELECT 1) 12多个fixture组合pytest.fixture def auth_token(): return test_token_123 pytest.fixture def authenticated_client(api_client, auth_token): api_client.headers[Authorization] fBearer {auth_token} return api_client def test_protected_endpoint(authenticated_client): response authenticated_client.get(/protected) assert response.status_code 200