博客系统测试报告
1.项目背景
个人博客是人们在网络上展现自己个性的一种方式。自从互联网走进千家万户,大受人们喜爱。大家都喜欢通过网络来获取各种各样的信息。而在网络上,你也可以畅所欲言,而个人博客也是其中一种。在个人博客上,你可以发表自己的心路旅程,发表自己的工作经验,发表技术博客等等。
首先介绍一下什么是博客,它也被称为网络日志。博客其实就是一个网页,它是由各种各样的帖子组成。这些帖子可以是你某一天观看电影的感慨,也可以是阅读到某篇书籍的读后感,更可以是你在自己技术领域的心得。它就是一个网页,但是大家可以在上面用文字或者图片分享自己的心情等,它提供的内容可以用来进行交流。
博客最开始的时候是论坛下的一个子系统。最早参与博客的都是一些信息技术的一些专家和学者,讨论的都是专业技能。直到发现了博客的商业价值,一些开放了自发式的博客,大家也都发现了博客分享和讨论的趣味。越来越多的人参与进来,博客也越来越风靡盛行。基于SSM框架实现的个人博客系统,由四个页面构成:用户登录页、博客编辑发布页、博客列表页以及博客详情页。登录即可查看自己与其他用户已发布的博客,也可以使用自己的账号发布博客,通过使用Selenium定位web元素、对获取到的元素进行操作等,对个人博客系统进行测试,测试的核心内容包括用户登录、博客列表、用户信息、博客数量、查看全文、详情页内容、写博客、删除博客、编辑发布博客、退出账号等。该博客系统可以实现发布个人博客,记录博客发布日期、时间、标题、博客发布者等信息。
1.1测试目标及测试任务概况
设计测试用例一般需要包含:页面测试,功能测试,性能测试,兼容性测试,安全性测试,易用性测试6大方面。但是本博客系统是一个Web网站,主要针对核心功能来进行测试,此博客系统的测试功能点以脑图的形式展示如下:

2.测试内容
2.1编写测试用例
1.用户登录功能测试
(1)介绍:用户名以及密码已经在后端写入了数据库是已经存在的,登录成功后就会跳转到列表页面;执行用户注销操作后,也会回到登录页面。
(2)测试用例展示

当账号密码输入正确时(以账号:zhangsan;密码:123456为例),可正常跳转博客页面.

当账号密码输入出错误时(以账号:zhangsan;密码:12345为例),博客页面出现报错弹窗.

2.博客首页功能测试
(1)介绍:博客列表页可以查看当前博客发布数量、当前用户的头像、用户名、查看已发布博客的有限博客信息(包括标题、时间、相关内容)等信息。
(2)测试用例展示:

a)列表页展示
前置条件:用户已登录
预期结果:列表页显示用户发布的博客简介(标题、发布时间、内容简介),并在左侧正确显示用户发布的博客文章数量以及分类数
实际结果:
正常显示用户发布的博客简介

3.博客详情页
(1)介绍:选择任意一篇博客,点击”查看全文“按钮,即可进入博客详情页,此时可以看到该篇博客的所有内容。如果所查看的文章所是当前用户发布的即可进行"编辑"和"删除"操作,如果所查看的文章是其他用户所发布的,则对文章的权限是"只读"。
(2)测试用例展示:

实际结果:

4.博客编辑功能测试
(1)介绍:在页面右上角点击”写博客“,即可进入博客编辑页面,此时可以进行新博客的写入操作。
(2)测试用例展示:

a)输入正确合法的文章标题以及内容,并且点击发布按钮
前置条件:用户已登录
预期结果:发布成功,自动跳转到博客列表,可以在博客列表中查看到新发布的文章
实际结果:

b)文章标题或者文章内容为空
前置条件:用户已登录
预期结果:发布失败,并且有弹窗提示

2.2使用Selenium进行Web自动化测试(Python)
2.2.1 安装WebDriverManager驱动管理程序和selenium 类库
WebDriverManager是一个用于管理Web驱动程序的工具,主要用于自动化测试领域。在进行 Selenium 测试时,需要一个与浏览器相匹配的 Web 驱动程序,以便控制和操作浏览器。
WebDriverManager能够自动下载和管理浏览器驱动程序,会自动检测本地系统中安装的浏览器,并下载对应的浏览器驱动程序(如ChromeDriver、FirefoxDriver等)。这避免了手动下载和配置驱动程序的繁琐过程,提高了自动化测试的效率和稳定性,以便在自动化测试中使用这些浏览器。
2.2.2在项目中安装selenium和webdriver-manager两个包
在python解释器中选择webdriver-manager和selenium(注意版本)下载

2.2.2依照测试用例,编写自动化测试脚本
1.创建浏览器对象
创建浏览器对象,请求访问URL对应的页面,成功进入对应页面之后才可以进行后续一系列的测试操作。而浏览器对象是多个功能测试用例都会调用到的,频繁的创建调用会消耗性能,所以单独创建一个文件,存放创建浏览器对象和其他频繁调用的功能代码,以及其他必要的配置代码内容。
此次我创建了一个包common,将文件utils放在其中,utils文件中创建了一个Driver类,定义了一个构造函数(用来初始化浏览器对象,方便后面的复用)与一个创建屏幕截图函数(方便后面自动化测试时截图观察情况)。

2.博客"登录"功能自动化测试
①创建登录自动化测试脚本文件(此项目以"BlogLogin.py"为例)
②导入utils文件以及其他必要的依赖项
③创建登录测试类(此项目以"BlogLogin"为例)
④分别编写构造函数,登录成功(正确账号正确密码),登录失败(账号密码为空)
注意项:在向输入框中输入信息时要先清空输入框内容,否则效果相当于追加写;在登录失败时会跳出弹窗,此时注意要先点击弹窗否则无法继续后续测试操作
import time
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class BlogLogin:
def __init__(self):
self.url= "http://8.137.19.140:9090/blog_login.html"
self.driver=BlogDriver.driver
self.driver.get(self.url)
#成功登陆的测试用例
def LoginSucTest(self):
self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
time.sleep(2)
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
# 添加屏幕截图
BlogDriver.getScreeShot()
# 重新加载登录页面
self.driver.get(self.url)
#异常登录的测试用例
def LoginFailTest(self):
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
WebDriverWait(self.driver, 5).until(EC.alert_is_present())
alert = self.driver.switch_to.alert
alert.accept()
login=BlogLogin()
# login.LoginSucTest()
login.LoginFailTest()
3."博客首页"功能自动化测试
①创建博客列表自动化脚本文件(此项目以"BlogList.py"为例)
②导入utils文件以及其他必要的依赖项
③创建博客列表测试类(此项目以"BlogList"为例)
④编写构造函数,博客列表函数
⑤博客列表函数中需要查找个人信息(头像元素,昵称元素,文章按钮元素,分类按钮元素),
博客列表信息(博客标题,博客发布时间,博客内容)
前置条件:用户已登录
注意事项:如果用户还未发布过博客文章,是查找不到博客列表展示信息的
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
#博客首页测试用例
class BlogList:
url = ""
driver = ""
def __init__(self):
self.url="http://8.137.19.140:9090/blog_list.html"
self.driver = BlogDriver.driver
self.driver.get(self.url)
#测试首页(登录情况下)
def LiseTestByLogin(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")
#添加屏幕截图
BlogDriver.getScreeShot()
4."博客详情页"功能自动化测试
①创建博客详情页自动化脚本文件(此项目以"BlogDetail.py"为例)
②导入utils文件以及其他必要的依赖项
③创建博客详情页测试类(此项目以"BlogDetail"为例)
④编写构造函数,博客详情页函数(点击本用户发布的博客),博客详情页函数(其他用户发布的博客)
⑤本用户发布的博客详情页需要有博客标题,发布时间,发布内容,编辑按钮,删除按钮
⑥其他用户发布的博客详情页只有博客标题,发布时间与发布内容
前置条件:博客列表页需要有本用户发布的博客文章,与其他用户发布的博客文章
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
#测试博客详情页
class BlogDetail:
url = ""
driver = ""
def __init__(self):
self.url="http://8.137.19.140:9090/blog_detail.html?blogId=44697"
self.driver=BlogDriver.driver
self.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")
#屏幕截图
BlogDriver.getScreeShot()
5."博客编辑与发布"功能自动化测试
①创建博客编辑于发布自动化脚本(此项目以"BlogEdit.py"为例)
②导入utils文件以及其他必要的依赖项
③创建博客编辑与发布测试类(此项目以"BlogEdit"为例)
④编写构造函数,登录状态下编辑发布博客函数,未登录状态下编辑发布博客函数
⑤未登录状态下发布博客应自动跳转回博客登录首页
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
#测试博客编辑页面
class BlogEdit():
url = ""
driver = ""
def __init__(self):
self.url = "http://8.137.19.140:9090/blog_edit.html"
self.driver = BlogDriver.driver
self.driver.get(self.url)
#测试编辑页面(登录状态下)
def EditSucTestByLogin(self):
self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("自动化测试创建")
#直接点击发布按钮来发布博客
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
actual=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(43) > div.title").text
assert actual == "自动化测试创建"
6.最后在RunTest.py文件中整体测试一遍,确定自动化脚本无误
from tests import BlogLogin
from tests import BlogList
from common.Utils import BlogDriver
from tests import BlogDetail
from tests import BlogEdit
if __name__ == "__main__":
BlogLogin.BlogLogin().LoginFailTest()
BlogLogin.BlogLogin().LoginSucTest()
#登录成功后就可以调用博客首页测试用例
BlogList.BlogList().LiseTestByLogin()
BlogDetail.BlogDetail().DetailTestByLogin()
BlogEdit.BlogEdit().EditSucTestByLogin()
#指定浏览器退出
BlogDriver.driver.quit()
2.2.3自动化测试的亮点与特点
特点:
在此框架下,自动化测试的设计紧密围绕个人项目的特定需求展开,测试用例经过精心策划,随后利用Selenium这一强大的自动化测试工具,将功能点与测试步骤清晰地转化为自动化脚本。相较于手动测试,自动化测试能够执行更多轮次、更密集的检测,显著提升测试效率。
自动化测试的引入,将繁琐的重复性测试工作交由机器处理,解放了测试人员的时间和精力,使他们能够专注于构思更多、更优质的测试用例,进而提升测试的精确度和测试团队的整体积极性。此外,自动化测试以其固有的一致性和可重复性,确保了测试结果的客观性和公正性,极大地增强了软件产品的可信度。
亮点:
驱动复用,性能优化:
自动化测试框架仅需一次性创建测试驱动,避免了在每个测试用例中重复创建驱动所带来的性能损耗,从而提升了测试执行的整体效率。
函数化测试用例,提升可读性:
每个测试用例都被封装为一个独立的函数,测试功能点一目了然,代码结构清晰,显著增强了代码的可读性和可维护性。
隐式等待,应对页面渲染延迟:
针对页面渲染速度滞后于程序执行速度的问题,自动化测试框架内置了隐式等待机制,有效避免了因页面元素尚未加载完成而导致的测试失败,进一步提升了自动化测试的效率和稳定性。
通过整合这些特点与亮点,自动化测试不仅优化了测试流程,还显著提升了软件产品的质量和用户的信任度。
3.web自动化总结与反思
3.1常见bug及解决方法
1. 元素定位失败

原因:
元素未加载完成(页面未完全加载或异步内容未渲染)。
元素被隐藏或位于<iframe>中。
定位方式错误(如动态ID、XPath/CSS选择器错误)。
解决方法:显式等待:使用WebDriverWait等待元素出现
2. 浏览器驱动问题

原因:
未下载浏览器驱动(如ChromeDriver)。驱动版本与浏览器版本不匹配。驱动路径未正确配置。
解决方法:
使用webdriver-manager自动管理驱动
3. 超时错误

原因:
页面加载时间过长或网络延迟,异步请求未完成。
解决方法
调整隐式/显式等待时间:
4.性能测试
一、用 Apifox怎么测
1. 建一个测试集合
新建一个项目文件夹,专门放这次性能测试的请求。
2. 给每个页面配一个请求
需要测试的页面有:登录页、首页、列表页、编辑页。每个页面单独设置一个请求。
3. 设置公共环境参数
把网站的根地址(比如 http://localhost:8080)和登录用的用户名、密码设成全局变量,方便调用。
统一设置请求头,比如告诉服务器返回 JSON 格式,以及模拟某个浏览器访问。
二、用 JMeter 怎么测
1. 搭测试框架
新建一个“测试计划”,相当于一个总容器。
添加“线程组”,用来模拟多个用户同时访问,比如 100 个人一起点。
2. 配置页面的请求
为每个需要测的页面(登录、首页、列表、编辑)分别创建一个 HTTP 请求采样器,就是告诉 JMeter 去访问哪个网址、用什么方式。
3. 看测试结果
添加两个看结果的窗口:
查看结果树:能看到每个请求发出去和返回的详细内容,方便排查问题。
汇总报告:把平均响应时间、错误率、吞吐量等关键数据统计成表格。
最后把收集到的结果整理分析一下。
4.1不同接口的性能测试
4.1.1登录接口


4.1.2用户信息接口


4.1.3博客列表页接口


4.1.4博客详情页接口


4.1.5添加博客接口


4.2聚合报告

4.3Transactions per Second(吞吐量)
吞吐量(Throughput)是性能测试中一个非常关键的指标,通俗来说就是:系统在单位时间内能处理多少请求或事务。你可以把它想象成“收费站一小时能通过多少辆车”:如果收费站一小时能过 1000 辆车,那吞吐量就是 1000 辆/小时。对应到网站或接口,就是一秒能处理多少个请求(常用单位:TPS,即每秒事务数;或者 QPS,每秒查询数)。

4.4Response Times Over Time(响应时间)
响应时间(Response Time)通俗来说就是:从你发出请求,到系统返回结果,总共花了多长时间。你可以把它想象成“你去食堂点菜,从跟阿姨说‘来份红烧肉’,到阿姨把菜递给你,中间等了多久”:如果阿姨手很快,3 秒就把菜给你,那响应时间就是 3 秒。对应到网站或接口,就是你点击按钮(比如登录),到页面上给出结果(比如“登录成功”或跳转)所经过的总时间。

4.5Active Threads Over Time(活跃线程状态)

4.6生成性能测试报告

在接口文件目录下输入cmd打开命令提示符,输入下面的指令
jmeter -n -t 登录接口-000046.jmx -l first.jtl -e -o ./first/.

回车键运行后文件夹中会显示HTML文件,此时点击HTML文件进入浏览器中

4.7查看性能报告



5.完整项目链接
https://gitee.com/tang-hanjiang/class104
Jmeter性能测试报告:class104: C语言代码 - Gitee.com
https://gitee.com/tang-hanjiang/class104/tree/master/backups
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)