前言
本篇博客对简易的博客系统做的测试总结一份测试报告,包含功能测试,自动化测试,性能测试
💓 个人主页:zkf
⏩ 文章专栏:测试
若有问题 评论区见📝
🎉欢迎大家点赞👍收藏⭐文章
目录
项目背景
项目概述
已实现的功能
未实现的功能
博客项目系统的功能概括
登录功能
博客列表页
博客详情页
博客编辑页
测试计划
测试用例
测试分类
功能测试
自动化测试
编写自动化测试用例
自动化测试所需工具
自动化测试流程
性能测试
性能测试工具
性能测试流程
性能测试报告
测试总结
项目背景
现如今越来越多的博客平台不断出现,发布博客已成为技术交流与知识分享的重要途径,我在日常写作和交流中也深刻体会到一个高效、便捷、安全的博客系统对于个人成长和技术传播的重要性,所以我认为一个博客系统的开发与测试至关重要。
项目概述
本博客系统项目是一个基于前后端分离架构的系统项目,运用数据库,将博客系统的账户与博客数据存储在云服务器上,前端实现主要由四个页面组成,分别是:登录页、博客列表页、博客详情页和博客编辑页,后端是对应实现的细节操作的接口,从而构成一个简易的博客系统的组成
已实现的功能
用户登录与注销
博客的发布与删除
博客列表与详情查看
用户登录错误的警告弹窗
未实现的功能
没有注册功能,需提前写进数据库
没有统计博客数和用户数
头像只能为静态
删除博客功能未在页面上实现
博客未编写完成时不能保存
博客项目系统的功能概括
登录功能
登录页面有对应的用户名和密码输入框还有对应的提交按钮,输入已存在数据库的用户数据,点击提交,跳转到博客列表页,若未登录下点击右上角主页或写博客,将强制跳转到登录页
博客列表页
该页面展示登录用户的头像与地址,文章个数与分类数,并且展示每篇博客的简要信息(标题,简要内容,发布时间等),右上角注销按钮,退出登录,返回登录页面,主页返回博客列表页,写博客跳转至博客编辑页
博客详情页
点击列表页中的查看详情按钮进入详情页,显示该博客标题,时间,详细内容,右上角三个按钮,效果跟上面一样
博客编辑页
在登录状态下,点击右上方写博客按钮跳转至博客编辑页进行写博客,用户可输入标题与正文内容,点击发布博客按钮后,博客被保存并发布,随后跳至博客列表页
测试计划
功能 | 前端开发 | 后端开发 | 提测日期 | 测试 | 测试日期 | 测试结果 |
登录 | zkf | zkf | 8.16 | zkf | 8.17 | 通过 |
主页 | zkf | zkf | 8.16 | zkf | 8.17 | 通过 |
详情页 | zkf | zkf | 8.17 | zkf | 8.18 | 通过 |
编辑页 | zkf | zkf | 8.17 | zkf | 8.18 | 通过 |
回归测试 | zkf | 8.20 | 通过 |
测试用例
测试分类
功能测试
一个博客系统的功能测试
功能测试结果:测试用例 100%通过
自动化测试
编写自动化测试用例
自动化测试所需工具
Python集成开发环境:Pycharm
python运行环境:Python 3.9
安装所需要的相关库:selenium,webdriver-manager
自动化测试流程
搭建目录以及相关软件
首先,创建BlogAutoTest测试项目,然后创建两个文件包一个是common,另一个是tests,tests里面存放每个页面的测试文件,common里创建个Utils用于构建浏览器对象,以及用到的截图工具功能,再创建一个images文件存放截到的图片
Utils.py文件
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):options=webdriver.ChromeOptions()self.driver=webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)self.driver.implicitly_wait(2)def screePhoto(self):dirname=datetime.datetime.now().strftime("%Y-%m-%d")if not os.path.exists("../images/"+dirname):os.mkdir("../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)
BlogDriver=Driver()
创建一个Driver浏览器对象,初始化函数中通过selenium库里对应的webdriver创建Chrome浏览器对象,所需要的服务用到对应的Chrome驱动,对应驱动在webdriver-manager库里,options配置选择默认配置就行,再配置个隐式等待。在类里在创建个截图功能函数,函数里首先通过对应的年月日创建目录名称,在该目录下再用年月日时分秒与对应测试的功能名称创建对应截图文件名,这样子可以防止文件命名冲突并且可以快速查找什么时候哪个功能测试结果图。最后在创建个该类的全局变量,让其他测试文件用一个用例就行
BlogLoginTest.py
import timefrom selenium.webdriver.common.by import By
from common.Utils import BlogDriverclass BlogLogin:url=""driver=""def __init__(self):self.url="http://8.137.19.140:9090/blog_login.html"self.driver=BlogDriver.driverself.driver.get(self.url)#成功登录的出测试用例def LoginSucTest(self):time.sleep(3)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.screePhoto()self.driver.back()#异常登录的测试用例def LoginFauTest(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("1234")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()time.sleep(2)alert=self.driver.switch_to.alerttime.sleep(2)alert.accept()self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()BlogDriver.screePhoto()
login=BlogLogin()
点击“检查”
选择要检查的对应目标
选择以选择器方式拷贝对应元素
在编写代码时,在find_element函数里粘贴,来查找对应元素目标,通过send_keys或click进行写入对应元素文本框或点击对应元素
在异场登录弹出的警告框不属于页面内容,需要用switch_to.alert跳转到对应警告框,accept表示接收警告框信息,成功登录与异常登录结果分别截图
BlogListTest.py
from common.Utils import BlogDriver
from selenium.webdriver.common.by import Byclass Bloglist:url=""driver=""def __init__(self):self.driver=BlogDriver.driverself.url="http://8.137.19.140:9090/blog_list.html"self.driver.get(self.url)def testBlogList(self):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.right > div:nth-child(1) > div.date")self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title")BlogDriver.screePhoto()
list=Bloglist()
根据测试用例,查找登录状态下的主页里昵称,地址,等元素,查找列表里博客标题,时间,简要内容等元素,以及检查相关功能等,测试结果截图保存
BlogDetailTest.py
from common.Utils import BlogDriver
from selenium.webdriver.common.by import Byclass Detail:url=""driver=""def __init__(self):self.url="http://8.137.19.140:9090/blog_detail.html?blogId=166703"self.driver=BlogDriver.driverself.driver.get(self.url)def DetailTest(self):self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.title")BlogDriver.screePhoto()
detail=Detail()
根据测试用例,检查登录状态下的相关的列表详情页元素,测试结果截图保存
BlogEidtTest.py
from common.Utils import BlogDriver
from selenium.webdriver.common.by import Byclass Eidt:url=""deriver=""def __init__(self):self.url = "http://8.137.19.140:9090/blog_edit.html"self.driver = BlogDriver.driverself.driver.get(self.url)def EditTest(self):BlogDriver.screePhoto()self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("4444")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()BlogDriver.screePhoto()
eidt=Eidt()
根据测试用例,检查登录状态下的编辑页里的元素,检查是否能编写博客并发布,测试结果截图保存
最后在回归测试下所有接口
from tests import BlogLoginTest
from tests import BlogListTest
from tests import BlogDetailTest
from tests import BlogEidtTest
from common.Utils import BlogDriverif __name__ == "__main__":BlogLoginTest.BlogLogin().LoginFauTest()BlogLoginTest.BlogLogin().LoginSucTest()# #登陆成功之后就可以调用博客首页测试首页的用例(登陆状态)BlogListTest.Bloglist().testBlogList()# #测试登录状态下的博客详情页# BlogDetailTest.Detail().DetailTest()#博客编辑页面BlogEidtTest.Eidt().EditTest()#指定浏览器的退出BlogDriver.driver.quit()
自动化测试结果:通过
性能测试
性能测试工具
jmeter测试工具
用到的两个jmeter插件:Page Data Extractor和Custom Thread Groups
性能测试流程
创建一个测试系统性能的线程组
以20个线程为例做一个简单的性能测试,每5个线程在1s内执行,每间隔3s执行一次
创建http默认请求值
这个包含了所有请求哪一项不填,用到的是默认值在该页中,我们的id和端口号可以放在这里
分别创建登录,列表页,用户信息,详情页,添加博客对应请求,并通过结果树验证是否通过
注意:
登录凭证在没有Cookie的情况下,需要添加到用到登录凭证的请求头中,否则连接失败,所以登录响应中的data需要提取出来到一个临时变量再添加到HTTP头管理器
详情页里访问的博客id可以指定成你在列表页中提取出来的id
在添加博客请求时,若访问失败,是content-type内容不同,需要在请求头里添加
查看响应时间图与吞吐量图
我们可以得知响应时间越高吞吐量越低是符合在性能测试下的预期,但我们发现最后线程退出时相应时间不短升高
我们再根据线程图观察到最后一个线程并没有退出来,我们再看下聚合报告,哪个页面响应时间长
分析原因
有聚合报告得知列表页响应时间过长,说明列表页存在问题,或许列表页响应数据太多,我们可以添加分页,来限制每页最大博客数,就可以减少响应时间
性能测试报告
生成测试报告命令:
结合生成的测试报告我们可以得知一共902个请求,全部通过,没有错误,说明该系统在高并发环境下可以运行
测试报告给出的响应时间也符合我们的猜测,列表页响应时间长
测试总结
本次测试,按照功能测试,自动化测试,性能测试方面对博客系统进行了测试,全部通过
结束语
博客系统测试报告结束