个人博客系统-测试报告
目录
一、项目概述
1.1 项目背景
1.2 项目简介
1.3 测试环境
二、测试用例
三、手动测试
四、自动化测试
五、兼容性测试
六、性能测试
七、测试总结
一、项目概述
1.1 项目背景
个人博客系统是一种用于发布、管理和分享个人内容的网络平台。随着互联网的普及,越来越多的人希望拥有一个专属的在线空间,用于记录生活、分享见解或展示专业技能。传统的社交媒体平台虽然提供内容发布功能,但往往缺乏个性化定制和独立性。因此,个人博客系统成为许多用户的首选方案。
1.2 项目简介
该个人博客系统主要实现了以下几个页面的功能:
- 登录功能:用户名以及密码已经在后端写入了数据库,没有实现账户注册功能,即:用户名以及密码是已经存在的。登录成功后就会跳转到列表页面。该页面在右上角存在主页和写博客两个按钮,但是在未登录情况下点击主页会跳转到登录页面,点击编辑会跳转至编辑页面面,但编辑页面点击发布还是会回到登录页面。
- 列表页面:可以在列表页查看有限数量的博客简介,其包括博客标题、发布时间以及内容概要。在左侧可以看到登录的用户以及文章数、分类数等的模块。在右上角有主页、写博客和注销三个功能:主页即列表页,写博客即博客编辑页,注销即注销用户,回到登录页面。
- 详情页面:在列表页面点击“查看全文”按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页、写博客、注销三个功能,在内容下面还有编辑和删除连个按钮,编辑是跳转至编辑页面,编辑该博客,删除即删除该篇博客,删除之后就会跳转到列表页面,该篇博客就被成功删除。
- 写博客:在登录之后的任意界面点击“写博客”之后就会进入博客编辑页面,此时就可以进行博客的编写,点击“发布文章”后就可以成功发布文章,此时就会跳转到列表页。
1.3 测试环境
- 操作系统:Windows 11
- 浏览器:Chrome、Edge
- 测试工具:Selenium、JMeter、postman
二、测试用例
三、手动测试
实际执行测试的部分操作步骤/截图
1.异常登录会出现警告:
2.正常登录后跳转至博客列表页:
3.写博客测试:
4.发布成功跳转至博客列表页
6.进入详情页,并点击“删除”之后并确认
7.回到博客列表页
7.注销:点击“注销”后回到登录页
四、自动化测试
自动化测试项目代码文件结构:
1.驱动类(Utils.py)
import datetime
import inspect
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()options = webdriver.EdgeOptions()options.page_load_strategy = 'eager'# 启动浏览器并应用配置# self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)self.driver = webdriver.Edge(options=options)self.driver.implicitly_wait(10)def getScreeShot(self):# 创建屏幕截图# 图片文件名称:./2024-05-08-173456.pngdirname = datetime.datetime.now().strftime("%Y-%m-%d")# 判断dirname文件夹是否已经存在,若不存在则创建文件夹# ../images/2024-05-08if not os.path.exists("../images/"+dirname):os.mkdir("../images/"+dirname)# 2024-05-08-173456.png# 图片路径:../images/2024-05-08/调用方法-2024-05-08-173456.png# 图片路径:../images/2024-05-08/LoginSucTest-2024-05-08-173456.png# 图片路径:../images/2024-05-08/LoginFailTest-2024-05-08-173456.png# filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S") + ".png"filename = inspect.currentframe().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()
2.博客登录页类(BlogLogin.py)
import time
from time import sleepfrom selenium.webdriver.common.by import Byfrom commom.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):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")# 检查标题,这里没使用上面的检查昵称是因为昵称有默认的,导致截图的页面没完全加载,虽然也没什么问题就是了,不过要是没文章的话就不能用下面的self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div > div.title")# 屏幕截图BlogDriver.getScreeShot()self.driver.back()# 异常登录测试用例def LoginFailTest(self):# 若连续多次的send_keys则会出现关键词拼接,而不是替换。若要替换需要先clearself.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("123")self.driver.find_element(By.CSS_SELECTOR, "#submit").click()# 检查是否登录失败time.sleep(1)# 有警告截不了图alert = self.driver.switch_to.alertalert.accept()
3.博客列表页类(BlogList.py)
from selenium.webdriver.common.by import Byfrom commom.Utils import BlogDriverclass BlogList:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/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.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()# 未登录状况下def ListTestByNotLogin(self):# 未登录状态下会跳转至登录页面self.driver.find_element(By.CSS_SELECTOR, "#username")
4.博客详情页类(BlogDetail.py)
from selenium.webdriver.common.by import Byfrom commom.Utils import BlogDriverclass BlogDetail:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_detail.html?blogId=158477"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 DetailTestByNotLogin(self):# 未登录状态下会跳转至登录页面self.driver.find_element(By.CSS_SELECTOR, "#username")
5.博客编辑页类(BlogEdit.py)
import timefrom selenium.webdriver.common.by import Byfrom commom.Utils import BlogDriverclass BlogEdit:url = ""driver = ""def __init__(self):self.url = "http://8.137.19.140:9090/blog_edit.html"self.driver = BlogDriver.driverself.driver.get(self.url)# 正确发布博客(登陆状态下)def EditTestByLogin(self):self.driver.find_element(By.CSS_SELECTOR, "#title").send_keys("自动化测试创建")# 找到编辑区域,输入关键词(编辑区域不可操作)# 可点击菜单栏元素再发布博客self.driver.find_element(By.CSS_SELECTOR, "#editor > div.editormd-toolbar > div > ul > li:nth-child(17) > a > i").click()# 休息一下,不然上面一句的点击好像会没点到一样time.sleep(1)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(2) > div.title").text# 这个断言看着来吧,不是自己的系统,如果有人再发博客,那我自动化发的博客不一定是第二篇,标题可能是其他的# assert actual == "自动化测试创建"# 屏幕截图BlogDriver.getScreeShot()# 未登录状况下def EditTestByNotLogin(self):# 未登录状态点击发布下会跳转至登录页面self.driver.find_element(By.CSS_SELECTOR, "#submit").click()self.driver.find_element(By.CSS_SELECTOR, "#username")
6.启动文件(RunTest.py)
from commom.Utils import BlogDriver
from tests.BlogDetail import BlogDetail
from tests.BlogEdit import BlogEdit
from tests.BlogLogin import BlogLogin
from tests.BlogList import BlogListif __name__ == "__main__":BlogLogin().LoginFailTest()# 未登录状态下其他页面的测试BlogList().ListTestByNotLogin()BlogDetail().DetailTestByNotLogin()BlogEdit().EditTestByNotLogin()BlogLogin().LoginSucTest()# 登陆成功之后其他页面的测试BlogList().ListTestByLogin()BlogDetail().DetailTestByLogin()BlogEdit().EditTestByLogin()# 指定浏览器的退出BlogDriver.driver.quit()
五、兼容性测试
测试场景一:在Windows11的Edge浏览器下进入问卷考试系统
预期结果:无异常且一切布局显示功能等与其一致
测试场景二:在Windows11的Chrome浏览器下进入问卷考试系统
预期结果:无异常且一切布局显示功能等与其一致
测试场景三:在Android中的浏览器下进入问卷考试系统
预期结果:无异常且一切布局显示功能等与其一致
六、性能测试
性能测试报告如下:
七、测试总结
本次测试结果功能测试一切正常,但性能测试暴露出系统列表页存在严重的性能瓶颈,如下图所示
可能原因是列表页需要请求所有博客数据,建议优先解决这个接口的性能问题,比如可以做分页,一次只请求一部分博客,不够的话再请求一部分,这样就可以避免数据库的全表查询,减少响应时间。