个人博客系统 --- 测试报告
一、项目功能介绍
该项目由:登录模块、博客首页模块、博客详情页模块、博客编辑页模块四个功能模块组成。
该系统实现了个人博客的保存以及记录了发布日期、时间、发布人等信息。
二、测试内容与测试用例
我们需要对该系统进行功能测试,界面测试,安全测试,易用性测试,兼容性测试以及性能测试,其中功能测试是最主要的,对于该系统的功能测试用例如下:
三、登陆模块测试
在登陆界面,我们可以看到最主要的三个元素:输入用户名框,输入密码框,提交按钮
成功登陆介绍:输入正确的用户名和密码,点击提交即可成功登陆
测试用例展示(部分):
1)输入正确的账号和密码,点击提交按钮
预期结果:跳转到博客系统首页
实际结果:跳转到博客系统首页
2)输入错误的用户名和错误的密码
预期结果:登陆失败,提示用户不存在
实际结果:登陆失败,跳出弹窗,弹窗内容为:用户不存在
四、博客首页模块测试
当我们成功登陆时,会进入到博客首页,在博客首页,我们可以看到一张博客列表,列表中记录了发布的博客,也可以看到相应的博客名,博客发布的时间,博客部分内容。在用户页,显示了用户的用户名,文章数统计,分类统计。
测试用例展示:
1)点击查看全文按钮
预期结果:跳转到博客详情页,博客列表框变成博客详情框,其余元素不变
实际结果:跳转到博客详情页,博客列表框变成博客详情框,个人信息框中的用户名改变
2)点击注销按钮
预期结果:跳转到博客登陆页
实际结果:跳转到博客登陆页
五、博客详情页模块测试
在详情页中,我们需要检查博客详细框里面博客的标题,发布时间,内容是否和博客首页中显示的一致还需要检查个人信息框的内容是否和博客首页中个人信息框的信息一致!
测试用例展示:
1)查看个人信息框的内容是否与博客首页的个人信息框中的内容一致
预取结果:两个模块的个人信息框一致
实际结果:两个模块的个人信息框不一致
2)对博客的标题,发布时间的检查,是否与博客首页的内容相符
预期结果:两个模块中同一篇博客的内容与属性相同
实际结果: 两个模块中同一篇博客的内容与属性相同
博客首页模块该博客内容与属性信息:
博客详情页模块该博客内容与属性信息:
六、博客编辑页模块测试
点击写博客按钮,会进入到博客编辑页模块,在该模块中我们可以个性化编辑我们的博客
测试用例展示:
1)点击“写文章”按钮,进入博客编辑页模块
预期结果:进入博客编辑页模块,博客标题默认为空,博客内容默认为:在这里写下一篇博客
实际结果:博客标题默认为空,博客内容默认为:在这里写下一篇博客
2)不输入标题,点击“发布文章按钮”发布文章
预期结果:发布文章失败,提示未输入文章标题
实际结果:发布文章失败,未提示:输入文章标题
3)输入标题,点击“发布文章”按钮
预期结果:发布文章成功,在博客首页模块可以查看到该博客
实际结果:发布文章成功,在博客首页模块查看到该博客
七、使用Selenium进行web自动化测试用例
1.确保PyCharm中安装了selenium和webdriver-manager
2.参照测试用例,编写自动化测试脚本
2.1Utils文件:存放共同使用的数据与方法
在项目下创建一个common包,里面存放通用的文件数据,如:浏览器驱动器
#生成测试文件中需要用到的配置内容
import datetime
import os.path
import sys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManag
class Driver:
driver=""
def __init__(self):
self.driver=webdriver.Chrome(service=Service(ChromeDriverManager().install()))
self.driver.implicitly_wait(3)#隐式等待3s
def getScreenShot(self):
# 创建屏幕截图
# 图片文件名称:./2024-05-08-173456.png
dirname = datetime.datetime.now().strftime("%Y-%m-%d")
# 判断dirname文件夹是否已经存在,若不存在则创建文件夹
# ../images/2024-05-08
if not os.path.exists("../images/" + dirname):
os.mkdir("../images/" + dirname)
# 2024-05-08-173456.png
# 图片路径:../images/调用方法-2024-05-08/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"
self.driver.save_screenshot("../images/" + dirname + "/" + filename)
#创建一个作用域在全局的浏览器对象
BlogDriver=Driver()
2.2创建一个运行所有测试用例的文件,这个文件可以用来进行回归测试
创建一个名为Test的文件夹,里面存放每个板块的自动化测试用例,以及一个用于回归测试的RunTest.py文件,RunTest.py文件如下:
from test.All import driver
from test.BlogListTest import BlogList
from test.BlogLoginTest import BlogLogin
from test.BlogListTest import List
from common.Utils import BlogDriver
from test.BlogDetailTest import Detail
from test.BlogEditTest import Edit
#入口函数
if __name__=="__main__":
login_obj = BlogLogin()
# login_obj.LoginFailTest()
#未登录的情况下进入博客编辑页
Edit.Fail_Edit_notLogin()
login_obj.LoginSucTest()
#登陆成功后就可以
list_obj = BlogList()
list_obj.ListTestByLogin()
#点击注销按钮,查看注销后的页面,再重新登陆进入系统主页
List.ListTestByLoginAgain()
#博客详情页测试
Detail.check()
#博客编辑页测试
# Edit.Fail_Edit()
Edit.Suc_Edit()
#浏览器退出
BlogDriver.driver.quit()
2.3 对于登陆模块的自动化测试
#测试登陆页
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
import time
class BlogLogin:
url=""
driver=""
def __init__(self):
self.url="http://8.137.19.140:9090/blog_login.html"
self.driver=BlogDriver.driver
self.driver.get(self.url)
#检查登陆界面元素
def Check_ele_Login(self):
#检查用户名输入框
self.driver.find_element(By.CSS_SELECTOR,"#username")
#检查密码输入框
self.driver.find_element(By.CSS_SELECTOR,"#password")
#检查提交框
self.driver.find_element(By.CSS_SELECTOR,"#submit")
#检查系统名称
txt=self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > span").text
assert txt=="我的博客系统"
#检查主页框,检查写博客框
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(4)")
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)")
def Clear_and_Alert(self):
# 获取屏幕截图
BlogDriver.getScreenShot()
# 断言查看弹窗内容
alert = self.driver.switch_to.alert
text = alert.text
print(text)
# 弹窗点击确认
alert.accept()
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
# 测试登陆成功的测试用例
def LoginSucTest(self):
self.Check_ele_Login()
#保险起见,先将输入框清空
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("lisi")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
time.sleep(1)
#判断是否成功登陆:看看是否能找到首页的用户名
# name=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3").text
# print(name)
#添加屏幕截图
BlogDriver.getScreenShot()
#返回登录页
# self.driver.back()
#测试登陆失败的测试用例
def LoginFailTest(self):
self.Check_ele_Login()
#正确的用户名,错误的密码,然后出现弹窗
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()
self.Clear_and_Alert()
self.Check_ele_Login()
time.sleep(2)
#错误用户名,正确密码
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("lisi2")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
self.Clear_and_Alert()
self.Check_ele_Login()
time.sleep(2)
#错误用户名,错误密码
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("lisi3")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234565")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
self.Clear_and_Alert()
time.sleep(2)
login = BlogLogin()
# login.LoginFailTest()
# login.LoginSucTest()
2.4对于博客首页模块的自动化测试
import time
from selenium.webdriver.common.by import By
from test.BlogLoginTest import login
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 check(self):
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > img")
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > span")
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(4)")
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)")
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)")
def ListTestByLogin(self):
#先检查导航条
self.check()
#截屏
BlogDriver.getScreenShot()
#检查用户昵称
txt2=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3").text
print(txt2)
#检查头像
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.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.nav > a:nth-child(6)").click()
def ListTestByLoginAgain(self):
#检查是否有这个按钮,有则说明注销成功
self.driver.find_element(By.CSS_SELECTOR,"#submit")
#再重新登陆
time.sleep(0.5)
login.LoginSucTest()
#点击查看全文按钮,进行详情页测试,以2025-03-16 22:11这个时间的博客为例
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a").click()
List=BlogList()
2.5对于博客详情页模块的自动化测试
#测试详情页
from common.Utils import BlogDriver
from selenium.webdriver.common.by import By
class BlogDetail:
url = ""
driver = ""
def __init__(self):
self.url="http://8.137.19.140:9090/blog_detail.html?blogId=25591"
self.driver=BlogDriver.driver
self.driver.get(self.url)
def check_row(self):
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > img")
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > span")
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(4)")
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)")
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)")
#检查页面,因为该账号是公用的,因此我们需要测试自己上传的博客以及别人登陆此账号上传的博客#以2025-03-16 22:11这篇为例
def check(self):
BlogDriver.getScreenShot()
# self.check_row()
#对于博客详情页的昵称是否为本人
txt=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3").text
if txt=="lisi":
print("检查其他人登陆此用户博客详情页中昵称正确")
else:
print("检查其他人登陆此用户博客详情页中昵称不正确")
#上面测试的是其他人写的博客,测试完成后返回上一级,找到自己的博客
self.driver.back()
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1535) > a").click()
#进入自己的博客后检查昵称是否是自己
text=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3").text
# assert text=="lisi"
#检查标题,检查时间,检查内容,检查编辑按钮,检查删除按钮
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,"#h2-u5728u8FD9u91CCu5199u4E0Bu4E00u7BC7u535Au5BA2")
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.operating > button:nth-child(1)")
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.operating > button:nth-child(2)")
#返回上一级,然后执行博客编辑页测试
self.driver.back()
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)").click()
BlogDriver.getScreenShot()
Detail=BlogDetail()
2.6对于博客编辑页模块的自动化测试
#编辑页测试
from selenium.webdriver.common.by import By
from common.Utils import BlogDriver
from test.BlogLoginTest import login
class BlogEdit:
driver=""
url=""
def __init__(self):
self.url="http://8.137.19.140:9090/blog_edit.html"
self.driver=BlogDriver.driver
self.driver.get(self.url)
#博客详情页导航条检查
def check_ele(self):
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(4)")
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(5)")
self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)")
#正确发布博客(登陆情况下)
def Suc_Edit(self):
#发布文章按钮
self.driver.find_element(By.CSS_SELECTOR,"#submit")
#标题输入框
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(1537) > div.title").text
assert actual == "自动化测试"
#异常发布博客(登陆状态下)
def Fail_Edit(self):
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
BlogDriver.getScreenShot()
#出现弹窗
alert=self.driver.switch_to.alert
alert.accept()
#异常发布博客(不登录状态下)
def Fail_Edit_notLogin(self):
self.url="http://8.137.19.140:9090/blog_edit.html"
self.driver.get(self.url)
#检查博客编辑页导航条元素
self.check_ele()
#登陆后会显示博客的编辑页,但是提交后会返回登陆页面
self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("博客")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
#未登陆情况下会返回主页,查看主页的提交那妞
self.driver.find_element(By.CSS_SELECTOR,"#submit")
#检查返回主页后,导航条是否正常显示
login.Check_ele_Login()
Edit=BlogEdit()
八、项目Bug简述
1)错误登陆时,弹窗无提示内容
2)博客首页个人信息框与博客详情页中,博客数量统计错误
2)进入博客详情页时,有时候会出现个人信息页与实际不符的情况,且编辑按钮与删除按钮消失
九、测试代码与测试文档链接
博客系统 · 脑斧猴/C++兼容测试 - 码云 - 开源中国