自动化测试入门实战:从零搭建Python+Selenium测试框架

3次阅读
没有评论

共计 3041 个字符,预计需要花费 8 分钟才能阅读完成。

image.webp

为什么需要自动化测试

最近参与了一个电商项目,每次发版前都要手动测试核心路径:登录→搜索商品→加入购物车→结算。某次紧急上线时,测试组连夜执行了 200 多次重复操作,结果还是漏掉了优惠券叠加计算的边界条件。这种重复劳动不仅效率低,更重要的是难以保证测试覆盖率。自动化测试正是为了解决这些问题而生。

自动化测试入门实战:从零搭建 Python+Selenium 测试框架

主流 Web 测试工具选型

  1. Selenium:老牌框架,支持所有主流浏览器,生态成熟但需要自行封装基础功能
  2. Cypress:开箱即用的现代方案,调试体验好但不支持多标签页测试
  3. Playwright:微软出品,支持移动端仿真和视频录制,适合复杂场景

对于初学者,建议从 Selenium 起步,因为:
– 学习资料丰富
– 可自由组合测试框架 (pytest/unittest)
– 企业使用率最高

环境准备

先安装必要组件(建议使用 Python 3.8+):

pip install selenium pytest allure-pytest

下载对应浏览器的 WebDriver(以 Chrome 为例):
1. 访问 ChromeDriver 官网
2. 下载与本地 Chrome 版本匹配的驱动
3. 将 exe 文件放在项目根目录

基础框架搭建

创建项目结构:

project/
├── pages/         # Page Object 类
├── tests/         # 测试用例
├── utils/         # 工具类
├── conftest.py    # pytest 配置
└── requirements.txt

第一个测试用例示例(tests/test_login.py):

import allure
import pytest
from pages.login_page import LoginPage

@allure.story("用户认证模块")
class TestLogin:

    @allure.title("验证成功登录场景")
    def test_valid_login(self, browser):
        """测试使用正确凭证登录"""
        login_page = LoginPage(browser)
        home_page = login_page.login("standard_user", "secret_sauce")
        assert home_page.get_title() == "Products"

    @allure.title("验证失败登录场景")
    def test_invalid_login(self, browser):
        """测试使用错误凭证登录"""
        login_page = LoginPage(browser)
        login_page.login("locked_user", "wrong_pass")
        assert "Epic sadface" in login_page.get_error_message()

Page Object 模式实现

UML 类图关系:

BasePage ◄── LoginPage
BasePage ◄── HomePage

基础页面类(pages/base_page.py):

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class BasePage:
    def __init__(self, driver):
        self.driver = driver
        self.wait = WebDriverWait(driver, 10)

    def find(self, locator):
        return self.wait.until(EC.presence_of_element_located(locator))

    def click(self, locator):
        self.wait.until(EC.element_to_be_clickable(locator)).click()

登录页面类(pages/login_page.py):

from .base_page import BasePage

class LoginPage(BasePage):
    # 元素定位器(推荐使用 CSS 选择器)USERNAME = ("css", "#user-name")
    PASSWORD = ("css", "#password")
    LOGIN_BTN = ("css", ".btn_action")
    ERROR_MSG = ("css", "[data-test='error']")

    def login(self, username, password):
        self.find(self.USERNAME).send_keys(username)
        self.find(self.PASSWORD).send_keys(password)
        self.click(self.LOGIN_BTN)
        return HomePage(self.driver)  # 返回下一页对象

    def get_error_message(self):
        return self.find(self.ERROR_MSG).text

智能等待策略

不要使用固定 sleep!推荐两种等待方式:

  1. 显式等待(示例见 BasePage 类)
  2. 自定义等待条件(utils/wait_conditions.py):
def element_has_class(locator, class_name):
    """自定义等待条件:元素包含指定 class"""
    def predicate(driver):
        element = driver.find_element(*locator)
        return class_name in element.get_attribute("class")
    return predicate

Jenkins 集成要点

  1. 安装必要插件:
  2. Allure Jenkins Plugin
  3. Git Plugin

  4. 创建 Freestyle 项目配置:

# Build Steps
python -m pytest tests/ --alluredir=./allure-results

# Post-build
Allure Report > Path: allure-results
  1. 设置定时构建(可选):
    H */12 * * *   # 每 12 小时运行一次 

常见坑点解决方案

  1. 动态元素处理
  2. 使用部分属性匹配:[class^='dynamic-']
  3. 通过父元素定位:.parent > .child

  4. iframe 切换

    # 进入 iframe
    driver.switch_to.frame("frame_name")
    
    # 返回主文档
    driver.switch_to.default_content()

  5. 文件下载

    # Chrome 配置示例
    options = webdriver.ChromeOptions()
    prefs = {
        "download.default_directory": "/path/to/downloads",
        "download.prompt_for_download": False
    }
    options.add_experimental_option("prefs", prefs)

延伸学习建议

掌握 Web 自动化后可以继续学习:

  1. API 测试
  2. Requests 库 + Pytest
  3. 契约测试(Pact)

  4. 性能测试

  5. Locust 分布式压测
  6. JMeter 场景设计

  7. 移动端测试

  8. Appium 跨平台方案
  9. ADB 命令实战

建议每天实践 1 小时,两个月内就能达到企业初级自动化测试工程师的水平。记住:自动化测试不是替代手工测试,而是让测试工程师从重复劳动中解放出来,更专注于探索性测试和质量体系建设。

正文完
 0
评论(没有评论)