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

基于博客系统的自动化测试项目

一、引言

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

二、项目背景

随着互联网内容生态的蓬勃发展,博客作为知识分享和观点交流的重要平台,凭借其便捷的数字化学习优势,正逐渐优化传统的纸质笔记形式。这种高效的知识载体深受用户喜爱。为确保为用户提供稳定、易用且优质的博客体验,必须对博客系统进行全面测试。通过模拟真实用户操作场景,我们将验证系统功能完整性、检验交互逻辑合理性,及时发现并修复潜在问题,从而确保系统能够高效支持创作者完成内容发布、阅读和修改等操作。

三、项目功能

1)初始登录界面

覆盖多种登录身份验证场景,包括用户登录,验证登录流程、错误提示等功能,保障用户身份校验及系统访问权限控制准确。

2)博客首页

信息展示:呈现个人信息(头像、昵称等 )、博客列表(名称、创建时间、内容等 ),同时展示 多维度实用提示及对应跳转(如跳转博客详情、编辑页等 ),满足用户快速浏览内容需求。

登录状态交互:区分登录与未登录状态下的功能可见性与操作权限,如登录后可进行个性化操作,未登录则引导登录,保障系统交互逻辑合理。

3)博客详情页

基础信息呈现:展示博客作者个人信息、博客信息,验证互动功能流程及数据反馈准确性。

关联功能跳转:可跳转至实用提示对应页面,保障页面间交互流畅,提升用户操作连贯性。

4)博客编辑页

内容编辑交互:支持标题、内容输入,发布 / 保存 / 预览等操作逻辑,确保创作者能高效编辑、发布博客内容,辅助创作者修正内容。

状态联动:与首页、详情页状态关联,发布后同步更新展示,保障系统内数据一致性,让用户操作结果实时反馈。

四、测试工具

1)基础操作系统环境

系统版本:Windows 11(64 位操作系统)

环境优势:具备稳定的图形化界面支持,兼容 Chrome、Edge 等主流浏览器及 PyCharm 开发工具,可流畅运行 Selenium 自动化测试脚本,满足本地测试与调试需求。

2)浏览器环境

Google Chrome 浏览器

作用:作为自动化测试核心执行浏览器,配合 Selenium ChromeDriver 驱动,实现页面元素定位、交互操作(如登录、输入、点击发布等)及截图功能,保障测试流程的稳定性与兼容性。

3)开发与测试工具环境

PyCharm(Python 3.7 解释器)

核心功能:作为 Python 开发 IDE,提供代码编辑、语法校验、断点调试、脚本运行等功能,支持集成 Selenium、unittest 等测试库;

解释器配置:采用 Python 3.7 版本,确保与项目依赖的 Selenium 版本(如 3.x/4.x)、webdriver-manager 等库兼容,避免因版本不匹配导致的脚本执行异常。

Xmind

作用:用于梳理测试需求、设计测试用例,通过思维导图形式拆解博客系统功能模块(如登录、首页、编辑页、详情页)的测试点,清晰呈现测试范围与用例逻辑,便于团队对齐测试目标与执行计划。

4)依赖库环境

除上述工具外,需通过 PyCharm 的pip工具安装以下核心依赖库,确保自动化脚本正常运行:

Selenium:自动化测试核心库,提供操作浏览器、定位元素、模拟用户交互的 API;

webdriver-manager:自动管理 ChromeDriver、EdgeDriver 版本,避免手动下载驱动及版本不兼容问题;

datetime、os、sys:Python 内置库,分别用于生成截图时间戳、管理截图文件路径、获取调用方法名,支撑测试结果记录与文件管理功能。

五、测试模块

测试覆盖博客系统 4 个核心页面,每个页面区分 “登录” 与 “未登录” 两种状态,确保功能与权限验证全面性:

测试模块核心测试场景
登录页(blog_login.html)1. 正常登录(用户名 lisi / 密码 123456);
2. 异常登录(账号密码均错、账号错、密码错)
首页(blog_list.html)1. 登录状态:验证博客信息(标题、内容、按钮)与个人信息(昵称、头像)加载;
2. 未登录状态:验证跳转登录页逻辑
详情页(blog_detail.html)1. 登录状态:验证博客标题、时间、内容加载及 “编辑 / 删除” 按钮功能;
2. 未登录状态:验证权限拦截与登录跳转
编辑页(blog_edit.html)1. 登录状态:正常发布(输入标题 “Jmeter 测试”)、异常发布(无标题);
2. 未登录状态:验证发布拦截与登录跳转

六、项目实践

1)设计自动化测试用例

测试用例设计围绕系统功能分层展开,已梳理成思维导图。覆盖登录界面、首页信息展示、详情页交互、编辑页内容发布等核心功能,测试执行将严格对照导图拆解的子场景验证。

2)编写项目测试脚本

根据测试用例,搭建自动化测试框架并编写相应的测试脚本。

1. 测试脚本分布

为了简化测试流程,我们可以将浏览器配置参数提取到配置文件中。通过读取配置文件,测试脚本能够快速获取所需的浏览器对象和URL参数,从而避免重复配置。这种方法不仅提高了测试效率,还使测试代码更加简洁易维护。

关于相册功能的注意事项:

在自动化截图过程中,系统弹窗是由浏览器内核/操作系统直接渲染生成的,不属于页面DOM元素。由于屏幕截图功能仅能捕获页面DOM元素,因此在项目测试时无法截取到这些弹窗内容。在执行测试时,如果必须截图,则需要手动设置程序强制等待截图。

执行入口,按 “登录测试→首页测试→详情页测试→编辑页测试” 顺序执行,确保测试流程连贯,最终关闭浏览器释放资源。

2. 配置文件(pz.py)

import datetime
import os.path
import sysfrom selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager#创建一个浏览器对象
class Driver:driver = ""def __init__(self):options = webdriver.ChromeOptions()self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)self.driver.implicitly_wait(2)# 创建屏幕截图def getScreeShot(self):# 图片文件名称2025-08-29-XXXXXX.png# 图片路径./ceshitupian/2025-08-29/2025-08-29-XXXXXX.png# 文件夹名称dirname = datetime.datetime.now().strftime("%Y-%m-%d")# 判断dirname文件夹是否已经存在# 不存在则创建文件夹if not os.path.exists("../ceshitupian/" + dirname):os.mkdir("../ceshitupian/" + dirname)# 设置图片文件名称2025-08-29-XXXXXX.png#sys._getframe().f_back.f_code.co_name 用来获取调用的方法名字filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S") + ".png"self.driver.save_screenshot("../ceshitupian/" + dirname + "/" + filename)BlongDriver = Driver()

3. 登录页测试(dl.py)

import time
from selenium.webdriver.common.by import By
from common.pz import BlongDriver#登录界面
class BlongLogin:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_login.html"self.driver = BlongDriver.driverself.driver.get(self.url)#成功登录def LoginSucTest(self):self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("lisi")self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()#添加截图BlongDriver.getScreeShot()#登录成功后有个人信息显示#以昵称为例子检测#显示昵称则成功登录#self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")#通过页面差异检验ret = self.driver.find_elements(By.CSS_SELECTOR, "body > div.nav > a:nth-child(6)")# 遍历元素for i in ret:print("页面右上角信息显示(有注销则登录成功,无则没有登录):""",i.text)time.sleep(1)#返回登录页面,测试登录失败情况#self.driver.back()#time.sleep(1)#异常登录def LoginFailTest(self):#多次输入send_keys会造成关键词输入的拼接#所以先clear删除再输入#都错误的测试self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()time.sleep(1)self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("lis")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(2)alert = self.driver.switch_to.alert# 验证登录错误原因print("弹窗内容(账号密码都错误):", alert.text)alert.accept()time.sleep(2)#账号错误测试self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()time.sleep(1)self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("lis")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(2)alert = self.driver.switch_to.alert# 验证登录错误原因print("弹窗内容(账号错误,密码正确):", alert.text)alert.accept()time.sleep(2)#密码错误测试self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()time.sleep(1)self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("lisi")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(2)alert = self.driver.switch_to.alerttime.sleep(2)# 验证登录错误原因print("弹窗内容(账号正确,密码错误):", alert.text)alert.accept()time.sleep(2)#self.driver.quit()#login = BlongLogin()
#login.LoginSucTest()
#login.LoginFailTest()

4. 首页测试(sy.py)

import time
from selenium.webdriver.common.by import By
from common.pz import BlongDriver#博客首页
class BlongList:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_list.html"self.driver = BlongDriver.driverself.driver.get(self.url)#测试首页(登录情况下)def ListTestByLogin(self):#博客信息#测试博客标题是否存在self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title")#测试博客内容是否存在self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.desc")#测试按钮是否存在self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a")#个人信息是否存在(昵称、文章、分类……)#昵称是否存在self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")#头像是否存在self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > img")#输出信息确认测试完成#输出博客标题ret = self.driver.find_elements(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > div.title")# 遍历元素for i in ret:print("首页博客标题:", i.text)print("首页登录状态测试完成")#添加屏幕截图BlongDriver.getScreeShot()#测试首页(未登录情况下)def ListTestFail(self):#先注销在访问self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(6)").click()#再次访问ret = self.driver.find_elements(By.CSS_SELECTOR, "body > div.nav > a:nth-child(6)")# 判断逻辑if ret:logout_text = ret[0].text.strip()print(f"页面右上角信息显示:{logout_text} → {'登录成功' if logout_text == '注销' else '登录状态异常'}")else:print("页面右上角未找到“注销”元素 → 未登录")print("首页没有登录状态测试完成")

5. 详情页测试(xq.py)

from selenium.webdriver.common.by import By
from common.pz import BlongDriver#测试博客详情页
class BlongDeail:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_detail.html?blogId=158477"self.driver = BlongDriver.driverself.driver.get(self.url)#登陆状态下博客详情页def DetailTestByLogin(self):#检查标题self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.title")#检查时间self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.date")#检查内容self.driver.find_element(By.CSS_SELECTOR,"#detail > p")# 输出信息确认测试完成# 输出博客内容ret = self.driver.find_elements(By.CSS_SELECTOR,"#detail > p")# 遍历元素for i in ret:print("博客详情页内容:", i.text)print("博客详情页登录状态测试完成")#屏幕截图BlongDriver.getScreeShot()#详情页测试(未登录情况下)def DetailFail(self):#先注销在访问self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(6)").click()#再次访问ret = self.driver.find_elements(By.CSS_SELECTOR, "body > div.nav > a:nth-child(6)")# 判断逻辑if ret:logout_text = ret[0].text.strip()print(f"页面右上角信息显示:{logout_text} → {'登录成功' if logout_text == '注销' else '登录状态异常'}")else:print("页面右上角未找到“注销”元素 → 未登录")print("博客详情页没有登录状态测试完成,跳转至首页,需要重新登录")

6. 编辑页测试(bj.py)

import time
from selenium.webdriver.common.by import By
from common.pz import BlongDriver
#测试博客编辑页面
class BlongEdit:url = ""driver = ""def __init__(self):self.url = "hhttp://8.137.19.140:9090/blog_edit.html"self.driver = BlongDriver.driverself.driver.get(self.url)#正确发布博客(登陆状态下)def EditSucTestByLogin(self):time.sleep(1)#点击写博客,开始编辑博客self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)").click()time.sleep(2)self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("Jmeter测试")#菜单栏无法元素无法定位#博客系统编辑区域默认情况下就不为空,可以暂不处理#菜单栏元素#self.driver.find_element(By.CSS_SELECTOR,"# editor > div.editormd-toolbar > div > ul > li:nth-child(21)").click()#直接点击发布按钮来发布博客self.driver.find_element(By.CSS_SELECTOR,"#submit").click()#点击完成之后出现页面的跳转,页面跳转需要加载时间time.sleep(3)actual=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title").textprint("编辑博客测试标题:"+actual)assert actual == "Jmeter测试"#屏幕截图BlongDriver.getScreeShot()print("博客编辑页登录状态,正常发布博客测试完成")def EditTestNo(self):time.sleep(1)#点击写博客,开始编辑博客self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)").click()time.sleep(1)#不编辑,直接点击发布按钮来发布博客self.driver.find_element(By.CSS_SELECTOR,"#submit").click()time.sleep(2)#出现弹窗alert = self.driver.switch_to.alert# 退出弹窗alert.accept()time.sleep(1)# 通过页面差异检验ret = self.driver.find_elements(By.CSS_SELECTOR, "#submit")# 遍历元素for i in ret:print("需要重新输入标题后,再发布文章")time.sleep(1)# 屏幕截图BlongDriver.getScreeShot()print("博客编辑页登录状态,异常发布博客测试完成")#博客编辑页测试(未登录情况下)def EditFail(self):time.sleep(1)#先注销在访问self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(6)").click()time.sleep(2)# 点击写博客,开始编辑博客self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(5)").click()time.sleep(2)self.driver.find_element(By.CSS_SELECTOR, "#title").send_keys("未登录Jmeter测试")self.driver.find_element(By.CSS_SELECTOR,"#submit").click()#再次访问ret = self.driver.find_elements(By.CSS_SELECTOR, "body > div.nav > a:nth-child(6)")# 判断逻辑if ret:logout_text = ret[0].text.strip()print(f"页面右上角信息显示:{logout_text} → {'登录成功' if logout_text == '注销' else '登录状态异常'}")else:print("页面右上角未找到“注销”元素 → 未登录")print("编辑博客页没有登录状态测试完成,跳转至首页,需要重新登录")

7. 运行文件(run.py)

from test import dl
from test import sy
from test import xq
from test import bj
from common.pz import BlongDriverif __name__ == "__main__":dl.BlongLogin().LoginFailTest()dl.BlongLogin().LoginSucTest()# 登陆成功之后就可以调用博客首页测试首页的用例(登陆状态)sy.BlongList().ListTestByLogin()# 注销后测试首页(未登录状态)sy.BlongList().ListTestFail()# 测试登录状态下的博客详情页dl.BlongLogin().LoginSucTest()xq.BlongDeail().DetailTestByLogin()# 测试没有登录状态下的博客详情页xq.BlongDeail().DetailFail()# 测试登录状态下正常发布的博客编辑页面dl.BlongLogin().LoginSucTest()bj.BlongEdit().EditSucTestByLogin()# 测试登录状态下错误发布的博客编辑页面bj.BlongEdit().EditTestNo()# 测试没有登录状态下的博客编辑页面bj.BlongEdit().EditFail()#指定浏览器的退出BlongDriver.driver.quit()

3)执行测试

1. 登录测试

测试程序运行结果:

登录成功场景测试结果

输入正确用户名 "lisi" 和密码 "123456" 后点击登录按钮。

系统跳转至登录后页面,通过定位页面右上角元素“注销”进行验证。

控制台输出该元素文本内容,若显示 "注销" 相关信息,则表明登录成功,输出见运行结果。

通过 back () 方法返回登录页面,准备执行登录失败测试。

登录失败场景测试结果

在输入错误信息前,都清空输入框内容。

账号密码均错误:输入 "lis" 和 "12345" 点击登录,系统弹出提示弹窗,控制台输出弹窗文本内容,点击 "确定" 关闭弹窗

账号错误、密码正确:输入 "lis" 和 "123456" 点击登录,系统弹出提示弹窗,控制台输出弹窗文本内容,点击 "确定" 关闭弹窗

账号正确、密码错误:输入 "lisi" 和 "12345" 点击登录,系统弹出提示弹窗,控制台输出弹窗文本内容,点击 "确定" 关闭弹窗

以上错误测试中,在关闭弹窗后均返回登录界面,所有场景测试完成后,关闭浏览器驱动。

2. 首页测试

登录状态测试运行结果:

首页信息截屏:

登录状态下,首页博客信息(标题、内容、按钮)与个人信息(昵称、头像)均完整加载,文本输出与截图功能正常。

注销后未登录状态,测试运行结果:

未登录状态下,访问首页时,直接跳转至登录界面。

3. 详情页测试

测试运行结果(登录及未登录):

登录状态下博客详情页信息:

未登录状态下,访问博客详情时,通过“注销按钮”是否存在观测,页面将直接跳转至登录界面。

4. 编辑页测试

测试运行结果:

登录状态下可正常发布博客,标题显示正确。

登录状态下标题为空时系统会拦截发布并提示。

点击后,继续返回编辑页。

未登录状态下无法发布博客,权限控制有效。

点击发布文章后,跳转至登录页:

5. 部分自动化截图展示

七、项目亮点与优化点

1)项目亮点

自动化效率提升

脚本可重复执行,避免手动测试的重复性操作,单轮测试执行时间缩短至 5 分钟内。

结果可视化

截图按 “日期 + 方法名” 分类存储,控制台输出详细日志(如弹窗内容、博客标题),问题可追溯。

兼容性保障

通过 webdriver-manager 自动管理驱动版本,兼容不同 Chrome 版本,降低环境配置成本。

权限控制全面

覆盖 “登录 / 未登录” 两种状态,确保未授权操作被合理拦截,符合系统安全设计。

2)待优化点

等待机制

当前使用time.sleep()固定等待,若页面加载延迟易导致元素定位失败,后续可替换为显式等待(WebDriverWait),提升脚本稳定性;

异常场景扩展

未覆盖 “网络中断”“页面超时” 等异常场景,可增加异常处理逻辑,提升测试健壮性。

八、项目结论

本项目通过自动化测试完整验证了博客系统的核心功能,所有测试用例执行通过,系统在 “功能完整性”“权限控制”“交互逻辑” 上均符合预期:

  1. 登录页能准确校验账号密码,异常提示清晰。
  2. 首页、详情页在登录状态下加载完整信息,未登录状态跳转登录页,权限控制合理。
  3. 编辑页支持正常发布与异常拦截,发布后数据同步至首页,数据一致性良好。
  4. 脚本框架模块化程度高,可复用性强,截图记录便于后续维护与问题排查。
http://www.dtcms.com/a/356209.html

相关文章:

  • 使用TensorFlow Lite Mirco 跑mirco_speech语音识别yes/no
  • DVWA靶场通关笔记-命令执行(Impossible级别)
  • 大数据毕业设计选题推荐:基于北京市医保药品数据分析系统,Hadoop+Spark技术详解
  • 多线程网络数据接收与处理框架设计
  • 软考-系统架构设计师 专家系统(ES)详细讲解
  • 【深度学习计算机视觉】02:微调
  • SpringBoot整合Spring WebFlux弃用自带的logback,使用log4j2,并启动异步日志处理
  • Cesium 入门教程(十二):时间动画实例
  • undefined和null
  • MySQL數據庫開發教學(三) 子查詢、基礎SQL注入
  • Maven安装、IDEA集成Maven、依赖管理、单元测试
  • 《开发避坑指南:从异常中读懂系统的“求救信号”》
  • 自动化Reddit 效率已ready
  • 使用 Dify 和 LangBot 搭建飞书通信机器人
  • Webrtc支持FFMPEG硬解码之Intel
  • 2025五天申请邓白氏编码成功
  • Python 轻量级 HTML 解析器 - lxml入门教程
  • Java研学-SpringCloud(十)
  • Android14 init.qcom.usb.rc详解
  • 设计模式之状态机模式
  • hive udf函数实现在sql查询网站价格
  • Vue3 中的 v-model 语法糖
  • (Nginx)基于Nginx+PHP 驱动 Web 应用(上):配置文件与虚拟主机篇
  • 基于SQL大型数据库的智能问答系统优化
  • 安卓开发---SimpleAdapter
  • 不同卷积不同的滤波效果
  • 如何将OFD文件转换为PDF?总结在线OFD转PDF方法
  • QT5.14.2、CMake 扩展openCV
  • GPT-5原理
  • 第二章 Vue + Three.js 实现鼠标拖拽旋转 3D 立方体交互实践