当前位置: 首页 > news >正文

C++ 方向 Web 自动化测试实战博客系统思路

在软件测试领域,自动化测试凭借其高效、可重复的优势,成为保障项目质量的重要手段。本文将以博客系统为实际案例,从测试用例设计、脚本开发到测试报告补充,完整拆解 C++ 方向 Web 自动化测试的实施流程,为大家提供可落地的实战指南。

1 编写 Web 测试用例:覆盖核心场景

测试用例是自动化测试的基础,需全面覆盖博客系统的关键功能模块与异常场景。本次实战围绕登录、博客列表、博客编辑、博客详情 4 大核心模块,设计了正向与异常场景的测试用例,具体如下:

模块场景类型具体场景预期结果
登录页面正常登录账号 admin / 密码 123、账号 lisi / 密码 123成功跳转至博客列表页
登录页面异常登录账号为空、密码为空、账号错误、密码错误弹窗提示错误信息,不跳转页面
博客列表页登录状态直接访问 / 从菜单进入页面正常打开,显示博客列表(数量>10)
博客列表页未登录状态直接输入链接访问弹窗提示登录,自动跳转至登录页面
博客编辑页登录状态正常填写标题 + 内容提交成功,新增博客显示在列表页
博客编辑页登录状态不写标题 / 标题 + 内容都不写提交失败,提示必填项错误
博客编辑页未登录状态直接访问 / 从登录页进入页面可打开,但无法提交博客
博客详情页登录状态从列表页点击博客进入页面正常打开,显示标题、发布时间、内容
博客详情页未登录状态直接访问链接弹窗提示登录,自动跳转至登录页面

2 自动化测试脚本开发:模块化设计

脚本开发采用 Python+Selenium 框架,遵循 “模块化、可复用” 原则,将驱动管理、页面操作、用例执行拆分到不同文件,降低代码耦合度。

(1)公共工具类:common/Utils.py

负责初始化 Chrome 驱动、截图功能,避免重复代码。核心逻辑如下:

  • 利用webdriver_manager自动安装匹配的 ChromeDriver,无需手动配置环境;
  • 截图按 “日期 + 用例名 + 时间” 命名,保存在../images/目录下,便于问题追溯;
  • 定义全局BlogDriver对象,供所有用例文件调用。
import datetime
import os.path
import sys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManagerclass Driver:driver = ""def __init__(self):options = webdriver.ChromeOptions()# 初始化Chrome驱动self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)# 截图方法:按用例名和时间命名def getScreenShot(self):dirname = datetime.datetime.now().strftime('%Y-%m-%d')if not os.path.exists("../images/" + dirname):os.mkdir("../images/" + dirname)# 获取调用该方法的用例名case_name = sys._getframe().f_back.f_code.co_namefilename = f"{case_name}-{datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S')}.png"self.driver.save_screenshot(f'../images/{dirname}/{filename}')# 全局驱动对象,供其他模块调用
BlogDriver = Driver()
(2)页面操作类:cases 目录下分模块实现

每个页面(登录、列表、详情)对应一个类,封装该页面的元素定位与操作方法,符合 “页面对象模型(POM)” 设计思想。

  • 登录页面:cases/BlogLogin.py
    封装正常登录(loginSucTest)与异常登录(loginFailTest)方法,通过 CSS 选择器定位用户名、密码输入框和提交按钮,用assert断言登录结果。

    import time
    from selenium.webdriver.common.by import By
    from common.Utils import BlogDriverclass BlogLogin:def __init__(self):self.url = "http://192.168.47.135:8653/blog_system/blog_login.html"self.driver = BlogDriver.driverself.driver.get(self.url)# 正常登录测试:admin/123def loginSucTest(self):time.sleep(2)  # 等待页面加载self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()# 断言:登录成功后显示列表页专属元素(左侧头像)self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > img")BlogDriver.getScreenShot()  # 截图留存self.driver.back()  # 返回登录页,供后续用例使用# 异常登录测试:密码错误(admin/111)def loginFailTest(self):self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("111")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()# 断言:提示“用户名或密码错误!”expect = "用户名或密码错误!"actual = self.driver.find_element(By.CSS_SELECTOR, "body").textassert expect == actualBlogDriver.getScreenShot()self.driver.back()
    
  • 博客列表页:cases/BlogList.py
    验证登录状态下列表页的元素显示(如博客数量>10),以及点击博客跳转至详情页的功能。

    from selenium.webdriver.common.by import By
    from common.Utils import BlogDriverclass BlogList:def __init__(self):self.url = "http://192.168.47.135:8653/blog_system/blog_list.html"self.driver = BlogDriver.driverself.driver.get(self.url)# 列表页测试:前提是已登录def ListTest(self):# 断言:显示左侧头像(确认登录状态)self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > img")# 断言:博客数量>10articles = self.driver.find_elements(By.CSS_SELECTOR, "body > div.container > div.right > div")assert len(articles) > 10# 点击第一篇博客,跳转至详情页self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > a").click()# 断言:页面标题为“博客详情页”assert self.driver.title == "博客详情页"BlogDriver.getScreenShot()
    
  • 博客详情页:cases/BlogDetail.py
    验证详情页的核心元素(标题、发布时间、内容)是否正常显示。

    from selenium.webdriver.common.by import By
    from common.Utils import BlogDriverclass BlogDetail:def __init__(self):self.url = "http://192.168.47.135:8653/blog_system/blog_detail.html?blogId=15"self.driver = BlogDriver.driver# 若从列表页跳转,无需重复访问URLif self.driver.title != "博客列表页":self.driver.get(self.url)# 详情页元素校验def DetailCheck(self):BlogDriver.getScreenShot()# 断言:显示标题、发布时间、内容self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > h3")self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.date")self.driver.find_element(By.CSS_SELECTOR, "#content")
    
(3)用例执行入口:cases/RunCases.py

整合所有测试用例,按 “登录→列表→详情” 的流程执行,最后关闭驱动。

from common.Utils import BlogDriver
from tests import BlogLogin, BlogList, BlogDetailif __name__ == "__main__":# 执行登录成功用例BlogLogin.BlogLogin().loginSucTest()# 执行列表页用例BlogList.BlogList().ListTest()# 执行详情页用例BlogDetail.BlogDetail().DetailCheck()# 关闭浏览器BlogDriver.driver.quit()

http://www.dtcms.com/a/355069.html

相关文章:

  • mac系统本地部署Dify步骤梳理
  • 资产与设备管理数字化转型实践:企业降本增效的新引擎
  • 图书管理系统练习项目源码-前后端分离-【Java版】
  • Linux /proc/pid 探索
  • 【全开源】云贝餐饮V3独立版系统 v1.8.7+API接口开发文档+搭建教程
  • 从 Dockerfile 到 Kubernetes:现代化 PHP 应用配置管理进阶指南
  • 打造旅游实训新场景:旅游管理虚拟仿真实训室的运营与教学落地
  • 旅游管理新阵地:虚拟仿真实训室的功能设计与教学应用
  • Python 实现冒泡排序:从原理到代码
  • java去图片水印的方法
  • Redis 连接数爆炸:连接池配置错误踩坑记录
  • Runway Gen-2 深度技术解析:AI视频生成的范式变革
  • Bscan Bonding Chain
  • 使用llamafactory对模型进行微调
  • 软考-系统架构设计师 决策支持系统(DSS)详细讲解
  • 滤波算法作用
  • Redis高性能数据库讲解与实战指南
  • 文件系统挂载详细分析(《图解Linux内核》虚拟文件系统篇笔记三)
  • [机械结构设计-48]:机械工程师的岗位要求
  • ArkUI框架之promptAction弹窗
  • 安卓开发---BLE通信
  • 基于STM32单片机的车牌识别设计
  • clcd土地利用数据分类
  • Tree Shaking原理
  • SOME/IP-SD事件组订阅
  • 昆泰芯离轴应用技术与产业链协同助力机器人关节产业实现技术突破
  • TDengine 数据订阅支持 MQTT 协议用户手册
  • 本地消息表实现分布式事务保证最终一致性
  • Java框架搭建实用开发
  • DPIN亮相DePIN Expo 2025,定义“DePIN 2.0”企业级应用新范式