【项目】个人博客测试报告
一、项目背景
个人博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有四个页面构成:登录页、列表页、详情页以及编辑页,以上模拟实现了最简单的个人博客系统。其结合后端实现了以下的主要功能:登录、编辑博客、注销、删除博客、以及强制登录等功能。
但是该项目没有设计用户注册功能,只能提前在数据库中存储用户信息后经过校验登录;并且用户头像不能自己设定,在进行前端页面的书写过程中已经将头像的图片写为静态了;而用户信息中的文章数以及分类数也没有在后端中具体实现,直接在前端页面中写为了静态的。
该个人博客系统可以实现个人用户简单的博客记录,时间、标题、内容以及发布者等都可以进行详细地查看。
二、项目功能
该个人博客系统主要实现了以下几个功能:登录、注销、写博客以及删除博客等功能。
登录功能:用户名以及密码已经在后端写入了数据库,没有实现账户注册功能,即:用户名以及密码是已经存在的。登录成功后就会跳转到列表页面。在右上角存在主页和写博客两个按钮,但是在未登录情况下按下均只会跳转到登录页面。
列表页面:可以在列表页查看有限数量的博客简介,其包括博客标题、发布时间以及内容概要。在左侧可以看到登录的用户以及文章数、分类数等的模块。在右上角有主页、写博客和注销三个功能:主页即列表页,写博客即博客编辑页,注销即注销用户,回到登录页面。
详情页面:在列表页面点击“查看全文”按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页、写博客、删除和注销四个功能:删除即删除该篇博客,删除之后就会跳转到列表页面,该篇博客就被成功删除。
写博客:在登录之后的任意界面点击“写博客”之后就会进入博客编辑页面,此时就可以进行博客的编写,点击“发布文章”后就可以成功发布文章,此时就会跳转到列表页。
三、测试计划
一)功能测试
1.测试用例

2.根据测试用例手动执行测试
(1)登录测试:
1、正常登录

2、异常登录
(1 账号密码为空

(2 账号错误密码正确

(3 账号正确密码错误

(2)博客首页信息测试

(3)写博客测试:

(4)发布成功并查看详情页:


(5)删除博客
进入详情页,并点击“删除”之后成功删除,如新发布的 2025-11-15 13:00 的博客就已经被成功删除。


(6)注销:点击“注销”后回到登录页

以上,就是我们对博客功能的手动测试,那么接下来让我们讨论一下有关于测试的意义。
一个生动的比喻
把软件开发比作盖房子:
不写测试:就像盖房子不用水平仪、不检查结构。盖完几层后,发现墙是歪的,只能推倒重来或进行危险且昂贵的加固。
手动测试:就像盖完每一层后,请一个监理团队来手动测量所有墙壁和角度。房子越高,监理团队越大,耗时越长。
自动化测试:就像在砌每一块砖时,都内置了传感器和水平仪。砖没放好,机器立刻报警。这样盖的房子,又快又稳,你可以自信地一直往上盖。
总结
编写自动化测试不是一个“可选项”,而是专业软件开发的“标配”。它的意义是全方位的:
对技术:提升代码质量和可维护性。
对流程:实现敏捷开发和快速交付。
对商业:保障稳定、降低成本。
短期来看,它似乎拖慢了开发速度;但长期来看,它是唯一能让项目在高速迭代中不至于崩溃解体、维持健康发展的实践。
因此,下面我们来尝试通过测试用例来实现一下我们的自动化测试。
二) 自动化测试
1.简介(含测试代码码云)
我这里是通过Python selenium库来进行的web自动化测试,下面我来介绍一下环境背景。测试代码的码云链接为:博客自动化测试码云: 实现了博客系统的自动化测试
1.selenium库:selenium是⼀个web⾃动化测试⼯具,selenium中提供了丰富的⽅法供给使⽤者进⾏web⾃动化测试
2.webdriver-manager驱动:若通过安装驱动的⽅式来启动浏览器,每次浏览器更新后对应的驱动也需要更新,为了解决这个问 题,selenium中提供了驱动管理⼯具webdriver-manager,有了webdriver-manager⽆需⼿动安装浏览器驱动,即使浏览器更新也不会影响⾃动化的执行,WebDriver Manager是⼀个开源的命令行⼯具,它可以⾃动下载和安装适⽤于不同浏览器的 WebDriver。通过使⽤WebDriverManager,我们可以确保浏览器驱动版本始终与浏览器版本保持⼀ 致,从而避免因版本不匹配而导致的各种问题。
3.由于版本更新迭代以及网络速度的因素部分用户可能无法使用2.中的webdriver-manager ,因此这里的解决方法只能是手动安装浏览器驱动,下面我展示的自动化测试代码展示了这两种方式,,自动化驱动部分我给注释掉了,大家可以根据需要自行采取适合自己的方式。
这两个库的安装指令如下:
selenium库:
pip install selenium==4.0.0
webdriver-manager驱动:
pip install webdriver-manager
安装好两个库之后,我们可以在设置里的项目的解释器中查看是否安装成功:

2.创建驱动类
由于我们这里的自动化测试需要测试许多不同的页面,而如果每个测试页面都创建一个新的驱动又太浪费资源,因此,我这里采用了单例模式,所有页面的测试公用一个驱动,在这里我将驱动的创建设置成了一个单独的类,并且类中还实现了屏幕截图用于检测测试时测试页面的情况,从而便于出错时我们来查找问题的所在,下面是我的创建驱动类的代码。
import datetime
import os.path
import sysfrom selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 注意自动处理需要导入该方法
# from webdriver_manager.chrome import ChromeDriverManagerclass Driver:driver=""def __init__(self):# 打开浏览器---驱动管理---自动处理,webdriver_manager# chrome_driver_path = ChromeDriverManager().install()# 打开浏览器---驱动管理---手动处理 这里的路径是你手动安装好的驱动存放路径chrome_driver_path = r'D:\chromedriver-win64\chromedriver.exe'options = webdriver.ChromeOptions()self.driver = webdriver.Chrome(service = Service(chrome_driver_path),options = options)self.driver.implicitly_wait(2)def getScreeShot(self):# 创建屏幕截图# 根据日期将一天内的截图存储到同一个目录下dirname = datetime.datetime.now().strftime('%Y-%m-%d')# 判断目录dirname是否存在if not os.path.exists('../images/'+dirname):# 不存在则创建日期目录os.mkdir('../images/'+dirname)# 创建好后/存在 则保存截图# 文件名称采用 类名+时间 存储路径为: ../images/dirname/filename = sys._getframe().f_back.f_code.co_name+"-"+datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S')+'.png'self.driver.save_screenshot('../images/'+dirname+'/'+filename)# 单例模式---所有函数只用同一个driver
BlogDriver = Driver()
3.登录页面测试
概述
本文介绍了如何使用Selenium WebDriver对博客系统的登录页面进行全面的自动化测试。通过构建
BlogLogin测试类,我们实现了对登录功能的多场景覆盖,包括成功登录和多种异常情况的测试。
核心测试方法
1. 成功登录测试
LoginSucTest()
测试场景:输入正确的用户名和密码
测试步骤:
清空用户名和密码输入框
输入有效凭据(用户名:zhangsan,密码:123456)
点击提交按钮
验证是否成功跳转到首页
验证方式:通过查找首页特定元素确认登录成功
附加操作:截图保存测试结果,返回登录页面
2. 异常登录测试用例
空凭据测试
LoginFailTest1()
测试场景:用户名和密码均为空
预期结果:弹出提示"账号或密码不能为空"
验证方式:捕获并断言弹窗内容
用户不存在测试
LoginFailTest2()
测试场景:错误用户名+正确密码
预期结果:弹出提示"用户不存在"
验证方式:捕获并断言弹窗内容
密码错误测试
LoginFailTest3()
测试场景:正确用户名+错误密码
预期结果:弹出提示"密码错误"
验证方式:捕获并断言弹窗内容
测试策略
该测试方案覆盖了登录功能的主要业务场景:
正向用例:验证正常登录流程
边界用例:测试空输入情况
异常用例:验证用户名不存在和密码错误的情况
通过这种全面的测试覆盖,能够有效保证登录功能的稳定性和用户体验,为博客系统的质量保障提供了坚实基础。
这种自动化测试方法不仅提高了测试效率,还能够快速回归验证,是现代化软件开发流程中不可或缺的重要环节。
该模块测试代码如下:
# 测试博客登录页面
import timefrom selenium.webdriver.common.by import Byfrom common.Utils import BlogDriverclass BlogLogin:url = ''driver = ''def __init__(self):self.url = 'http://47.108.157.13:8090/blog_login.html'self.driver = BlogDriver.driverself.driver.get(self.url)# 成功登录的测试用例def LoginSucTest(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('zhangsan')self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys('123456')# 提交账号和密码self.driver.find_element(By.CSS_SELECTOR,'#submit').click()# 检测是否能够找到首页名称 若能则表示登陆成功 否则表示失败self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.left > div > h3')# 添加屏幕截图BlogDriver.getScreeShot()# 返回登陆首页self.driver.back()# 异常登录的测试用例def LoginFailTest1(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('')self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys('')# 提交账号和密码self.driver.find_element(By.CSS_SELECTOR, '#submit').click()# 该操作会产生弹窗 检测弹窗内容是否符合预期time.sleep(1)alert = self.driver.switch_to.alertassert '账号或密码不能为空' in alert.textalert.accept()# 添加屏幕截图BlogDriver.getScreeShot()def LoginFailTest2(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('zhang')self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys('123456')# 提交账号和密码self.driver.find_element(By.CSS_SELECTOR, '#submit').click()# 该操作会产生弹窗 检测弹窗内容是否符合预期time.sleep(1)alert = self.driver.switch_to.alertassert '用户不存在' in alert.textalert.accept()# 添加屏幕截图BlogDriver.getScreeShot()def LoginFailTest3(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('zhangsan')self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys('1234')# 提交账号和密码self.driver.find_element(By.CSS_SELECTOR, '#submit').click()# 该操作会产生弹窗 检测弹窗内容是否符合预期time.sleep(1)alert = self.driver.switch_to.alertassert '密码错误' in alert.textalert.accept()# 添加屏幕截图BlogDriver.getScreeShot()
4.博客首页测试
概述
本文介绍了博客系统首页的自动化测试实现,通过
BlogList测试类对博客首页在不同用户状态下的显示效果进行全面验证。测试覆盖了已登录和未登录两种状态下的页面元素展示情况。
核心测试方法
1. 已登录状态测试
ListTestByLogin()个人信息区域验证
用户头像:验证头像图片元素存在
用户名称:验证用户名显示元素存在
分类统计:验证分类数量显示元素存在
文章统计:验证文章数量显示元素存在
博客列表区域验证
博客标题:验证博客标题显示元素存在
发表时间:验证博客发布时间显示元素存在
博客内容:验证博客内容摘要显示元素存在
查看详情按钮:验证操作按钮元素存在
2. 未登录状态测试
ListTestNoLogin()登录页面重定向验证
页面标题:验证登录页面标题元素存在
用户名输入框:验证用户名输入框元素存在
密码输入框:验证密码输入框元素存在
提交按钮:验证登录提交按钮元素存在
测试策略
已登录状态测试重点
验证用户个人信息的完整展示
确认博客列表各项内容的正确显示
确保交互元素(查看详情按钮)的可访问性
未登录状态测试重点
验证权限控制机制的有效性
确认自动跳转到登录页面的功能正常
检查登录表单的完整性
该模块测试代码如下:
# 测试博客首页
import timefrom selenium.webdriver.common.by import Byfrom common.Utils import BlogDriverclass BlogList:url = ''driver = ''def __init__(self):self.url = 'http://47.108.157.13:8090/blog_list.html'self.driver = BlogDriver.driverself.driver.get(self.url)# 登陆状态下测试def ListTestByLogin(self):# 测试个人信息 头像、名称、分类、文章 是否存在# 头像self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.left > div > img')# 名称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 > div:nth-child(4) > span:nth-child(2)')# 文章self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.left > div > div:nth-child(4) > span:nth-child(1)')# 测试博客列表# 博客标题self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.right > div:nth-child(2) > div.title')# 博客发表时间self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.right > div:nth-child(2) > div.date')# 博客内容self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.right > div:nth-child(2) > div.desc')# “查看详情”按钮self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.right > div:nth-child(2) > a')# 添加屏幕截图BlogDriver.getScreeShot()# 未登陆成功下测试def ListTestNoLogin(self):# 查看是否跳转回登录界面self.driver.find_element(By.CSS_SELECTOR,'body > div.container-login > div > h3')self.driver.find_element(By.CSS_SELECTOR, '#username')self.driver.find_element(By.CSS_SELECTOR, '#password')self.driver.find_element(By.CSS_SELECTOR, '#submit')# 添加屏幕截图BlogDriver.getScreeShot()
5.博客详情页测试
概述
本文介绍了博客系统详情页的自动化测试实现,通过
BlogDetail测试类对博客详情页面在不同访问权限下的行为进行验证。测试重点验证了已登录用户正常访问和未登录用户的权限控制机制。
核心测试方法
1. 已登录状态测试
DetailTestByLogin()博客内容完整性验证
博客标题:验证详情页标题元素正确显示
发表时间:验证博客发布时间信息存在
博客内容:验证博客正文内容区域正常展示
测试特点:
直接访问具体博客ID(33842)的详情页面
验证核心内容元素的完整性和可访问性
通过截图记录测试时的页面状态
2. 未登录状态测试
DetailTestNoLogin()权限控制验证
弹窗警告:检测系统是否弹出权限警告提示
警告处理:自动接受警告弹窗
状态记录:截图记录未登录访问时的系统反应
测试特点:
添加等待时间确保弹窗完全加载
验证系统的安全防护机制
确认未登录用户无法直接访问详情内容
测试策略
已登录状态测试重点
验证博客详情页面的内容完整性
确认标题、时间、内容等核心信息的正确显示
确保登录用户能够正常访问具体博客内容
未登录状态测试重点
验证系统的权限控制是否有效
确认未授权访问会触发安全警告
测试系统的用户引导机制(通过弹窗提示)
该模块测试代码如下:
import timefrom selenium.webdriver.common.by import Byfrom common.Utils import BlogDriver# 测试博客详情页
class BlogDetail:url = ''driver = ''def __init__(self):self.url = 'http://47.108.157.13:8090/blog_detail.html?blogId=33842'self.driver = BlogDriver.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')# 屏幕截图BlogDriver.getScreeShot()# 未登录成功下测试def DetailTestNoLogin(self):time.sleep(2)# 检测是否出现弹窗警告alert = self.driver.switch_to.alertalert.accept()# 屏幕截图BlogDriver.getScreeShot()
6.博客编辑页测试
概述
本文介绍了博客系统编辑发布功能的自动化测试实现,通过
BlogEdit测试类对博客编辑页面的正常发布、异常处理以及删除功能进行全面验证。测试涵盖了博客创作的全流程,从内容创建到发布管理的完整生命周期。
核心测试方法
1. 正常发布流程测试
EditSucTestByLogin()博客创建阶段
标题输入:自动填充测试标题"自动化测试创建"
内容处理:识别到编辑区域的操作限制,采用默认内容
发布操作:点击发布按钮提交博客内容
发布验证机制
等待策略:采用隐式/显式等待处理页面跳转延迟
结果断言:通过标题文本验证博客发布成功
状态记录:截图保存发布成功状态
2. 删除功能测试
EditSuc_delTestByLogin()删除流程验证
入口导航:通过"查看全文"按钮进入博客详情页
取消操作:测试删除弹窗的取消功能
确认删除:完整执行删除确认流程
交互验证:全面测试弹窗的确认和取消两种交互
3. 异常发布测试
EditFailTest_1_ByLogin()边界条件验证
空标题提交:测试不填写标题的直接发布
错误处理:验证系统对非法操作的警告机制
弹窗处理:确认系统提供适当的用户引导
测试策略
正常流程测试重点
验证博客创建和发布功能的完整性
确保发布后的内容正确显示
测试删除功能的双向交互(确认/取消)
异常流程测试重点
验证系统对不完整数据的处理能力
确认错误提示机制的及时性和准确性
测试系统的鲁棒性和用户引导效果
该模块测试代码如下:
# 测试博客编辑页
import timefrom selenium.webdriver.common.by import Byfrom common.Utils import BlogDriverclass BlogEdit:url = ''driver = ''def __init__(self):self.url = 'http://47.108.157.13:8090/blog_edit.html'self.driver = BlogDriver.driverself.driver.get(self.url)# 正常发布博客(登录状态下)# 将测试发布的博客进行删除测试def EditSuc_delTestByLogin(self):# 点击查看全文按钮,进入新发布的博客的博客详情页self.driver.find_element(By.CSS_SELECTOR, 'body > div.container > div.right > div:nth-child(4) > a').click()# 点击删除按钮进行博客的删除self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.right > div > div.operating > button:nth-child(2)').click()# 弹出弹窗警告测试弹窗的取消按钮alert = self.driver.switch_to.alertalert.dismiss()# 屏幕截图BlogDriver.getScreeShot()# 再次点击删除按钮进行删除self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.right > div > div.operating > button:nth-child(2)').click()# 弹出弹窗警告测试弹窗的确定按钮alert = self.driver.switch_to.alertalert.accept()# 屏幕截图BlogDriver.getScreeShot()def EditSucTestByLogin(self):# 输入标题self.driver.find_element(By.CSS_SELECTOR,'#title').send_keys('自动化测试创建')# 找到编辑区域,输入关键词(编辑区域不可操作)# 菜单栏无法元素无法定位# 博客系统编辑区域默认情况下就不为空,可以暂不处理# 直接点击发布按钮来发布博客self.driver.find_element(By.CSS_SELECTOR,'#submit').click()# 点击完成之后出现页面的跳转,页面跳转需要加载时间,可能会出现代码执行的速度比页面渲染的速度要快,导致元素查找不到,因此可以添加等待# 添加隐式等待和显示等待都可以,任选择一个# 隐式等待:创建浏览器对象之后就可以加上,因为隐式等待的作用域在driver整个生命周期# 显示等待:可以作用在当前代码中# 检测是否发布成功actual = self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.right > div:nth-child(4) > div.title').textassert actual == '自动化测试创建'# 屏幕截图BlogDriver.getScreeShot()time.sleep(2)# 测试博客详情页的删除操作self.EditSuc_delTestByLogin()# 异常发布博客def EditFailTest_1_ByLogin(self):# 不写标题# 直接点击发布按钮来发布博客self.driver.find_element(By.CSS_SELECTOR, '#submit').click()time.sleep(1)# 查看是否出现弹窗警告alert = self.driver.switch_to.alertalert.accept()# 屏幕截图BlogDriver.getScreeShot()
7.总体测试功能的执行
首先,下面的代码,调用了我实现的测试所有自动化测试代码,但是注意这里我故意出现了一处与测试用例的预期不符合Bug。
代码如下:
from common.Utils import BlogDriver
from tests import BlogLogin
from tests import BlogList
from tests import BlogDetail
from tests import BlogEditif __name__ == '__main__':# 登陆失败测试BlogLogin.BlogLogin().LoginFailTest1()BlogLogin.BlogLogin().LoginFailTest2()BlogLogin.BlogLogin().LoginFailTest3()# 登陆失败访问测试BlogLogin.BlogLogin().LoginFailTest2()# 未登录情况下访问博客首页BlogList.BlogList().ListTestNoLogin()# 未登录情况下访问博客详情页BlogDetail.BlogDetail().DetailTestNoLogin()# 登陆成功测试BlogLogin.BlogLogin().LoginSucTest()BlogList.BlogList().ListTestByLogin()BlogDetail.BlogDetail().DetailTestByLogin()BlogEdit.BlogEdit().EditSucTestByLogin()BlogEdit.BlogEdit().EditFailTest_1_ByLogin()BlogDriver.driver.quit()

这里我们可以看到出现了这样一个报错,根据内容我们大概知道是BlogDetail.BlogDetail().DetailTestNoLogin()中alert = self.driver.switch_to.alert 这部分报出的错误,所以此时我们首先需要查看代码思路与测试用例的要求是否相符。


这里我们可以看到测试用例要求的就是出现弹窗警告,与我的代码思路相同,此时我们就需要手动验证在未登录状态下访问博客详情页的情况。由于这里跳转的速度太快,我无法用截图的形式来展示,这里通过手动测试得出的结论是在未登录状态下访问博客详情页也是返回登录页面,而不是出现弹窗警告,因此,如果这个测试用例与公司要求的软件需求相同的话,那么这里就是属于开发人员出现的一个小Bug,这里我们就需要在测试报告里体现出来。
我们将这一测试进行注释,再次执行查看其它测试是否会出现问题,出现问题的话同上述操作逐渐排查
这里我们可以看到在注释掉那一个测试后其他的测试都能正常执行,因此,此次自动化的功能测试就算圆满成功了总共测试出了一个功能Bug,同时我们也需要观察测试生成的图片看看前端页面中(例如:元素的色彩、大小等)是否符合公司的软件需求,如若出现很不合理的地方也可以写在测试报告中提出来。
三) 性能测试
接下来我们需要进行的就是性能测试,这里我们通过jmeter和postman辅助来实现性能测试。首先我们需要进入网页的开发者模式,来对网页进行性能测试。

在使用jmeter进行性能测试之前,我们通常会在postman里面进行一些简单的测试

如果这里我们直接请求路径会发现code出现报错这一现象,并且给出了错误信息,因此我们需要配置一些信息,观察下图我们发现有一个Data信息。

这里我们配置一下data 登录页的data可以理解为用户的登录凭证

此时,我们就可以发现访问成功,那么接下来我们就通过jmeter访问。
1.博客登录接口
首先,我们添加一个HTTP请求。


创建结果树来查看测试结果:


这里我们创建一个结果树来查看结果,注意此时虽然登录接口测试的图标显示通过,但是,我们这里也需要逐个查看取样结果、请求、响应数据中的信息是否出现异常来判断是否真正的访问成功了。
2.HTTP请求默认值
接下来我们还有许多页面进行测试但是访问的协议、IP、端口号全都相同,一个一个输入是不是效率太低了,因此,这个软件中有一个很人性化的设计那就是HTTP请求默认值。
创建HTTP请求默认值文件:

设置内容:

3.列表页
同上述原理我们来访问列表页


这里我们发现一个问题,它给我们返回了一个401的状态码,很显然是有问题的,那么问题出在哪里了呢,很显然我们此时也相当于没有用户凭证,而此时的用户凭证又在哪里呢,这里的凭证肯定是和登录接口的有区别的,通过比较两个页面信息我们发现,List页面多了一个user_token_header元素,我们不妨假设这个就是凭证,下面我们用postman来验证。


此时我们就发现访问成功了,那么接下来我们通过jmeter来访问。

列表页加上user_token_header元素后我们发现也能访问成功,不过此时需要解决一个问题,那就是通过网上资料的查看我们会发现user_token_header元素会隔段时间随机变化的那么这里我们如何解决呢?

查看登录页面返回的响应数据我们不难发现data对应的值与user_token_header元素对应的值完全相同,因此此时我们需要借用json提取器来提取data


这里使用json提取器要注意的是:json提取器会重复提取data,得把json提取器放到登录页的子路径下,只让他提取登录页的data,此时我们就解决了user_token_header元素更新的问题。
4.用户信息页


同列表页,这里也能通过user_token_header元素直接访问,所以这一页面就不在过多介绍了。

5.详情页

我们这里也是先通过postman来进行测试访问:

这里我们可以看到访问成功了,但是这里又引出一个问题:我博客的id不能写死呀,万一这个id的文章删除了我这里不就出错了吗,那么怎么做呢?
通过列表页的返回数据我们可以发现,现在又可以使用json提取器了,把json提取器放到博客列表页里面提取博客文章的id



此时在请求里面加上这一参数值就解决了上述所出现的问题。
6.添加博客
下面我们先来发布一篇博客从而获得发布博客的url


发布完成后我们得到一个add这就是发布博客的url,此时如果将这一路径直接放在postman中去执行我们会发现,返回结果出错了,那么如何解决呢?
由于先前已经测试过,所以我们这里不难发现是由于没有请求标题出现的错误,所以这里我们想要解决也许给出请求标题和请求内容。


通过查看我们发现这里输入json格式,因此我们这里需要在请求Body里加上这一请求试试。此时加上以后我们会发现我们这里就请求成功了,而且在博客中它也给我在次发了一次博客。

既然postman中访问成功了那么接下来我们只需要在jmeter中按照这种形式填充访问就可以了?
不过很遗憾,不是你想的那样这里报错了,那么报错的原因是什么呢?
通过观察我们发现,我们在jmeter里的请求头中的 ContentType 与浏览器中的请求不同,那么此时我们就能够猜出错误的原因了,接下来我们修改一下请求:
修改完成以后我们就能发现我们在jmeter中也请求成功了:
7.添加JSON断言
为什么要添加JSON断言呢?因为我们开启多线程(虚拟用户的数量增加)我们不可能一个一个去查看结果的反馈是否符合我们的预期

可以看到添加了JSON断言后,测试还是可以通过的

我简单讲一下JSON断言的细节:正则匹配的语法:https://www.runoob.com/regexp/regexp-syntax.html

8.添加CSV数据文件设置
以登陆接口为例,当我们执行登陆接口的性能测试时,⼿动配置了用户名和密码为固定的username和 password,这样子我们的账号密码就手动写死了,然而实际使用中不可能只有⼀个用户登陆,为了模拟更真实的登录环境,我们需要提供更 多的用户username和password来实现登录操作
这里我们只实现两个已存在用户的信息进行测试,将excel另存为csv文件存在一个目录下。
这里是我们存储的路径对应着下面的文件名的路径。


将线程数改为2 ,在查看结果树里面查看运行结果:可以看到登录了两个不同的用户


9.性能测试

这里我们需要将上面的文件复制下来,并将上面的禁用,同时我们还需加入一些小插件:
对图片解读:
This group will start:启动多少个线程,同线程组中的线程数
First, wait for:等待多少秒才开始压测,⼀般默认为0
Then start:⼀开始有多少个线程数,⼀般默认为0
Next,add:下⼀次增加多少个线程数
threads every:当前运⾏多⻓时间后再次启动线程,即每⼀次线程启动完成之后的的持续时间;
using ramp-up:启动线程的时间;若设置为5秒,表⽰每次启动线程都持续5秒
thenhold loadfor:线程全部启动完之后持续运⾏多⻓时间
finally,stop/threadsevery:多⻓时间释放多少个线程;若设置为5个和1秒,表⽰持续负载结束之后 每1秒钟释放5个线程
对测试结果解读:
先看一下活跃的线程数量:
响应时间:特别注意一下圈起来那里,都快结束了响应时间还这么长,说明退出的时候没有得到响应一直退出不了,我这个进程发送了请求但是服务器一直没有给到反馈
吞吐量:
在聚合报告里面也可以看到:列表页的执行时间超出其他页面很多,说明是列表页的一个进程出了问题
erm其实响应时间和吞吐量是有一定关系的:响应时间增加了,服务器就有了压力,这个时间服务器处理的并发数量是有限的,所以吞吐量就降低了
我们从图片直接结果的图片上面也可以看到响应时间和吞吐量的关系:响应时间高,吞吐量就低
10.生成性能测试报告
jmeter测试报告是⼀个全⾯⽽详细的⽂档,它提供了关于测试执⾏结果的详细信息,帮助⽤⼾全⾯评 估系统的性能并进⾏性能优化。
⽣成性能测试报告的命令:在终端执行命令
jmeter -n -t 脚本⽂件 -l ⽇志⽂件 -e -o ⽬录
-n :无图形化运行
-t : 被运行的脚本
-l : 将运行信息写入日志文件,后缀为 jtl 的日志⽂件
-e : 生成测试报告
-o : 指定报告输出目录
这里我们需要打开终端进入我们文件存储的位置
进入到文件存储的路径输入以下指令:(注意这里我们需要在目录下手动创建Test目录)
注意:这里我们需要等一段较长的时间,请耐心等待。
执行完成后图片为:
我们会发现在Test目录下生成了一个index.html文件这个里面存储的就是性能报告
性能报告展示 测试通过率100%因此该系统能够正常处理业务
活跃进程数量:
吞吐量:
响应时间:
四、Bug概述
Bug1:
标题: 博客详情页未登录状态下的弹窗警告
测试环境:谷歌142.0.7444.60(正式版本) (64 位)
操作系统: Windows 11
Bug级别:P2 重要但不紧急,可以在下个版本修复。
详细描述:
前置条件:未登录状态下
复现步骤:未登录状态下访问博客详情页
预期结果:出现弹窗警告
实际结果:未出现弹窗直接返回登录页面
附加图片:
点击后图片:



























