You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:15:41