如何在pytest测试用例中向登录登出fixture传递参数?
如何向pytest的login_logout fixture动态传递用户名和密码?
下面提供三种实用的实现方案,可根据你的测试场景选择:
方案一:参数化Fixture(推荐)
通过@pytest.mark.parametrize结合indirect=True,让fixture接收测试用例传递的参数,适合单测试用例需要多组用户数据验证的场景。
修改conftest.py
import pytest from selenium import webdriver def setup_driver(request): # 初始化驱动并绑定到测试类 driver = webdriver.Chrome() request.cls.driver = driver yield # 销毁驱动 driver.quit() @pytest.fixture(scope='function') def login_logout(request, driver): # 从request.param获取测试用例传递的用户名和密码 username, password = request.param # 执行登录逻辑(替换为你的实际登录代码) print(f"使用账号 {username} 登录系统") # 示例登录操作: # driver.find_element(By.ID, "username").send_keys(username) # driver.find_element(By.ID, "password").send_keys(password) # driver.find_element(By.ID, "login-btn").click() yield # 测试用例执行完成后回到此处 # 执行登出逻辑(替换为你的实际登出代码) print("执行登出操作") # 示例登出操作: # driver.find_element(By.ID, "logout-btn").click()
测试用例写法
import pytest @pytest.mark.usefixtures("setup_driver") class TestSmoke: # 传递多组参数,自动生成多个测试实例 @pytest.mark.parametrize("login_logout", [("user1", "pass1"), ("user2", "pass2")], indirect=True) def test_smoke_test1_login(self, login_logout): print("test1 执行中") # 传递单组参数 @pytest.mark.parametrize("login_logout", [("admin", "admin_pass")], indirect=True) def test_smoke_test2_login(self, login_logout): print("test2 执行中")
方案二:测试类属性传递
在测试用例中直接设置类属性,fixture从测试类实例中读取参数,逻辑简单直接。
修改conftest.py
import pytest from selenium import webdriver def setup_driver(request): driver = webdriver.Chrome() request.cls.driver = driver yield driver.quit() @pytest.fixture(scope='function') def login_logout(request, driver): # 从测试类实例获取用户名和密码 username = request.cls.username password = request.cls.password print(f"使用账号 {username} 登录系统") # 登录逻辑... yield # 登出逻辑... print("执行登出操作")
测试用例写法
import pytest @pytest.mark.usefixtures("setup_driver") class TestSmoke: def test_smoke_test1_login(self, login_logout): self.username = "user1" self.password = "pass1" print("test1 执行中") def test_smoke_test2_login(self, login_logout): self.username = "admin" self.password = "admin_pass" print("test2 执行中")
方案三:自定义标记传递
通过自定义pytest标记给测试用例附加用户参数,fixture读取标记信息,可读性强且支持元数据附加。
修改conftest.py
import pytest from selenium import webdriver def setup_driver(request): driver = webdriver.Chrome() request.cls.driver = driver yield driver.quit() @pytest.fixture(scope='function') def login_logout(request, driver): # 获取最接近的login标记 login_marker = request.node.get_closest_marker("login") if login_marker: # 从标记的关键字参数中读取账号密码 username = login_marker.kwargs.get("username") password = login_marker.kwargs.get("password") else: # 可选:设置默认账号 username = "default_user" password = "default_pass" print(f"使用账号 {username} 登录系统") # 登录逻辑... yield # 登出逻辑... print("执行登出操作")
测试用例写法
import pytest @pytest.mark.usefixtures("setup_driver") class TestSmoke: @pytest.mark.login(username="user1", password="pass1") def test_smoke_test1_login(self, login_logout): print("test1 执行中") @pytest.mark.login(username="admin", password="admin_pass") def test_smoke_test2_login(self, login_logout): print("test2 执行中")
内容的提问来源于stack exchange,提问作者Sateeshkumar Varma
相关产品推荐
相关产品推荐

