能否在单元测试中调用另一单元测试?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
相关产品推荐
相关产品推荐

