当前位置: 首页 > news >正文

个人博客系统测试文档

文章目录

  • 1.项目的测试背景
  • 2.测试的平台及环境
    • 2.1 浏览器版本
    • 2.2 自动化测试环境
    • 2.3 项目测试代码链接
  • 3.手动对项目功能进行Web的基本功能测试
    • 3.1 设计测试用例
    • 3.2 登录页面测试
    • 3.3 博客列表页面测试
    • 3.4 博客详情页面测试
    • 3.5 博客编辑页面测试
    • 3.6 博客删除测试
    • 3.7 用户注销
  • 4.使用Selenium工具进行自动化测试
    • 4.1 新建项目
    • 4.2 创建对应的文件
    • 4.3 创建python软件包
    • 4.4 创建驱动对象以及屏幕截图
    • 4.5 Runtest.py
    • 4.6 BlogLoginTest.py
    • 4.7 BlogDetailTest.py
    • 4.8 BlogDetailTest.py
    • 4.9 BlogEditTest.py
    • 4.10 BlogUserLogoutTest.py
  • 5.测试总结
    • 5.1 相比手动测试自动化测试的特点和优点
    • 5.2 bug描述
      • Bug 1:发布文章后数据未更新
      • Bug 2:编辑页无法选择文章分类
      • Bug 3:发布校验提示信息不明确
      • Bug 4:编辑页内容意外丢失
    • 5.3 总结


1.项目的测试背景

个人的博客系统是在SSM框架的基础上实现的,该个人博客系统由五个页面构成,分别为:登录页面,博客列表页面,博客详情页面,博客编辑页面以及博客发布页。

本次测试目的是为了验证个人博客系统的功能是否正常。现在对博客系统进行手动和自动化测试,以便用户使用博客系统进行登录,项目的具体测试内容为:博客系统的登录、博客列表页和博客详情页还有博客编辑页的页面呈现和功能、写博客、发布博客、删除博客、用户注销的功能是否正常。该个人博客系统可以实现发布个人博客,记录博客发布的日期、时间、标题以及博客发布者等信息。

2.测试的平台及环境

2.1 浏览器版本

浏览器:Edge浏览器

版本:138.0.3351.121

2.2 自动化测试环境

工具pycharm社区版:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

python解释器:python 3.13

驱动: msedgedriver

selenium: 4.0.0

webdriver-manager: 4.0.1

2.3 项目测试代码链接

https://gitee.com/yunshan-ruo/personal-blog-system-testing

3.手动对项目功能进行Web的基本功能测试

3.1 设计测试用例

通常设计测试用例从6个方面进行设计:功能测试,界面测试,性能测试,易用性测试,安全测试,兼容性测试等6个方面,除此之外还会涉及弱网测试等常规测试方面

该项目为个人博客系统,主要测试为界面测试,对界面的功能进行主要测试,其中涉及到的页面有博客登录页,博客列表页,博客详情页,博客编辑页。

个人博客系统自动化测试用例
在这里插入图片描述

3.2 登录页面测试

因为账号和密码都已经储存在数据库,只要对应的输入框输入正确的账号和密码就可以跳转到博客主页,也就是博客列表页。

1️⃣登录页面展示

在这里插入图片描述

2️⃣在对应的输入框输入正确的账号和密码:(账号:zhangsan 密码:123456)

在这里插入图片描述

预期效果:跳转至博客列表页

实际效果展示:

在这里插入图片描述

3️⃣在对应的输入框输入正确的账号和错误的密码:(账号:zhangsan 密码:123456789)

在这里插入图片描述

预期结果:出现警告弹窗提示密码错误

实际结果展示:

在这里插入图片描述

4️⃣在对应的输入框输入错误的账号和正确的密码:(账号:666 密码:123456)

在这里插入图片描述

预期结果:出现警告弹窗提示用户不存在

实际结果展示:

在这里插入图片描述

5️⃣在对应的输入框输入错误的账号和错误的密码(账号:6662@! 密码:123456789)

在这里插入图片描述

预期结果:出现警告弹窗提示用户不存在

实际结果展示:

在这里插入图片描述

6️⃣在对应的输入框输入账号为空或者密码为空的情况(账号:空 密码:空)

在这里插入图片描述

预期结果:出现警告弹窗提示账号或密码不能为空

实际结果展示:
在这里插入图片描述

3.3 博客列表页面测试

在登录页面对应的输入框输入正确的账号和密码后,会跳转到博客列表页面。

在博客列表页面可以看到,左边是当前登录的用户昵称和发布文章数量还有分类,列表区可以看到已发布博客文章信息(包括标题、时间、博客内容)等信息,右上角还有主页按钮,写博客按钮,以及注销按钮。

1️⃣列表页展示:(如果已经发布了博客发布文章的数量不为0)
在这里插入图片描述

2️⃣点击查看全文按钮,进入博客详情页

预期结果:是自己发布的博客,可以看到博客标题,发布日期,博客内容以及有编辑删除按钮,是他人发布的博客则没有编辑,删除按钮

实际效果:

自己博客:
在这里插入图片描述

他人博客:
在这里插入图片描述

3️⃣点击主页按钮,进入博客列表页

当前页面:

在这里插入图片描述

预期效果:跳转回博客列表页

实际效果:
在这里插入图片描述

4️⃣点击写博客按钮,进入博客编辑页

当前页面
在这里插入图片描述

预期效果:跳转至博客编辑页

实际效果:

在这里插入图片描述

5️⃣点击注销按钮,返回登录页面​

当前页面

在这里插入图片描述

预期效果:跳转至登录页面

实际效果:

在这里插入图片描述

6️⃣直接输入网址,在未登录状态下进入博客列表页

预期效果:跳转至登录页面

实际效果:

在这里插入图片描述

3.4 博客详情页面测试

通过点击博客列表页面中的查看全文按钮可以进入博客详情页面,博客详情页里面有当前登录用户的昵称,和发布文章的数量和分类的数量,可以看到已经发布的博客文章的标题,发布博客的时间,和博客的内容。

如果查看的是他人的博客文章,则只能看到博客文章的标题,发布博客的时间,和博客的内容。

如果是自己发布的博客文章,则会出现博客文章的标题,发布博客的时间,和博客的内容,“编辑”按钮和“删除”按钮。

1️⃣查看自己的博客(当前用户:zhangsan 查看zhangsan用户的博客)

预期效果:显示对应用户的昵称和发布文章的数量和分类的数量,出现博客文章的标题,发布博客的时间,和博客的内容以及“编辑”按钮和“删除”按钮。

实际效果:
在这里插入图片描述

2️⃣查看他人的博客(当前用户:zhangsan 查看lisi用户的博客)

预期效果:显示对应用户的昵称和发布文章的数量和分类的数量,出现博客文章的标题,发布博客的时间,和博客的内容。

实际效果:

在这里插入图片描述

3️⃣未登录状态下,直接进入博客详情页面

预期效果:跳转至登录页面

实际效果:

在这里插入图片描述

3.5 博客编辑页面测试

在博客列表页右上角点击”写博客“按钮,即可进入博客编辑页面,此时可以进行新博客的写入操作。

用户登录成功后会跳转到博客列表,点击右上角写博客,就会跳转到博客编辑页面

预期效果:博客编辑页面有(输入博客标题框,文本工具区,博客内容输入区,发布文章按钮)

页面展示:
在这里插入图片描述

1️⃣从博客列表页和博客详情页进入博客编辑页

预期效果:直接进入博客编辑页

实际效果:

在这里插入图片描述

2️⃣页面元素检查​(博客标题输入框、博客内容输入区域、点击发布按钮)

在这里插入图片描述

3️⃣输入标题和内容,正常发布博客(标题:测试1 内容:11111)

预期效果:发布博客后进入博客列表页,正常显示博客内容

实际效果:

在这里插入图片描述

4️⃣更新自己已有的博客(标题修改为:测试2 内容:222222)
当前博客:
在这里插入图片描述

预期效果:标题内容修改为测试2,博客内容变为222222

实际效果:
在这里插入图片描述

5️⃣不写标题或者不写内容,异常发布博客

不写标题:

在这里插入图片描述

不写内容:

在这里插入图片描述

预期效果:出现警告弹窗

实际效果:

在这里插入图片描述

在这里插入图片描述

6️⃣未登录状态下,进入博客编辑页,正常使用功能

在这里插入图片描述

预期效果:点击发布按钮后,自动跳转回登录页面

实际效果:
在这里插入图片描述

7️⃣登录状态下:正常测试主页按钮,写博客按钮,注销按钮

预期效果:跳转至博客列表页,博客编辑页,以及返回登录页面

实际效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里插入图片描述

在这里插入图片描述

8️⃣未登录状态下:正常测试主页按钮,写博客按钮,注销按钮

预期效果:跳转至登录页面,刷新博客编辑页,跳转至登录页面

实际效果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里插入图片描述

在这里插入图片描述

3.6 博客删除测试

在博客列表页点击任意一篇发布的文章查看全文按钮,就可以进去到该篇博客的详情页,然后点击博客详情页里面的删除按钮,页面就会跳转到博客列表页,并且该博客会被删除,博客数量-1

1️⃣登录状态下删除博客

在这里插入图片描述

预期效果:出现警告弹窗,确认后博客列表面不再显示该博客

实际效果:

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2️⃣未登录状态下删除博客

预期效果:返回登录页面

在这里插入图片描述

3.7 用户注销

分别在博客列表页,博客详情页面,博客编辑页面,点击”退出“按钮之后,会跳转到博客登录界面,此时界面中的账号和密码输入框中的数据被清空,可以正常登录。

预期效果:从三个页面分别跳转回登录页面

实际效果:

在这里插入图片描述

4.使用Selenium工具进行自动化测试

1.selenium库:selenium是⼀个web自动化测试⼯具,selenium中提供了丰富的方法供给使用者进行web自动化测试

2.webdriver-manager驱动:若通过安装驱动的方式来启动浏览器,每次浏览器更新后对应的驱动也需要更新,为了解决这个问题,selenium中提供了驱动管理工具。在这个测试过程中,我手动下载了驱动,所以在实际的自动化测试中,我直接导入驱动路径即可。

4.1 新建项目

1️⃣打开pycharm社区版,选择新建项目,项目命名为BlogSysTest,选择对应路径和python解释器

在这里插入图片描述

在这里插入图片描述

4.2 创建对应的文件

我的文件创建思路如下:

在这里插入图片描述

为什么单独创建一个common包?

首先,我们有几个页面分别是:博客登录页,博客列表页,博客详情页,博客编辑页,我们对这几个页面都要去创建驱动对象,通过驱动对象去get页面的URL去访问。

因此,我们在实际编写代码过程中,就会出现这些部分的代码都是相同的,使用相同的代码有多次创建消耗性能的情况。这时候我们就可以把相同的部分提取出来放到一个python包里面,所以就有了一个想法把创建驱动对象访问放到一个命名为common的python包,把测试不同页面的文件放到一个命名为test的python包。

创建包的方式也很简单

4.3 创建python软件包

右键我们的项目,在新建一栏中选择python软件包

在这里插入图片描述

命名完之后我们就可以看到对应的软件包common和test了。

在这里插入图片描述

在里面继续创建我们的文件

在这里插入图片描述

如图所示

在这里插入图片描述

4.4 创建驱动对象以及屏幕截图

现在开始创建驱动对象了。

首先在common包里面的Utils.py文件里面创建一个Driver类,在类里面定义一个驱动对象成员,和两个函数,分别是对对象成员初始化的构造函数,和运行时截图的函数(为什么需要创建截图函数是为了在报错的时候查看问题更加方便)。

#创建类
class Driver:# 驱动路径path = "..\\msedgedriver.exe"driver = ""def __init__(self):options = webdriver.EdgeOptions()self.driver = webdriver.Edge(service=Service(self.path),options=options)def SaveScreenCut(self,name):"""用于保存屏幕截图:return:"""#文件路径位于该images目录下#该目录下会创建对应类的文件夹,然后按时间进行分类#命名规则:调用方法+时间# 类名称dirname = name#确认文件夹是否存在,不存在则创建该文件夹if not os.path.exists("../images/"+dirname):os.mkdir("../images/"+dirname)#有分类文件夹后,再根据时间做出管理#例如:确认时间是2025-08-06-17-24-36#文件具体命名为:调用方法+20250806172436dirname2=datetime.datetime.now().strftime("%Y-%m-%d")#确认文件夹是否存在,不存在则创建该文件夹if not os.path.exists("../images/"+dirname+"/"+dirname2):os.mkdir("../images/"+dirname+"/"+dirname2)#创建文件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+"/"+dirname2+"/"+filename)

创建驱动对象的时候,我们先建立两个成员变量用来存放我们的驱动路径path和driver对象,在构造函数__init__中对其进行初始化。其次就我们的屏幕截图函数,这里用到了一个sys库中的函数,用来获取当前调用方法的名字。

最后在末尾可以使用单例模式

BlogDriver = Driver()

使用Driver类创建一个类驱动对象,其他函数想要使用这个驱动对象,就得使用BlogDriver调用里面的驱动成员driver。

4.5 Runtest.py

驱动对象和截图函数创建好后,为了方便我们之后的测试,我们再创建一个Runtest文件,用来测试不同功能测试文件里面的测试函数(主函数的入口)

如图所示:

在这里插入图片描述

main函数可以作为我们主程序的主入口,剩下的我们就可以调用对应类的成员。

4.6 BlogLoginTest.py

我们写自动化测试,要根据我们的需求文档和测试用例来一步步进行编写我们的自动化代码,回顾我们之前写的测试用例。

在这里插入图片描述

我们可以发现主要分为用户登录成功和登录失败两种情况,故我们创建两个函数即可。

在这里插入图片描述

我们主要的函数是BlogSucLogin和BlogFailLogin,步骤如下所示:

  1. 导入必要的模块(selenium相关、common.Utils中的BlogDriver)。

  2. 定义BlogLogin类,在__init__方法中初始化url和driver,并打开登录页面。

  3. 定义BlogSucTest方法,用于测试成功登录,通过确认是否存在用户信息等来判断是否登录成功。

  4. 定义BlogFailTest方法,用于测试登录失败的各种情况,通过弹窗处理函数Popupwaiting可以很快处理好测试用例上的弹窗警告。

    def BlogSucLogin(self):"""用于测试登录页面用户成功登录:return:"""print("----测试用户成功登录----")user="zhangsan"password="123456"# 输入正确的账号和密码(输入前先清空输入框)self.TestCase(user, password)#判断用户是否登录成功#添加隐式等待self.driver.implicitly_wait(5)name = self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > h3").text#对name进行断言assert nameessay = self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.left > div > div:nth-child(5) > span:nth-child(1)").texttext=self.driver.titleprint("登录成功\n当前用户:{}-pwd:{}\n文章数量:{}\n当前页面为:{}".format(user, password,essay,text))print("----测试结束----\n")#添加屏幕截图BlogDriver.SaveScreenCut(name=type(self).__name__)def BlogFailLogin(self):"""用于测试登录页面用户登录失败:return:"""print("----测试用户登录失败----")#输入正确的账号和错误的密码print("测试用例1:输入正确的账号和错误的密码  账号:zhangsan 	密码:123456789")self.TestCase(user="zhangsan", password="123456789")self.Popupwaiting()print("测试用例1:账号:zhangsan 	密码:123")self.TestCase(user="zhangsan", password="123")self.Popupwaiting()print("测试用例2:输入输入错误的账号和正确的密码  账号:666 	密码:123456")self.TestCase(user="666",password="123456")#添加弹窗等待self.Popupwaiting()print("测试用例2:账号:1@~ 	密码:123456")self.TestCase(user="1@~ ", password="123456")self.Popupwaiting()#输入错误的账号和错误的密码print("测试用例3:输入错误的账号和错误的密码  账号:6662@!	密码:123456789")self.TestCase(user="6662@!", password="123456789")self.Popupwaiting()#输入账号为空或者密码为空的情况print("测试用例4:输入账号为空或者密码为空的情况  账号:zhangsan	密码:空")self.TestCase(user="zhangsan", password="")self.Popupwaiting()print("测试用例4:账号:空	密码:123456")self.TestCase(user="", password="123456")self.Popupwaiting()print("测试用例4:账号:空	密码:空")self.TestCase(user="", password="")self.Popupwaiting()print("----测试结束----\n")

测试完后可以在终端上看到各种情况:

在这里插入图片描述

截图函数也成功保存了对应的截图:

在这里插入图片描述

4.7 BlogDetailTest.py

回顾我们博客详情页的测试,这里也分为登录状态下和未登录状态下,如果我们刚刚成功登录了,就可以看到个人信息和博客列表,如果我们是没登录的状态下,直接访问我们的博客详情页,最后会返回登录页面。

在这里插入图片描述

回顾之前的博客列表页,我们要通过检查个人信息和博客内容,以及右上角的按钮来完成我们此次的测试。

在这里插入图片描述

class BlogList:"""用于测试博客列表页:return:"""def __init__(self):# 博客登录页面urlself.url = "http://8.137.19.140:9090/blog_list.html"self.driver = BlogDriver.driverself.driver.get(self.url)def ListTestByLogin(self):"""测试博客列表页是否正常获取博客标题、博客内容等:return:"""print("----测试博客列表页是否显示正常---")#获取第一篇博客标题、时间、内容title = self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title").texttime = self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.date").textdescribe = self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.desc").text# 添加屏幕截图BlogDriver.SaveScreenCut(name=type(self).__name__)print("博客标题:{},时间:{},内容:{}".format(title,time,describe))# 测试"查看全文按钮"是否正常self.driver.find_element(By.CSS_SELECTOR, "body > div.container > div.right > div:nth-child(1) > a").click()#添加隐式等待,等待页面加载完成self.driver.implicitly_wait(5)#判断是否正确加载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.SaveScreenCut(name=type(self).__name__)print("查看全文按钮正常")print("----测试结束----\n")def ButtonTest(self):"""用于测试登录右上角的按钮跳转是否正常:return:"""print("----测试博客列表页按钮功能跳转是否正常----")# 测试主页按钮是否正常跳转self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(4)").click()#添加显示等待WebDriverWait(self.driver, 20).until(EC.title_is("博客列表页"))# 添加屏幕截图BlogDriver.SaveScreenCut(name=type(self).__name__)print("主页按钮功能正常,当前页面:"+"博客列表页")#测试写博客按钮是否跳转正常self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(5)").click()#添加显示等待WebDriverWait(self.driver, 20).until(EC.title_is("博客编辑页"))title = self.driver.titleassert title == "博客编辑页"print("写博客按钮功能正常,当前页面:",title)# 添加屏幕截图time.sleep(3)BlogDriver.SaveScreenCut(name=type(self).__name__)print("----测试结束----\n")def ListTestByNotlogged(self):"""用于测试未登录状态下,进入博客列表页:return:"""print("----测试未登录状态下,进入博客列表页----")#先注销后打开网址self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()self.driver.get("http://8.137.19.140:9090/blog_list.html")#添加显示等待WebDriverWait(self.driver, 20).until(EC.title_is("博客登陆页"))title = self.driver.titleprint("当前返回页面:"+title)# 添加屏幕截图BlogDriver.SaveScreenCut(name=type(self).__name__)print("----测试结束----\n")
  1. **定义BlogList类,初始化博客列表页的URL **

  2. 测试列表页内容显示 (ListTestByLogin)

  3. 测试按钮跳转功能 (ButtonTest)

  4. 测试未登录状态访问 (ListTestByNotlogged)

    运行后的效果如图:

在这里插入图片描述

我们的截图也是成功保存了。

在这里插入图片描述

4.8 BlogDetailTest.py

因为进入详情页的时候,我们只需要关注本身是否加载正常即可,例如当我查看第一篇博客,博客标题,博客内容是否正常显示。
在这里插入图片描述

  1. 导入必要的模块(selenium相关、common.Utils中的BlogDriver)。

  2. 定义BlogDetail类,在__init__方法中初始化url和driver,并打开博客详情页面。

  3. 定义BlogDetailTestByLogin 方法,验证在登录状态下,博客详情页的各个关键元素(标题、日期、内容)是否正常显示。

  4. 定义DetailTestByNotlogged 方法,验证在未登录状态下,尝试访问博客详情页时,是否被重定向到博客登录页。

    def DetailTestByLogin(self):"""测试博客详情页:return:"""print("----测试博客详情页是否显示正常---")#检查标题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")#添加显示等待WebDriverWait(self.driver, 20).until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,"body > div.container > div.left > div > div:nth-child(4) > span:nth-child(1)"),"文章"))# 添加屏幕截图BlogDriver.SaveScreenCut(name=type(self).__name__)title = self.driver.titleprint("显示正常,当前页面:",title)print("----测试结束----\n")def DetailTestByNotlogged(self):"""测试未登录状态下进入博客详情页:return:"""print("----测试未登录状态下,进入博客详情页----")#先注销后打开网址self.driver.find_element(By.CSS_SELECTOR,"body > div.nav > a:nth-child(6)").click()self.driver.get("http://8.137.19.140:9090/blog_detail.html?blogId=139868")#添加显示等待WebDriverWait(self.driver, 20).until(EC.title_is("博客登陆页"))title = self.driver.titleprint("当前返回页面:"+title)# 添加屏幕截图BlogDriver.SaveScreenCut(name=type(self).__name__)print("----测试结束----\n")

这里我们也是运行代码,截图也是成功保存了。

在这里插入图片描述

4.9 BlogEditTest.py

回顾测试用例,这部分的测试就相对而言要多一些,因为我们不仅要测试发布博客,还要测试删除博客,更新已有博客是否成功。

在这里插入图片描述

根据我们的测试用例,我们这里设计自动化脚本只需要设计四个方面,一个是正常发布博客,一个是删除博客,还有一个是未登录状态下进入博客编辑页,以及更新已有博客。

逻辑上来说,我们这里创建四个成员函数即可。

在这里插入图片描述

    def EditTestByBlogPublish(self):"""测试发布博客:return:"""print("----测试发布博客----")#输入标题self.driver.find_element(By.CSS_SELECTOR,"#title").clear()self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("自动化测试-发布博客")#编辑区域默认不为空,暂不处理#点击发布按钮self.driver.find_element(By.CSS_SELECTOR, "#submit").click()#假设刚才发布的文章是第1篇#添加显示等待WebDriverWait(self.driver, 5).until(EC.title_is("博客列表页"))#检查刚才的博客是否发布成功title=self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title").textassert title=="自动化测试-发布博客"print("发布成功")#添加显示等待,等待查看全文按钮加载完成WebDriverWait(self.driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a")))#添加屏幕截图BlogDriver.SaveScreenCut(name=type(self).__name__)print("----测试结束----\n")

我这里就放发布博客的代码了,可以看到截图函数验证出来的效果如图

在这里插入图片描述

终端上的显示:

请添加图片描述

运行代码后可以发现我们的截图也是正常保存的

在这里插入图片描述

4.10 BlogUserLogoutTest.py

这部分测试就比较简单了,我们只需要打开三个页面,点击注销即可,在我们每次注销完后,都需要确定自己登录成功了。

class BlogUserLogout:url=""driver=""def __init__(self):self.url=""self.driver=BlogDriver.driverdef BlogLogoutTest(self,url):"""博客列表页注销功能:return:"""self.driver.get(url)self.driver.find_element(By.CSS_SELECTOR, "body > div.nav > a:nth-child(6)").click()# 判断一下退出后的页面url和页面的标题Quittitle = self.driver.titleQuitUrl = self.driver.current_urlprint(Quittitle)print(QuitUrl)assert Quittitle == "博客登陆页"assert QuitUrl == "http://8.137.19.140:9090/blog_login.html"# 判断一下账号输入框和密码输入框的内容是否为空Quitusername = self.driver.find_element(By.CSS_SELECTOR, "#username").textQuitpassword = self.driver.find_element(By.CSS_SELECTOR, "#password").textprint("Quitusername" + Quitusername)print("Quitpassword" + Quitpassword)assert Quitusername == ""  # 判断一下用户名输入框清空没有assert Quitpassword == ""  # 判断一下密码输入框清空没有def Login(self):user = "zhangsan"password = "123456"# 输入正确的账号和密码(输入前先清空输入框)BlogLogin().TestCase(user, password)

这里我们就不需要使用截图函数啦,我们确保功能正常使用即可,在RunTest中的显示如下所示:

    """用户注销"""#博客列表页BlogUserLogout().BlogLogoutTest("http://8.137.19.140:9090/blog_list.html")#重新登录BlogUserLogout().Login()#博客详情页BlogUserLogout().BlogLogoutTest("http://8.137.19.140:9090/blog_detail.html?blogId=141161")#重新登录BlogUserLogout().Login()#博客编辑页BlogUserLogout().BlogLogoutTest("http://8.137.19.140:9090/blog_edit.html")

5.测试总结

5.1 相比手动测试自动化测试的特点和优点

手工测试用例特点:

  1. 较好的异常处理能力,能通过人为的逻辑判断校验当前步骤的功能是否正确实现。

  2. 人工执行用例具有一定的步骤跳跃性。

  3. 人工测试步步跟踪,能够细致地定位问题。

  4. 主要用来发现功能缺陷。

自动化测试用例特点

  1. 执行对象是脚本,任何一个判断都需要编码定义。

  2. 用例步骤之间关联性强。

  3. 主要用来保证产品主体功能正确和完整,让测试人员从繁琐重复的工作中解脱出来。

5.2 bug描述

Bug 1:发布文章后数据未更新

问题描述:用户发布新文章后,系统未实时更新以下数据:

  • 博客首页的「文章总数」统计未增加
  • 对应「文章分类」下的数量未变化

预期结果
发布文章后,相关统计数据(文章总数、分类文章数)应立即刷新,新文章需在分类列表中可见。


Bug 2:编辑页无法选择文章分类

问题描述:在博客编辑页面(发布/修改文章时)

  • 用户无法为文章分配任何分类

预期结果
应正常展示可用分类列表,支持用户选择至少一个分类。


Bug 3:发布校验提示信息不明确

问题描述:当用户提交文章失败时

  • 系统弹窗仅提示“发布异常”,但未明确具体原因
  • 无法区分是「标题为空」「内容为空」还是其他校验失败

预期结果
弹窗应明确提示失败原因,例如:

  • “标题不能为空”
  • “文章内容不能为空”
  • 其他具体校验错误信息

Bug 4:编辑页内容意外丢失

问题描述:在登录状态下操作博客编辑页

  • 用户点击页面内非提交按钮的区域(如导航栏、空白处)
  • 页面自动刷新,导致已填写的「标题/内容」被清空
  • 无任何保存草稿或确认离开的提示

预期结果
用户主动刷新或跳转前,系统应:

  1. 拦截意外跳转/刷新操作
  2. 弹出提示框(如“内容未保存,确认离开吗?”)
  3. 提供「保存草稿」的应急选项

5.3 总结

本次测试针对个人博客系统进行了全面的功能测试,覆盖了登录、博客列表展示、博客详情查看、博客编辑(包括发布、修改、删除)和用户注销等核心功能。

测试工作包括详细的手动测试和基于Selenium的自动化测试。测试过程中共发现4个主要Bug(详见5.2节),这些Bug涉及数据更新、分类选择、错误提示和内容丢失等方面,影响了用户体验和系统功能的完整性。

自动化测试覆盖了主要功能模块,编写了登录、博客列表、博客详情、博客编辑和用户注销等测试脚本,通过截图和日志记录了测试结果,提高了测试效率。

测试周期:3天

http://www.dtcms.com/a/332419.html

相关文章:

  • Python复杂元素排序:从基础到高阶
  • 以太网转换器实现:S7-300通过MPI转以太网连接多类工业设备
  • Java锁机制深度解析:从synchronized到StampedLock
  • Linux网络基础(一)
  • 嵌入式开发学习———Linux环境下网络编程学习(二)
  • 开始回溯的学习
  • OpenSCA开源社区每日安全漏洞及投毒情报资讯|14th Aug. , 2025
  • hex文件结构速查
  • Flutter 以模块化方案 适配 HarmonyOS 的实现方法
  • 3分钟解锁网页“硬盘“能力:离线运行VSCode的新一代Web存储技术
  • 二叉树(1):二叉树的前、中、后和层次遍历
  • 《R for Data Science (2e)》免费中文翻译 (第4章) --- Workflow: code style
  • STM32L051 RTC闹钟配置详解
  • Elasticsearch:使用 Gradio 来创建一个简单的 RAG 应用界面
  • 敏捷数据开发实践:基于 Amazon Q Developer + Remote MCP 构建本地与云端 Amazon Redshift 交互体系
  • 软件重构的破与立:模式方法创新设计与工程实践
  • 【Vibe Coding 工程之 StockAnalyzerPro 记录】- EP1.先写 PRD
  • 集成电路学习:什么是Object Detection目标检测
  • 【算法专题训练】13、回文字符串
  • 另类的pdb恢复方式
  • 逆向练习(六)Andrénalin.3/4
  • Linux应用软件编程---多任务(进程2)(资源回收函数(wait、waitpid)、exec函数族、linux下的命令、const四种位置表示的含义)
  • 一周学会Matplotlib3 Python 数据可视化-绘制树形图
  • Laravel 中解决分表问题
  • ESP32-C3_SMARTCAR
  • 高并发场景下限流算法对比与实践指南
  • 【unity实战】Unity游戏开发:如何用ScriptableObject与序列化多态实现可复用的模块化效果系统?
  • ABP vNext+ WebRTC DataChannel 低延迟传感推送
  • 物联网(IoT)系统中,通信协议如何选择
  • C++——分布式