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

能否在单元测试中调用另一单元测试?Python+Selenium测试代码复用问题

Python+Selenium登录测试代码复用方案

以下是3种可直接落地的代码复用方案,完全避免复制粘贴原有登录逻辑:


1. 抽离公共登录工具函数

把现有有效登录的核心操作(元素定位、输入、点击登录按钮)封装为可传参的通用函数,新增参数控制是否勾选「记住我」,所有登录相关测试直接调用即可。
示例代码:

from selenium.webdriver.common.by import By

def common_login(driver, username: str, password: str, remember_me: bool = False):
    # 以下为你原有有效登录测试的逻辑,直接迁移过来即可
    driver.find_element(By.ID, "username_input").send_keys(username)
    driver.find_element(By.ID, "password_input").send_keys(password)
    # 新增记住我勾选逻辑
    if remember_me:
        driver.find_element(By.ID, "remember_me_checkbox").click()
    driver.find_element(By.ID, "login_submit_btn").click()

调用方式:

  • 有效登录测试调用:common_login(driver, "合法账号", "合法密码", remember_me=False)
  • 记住我测试调用:common_login(driver, "合法账号", "合法密码", remember_me=True)

2. 基础测试类继承(适配unittest框架)

把通用的driver初始化、登录逻辑都放到父类,两类测试用例直接继承父类复用逻辑:

import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By

# 公共父类
class BaseLoginTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.test_username = "合法测试账号"
        self.test_password = "合法测试密码"
        self.login_page_url = "你的登录页地址"

    def base_login(self, remember_me: bool = False):
        self.driver.get(self.login_page_url)
        self.driver.find_element(By.ID, "username_input").send_keys(self.test_username)
        self.driver.find_element(By.ID, "password_input").send_keys(self.test_password)
        if remember_me:
            self.driver.find_element(By.ID, "remember_me_checkbox").click()
        self.driver.find_element(By.ID, "login_submit_btn").click()

# 原有有效登录测试子类
class TestValidLogin(BaseLoginTest):
    def test_valid_login_success(self):
        self.base_login(remember_me=False)
        # 原有有效登录的断言逻辑,比如验证跳转至个人中心
        self.assertIsNotNone(self.driver.find_element(By.ID, "user_center_entry"))

# 新增记住我测试子类
class TestRememberMe(BaseLoginTest):
    def test_remember_me_auto_login(self):
        # 直接调用父类登录方法,传记住我参数
        self.base_login(remember_me=True)
        # 关闭浏览器模拟下次访问
        self.driver.quit()
        self.driver = webdriver.Chrome()
        self.driver.get(self.login_page_url)
        # 断言用户名自动填充/直接处于登录态即可
        self.assertEqual(self.driver.find_element(By.ID, "username_input").get_attribute("value"), self.test_username)

3. Pytest Fixture封装(适配pytest框架)

把登录逻辑做成可传参的fixture,测试用例直接注入即可复用:

import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By

@pytest.fixture(scope="function")
def driver():
    driver = webdriver.Chrome()
    yield driver
    driver.quit()

@pytest.fixture(scope="function")
def login_action(driver):
    def _login(remember_me: bool = False):
        driver.get("你的登录页地址")
        driver.find_element(By.ID, "username_input").send_keys("合法测试账号")
        driver.find_element(By.ID, "password_input").send_keys("合法测试密码")
        if remember_me:
            driver.find_element(By.ID, "remember_me_checkbox").click()
        driver.find_element(By.ID, "login_submit_btn").click()
    return _login

# 原有有效登录测试
def test_valid_login(login_action):
    login_action(remember_me=False)
    # 原有断言逻辑

# 新增记住我测试
def test_remember_me(login_action, driver):
    login_action(remember_me=True)
    # 后续验证逻辑

以上方案后续如果登录页元素发生变更,只需要修改一处公共逻辑即可,不需要逐个调整测试用例。

内容的提问来源于stack exchange,提问作者Ashton Becher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 04:15:03