博客系统功能测试

news2025/5/20 14:37:52

博客系统网址:http://8.137.19.140:9090/blog_list.html

主要测试内容

功能测试、界面测试、性能测试、易用性测试、安全测试、兼容性测试、弱网测试、安装卸载测试、压力测试…

测试方法及目的

利用selenium和python编写测试脚本,对博客系统进行的相关功能进行测试,找出该网址的潜在问题

测试思路讲解:本测试项目的规模比较小,仅需要对四个主要页面进行功能测试即可,因此本文直接从页面入手开始编写自动化测试脚本–即一个页面对应一个测试方法,不需要细分出多个功能进行单独测试。另外需要声明,本文使用的测试框架不够成熟,代码冗余繁多,仍有很多有待改进的地方,请各位看官老爷多多指教指教()

博客系统测试案例

功能测试
登录页测试案例
列表页测试案例
详情页测试案例编辑页测试案例

其他测试
其他测试案例

注意:本文仅针对该网页进行功能测试,其他测试(如界面测试、性能测试等)暂不列入测试范围

测试板块 ---- 四大页面

登录页面

登录页面展示
请添加图片描述
前提条件–用户处于登录状态下,且当前打开的是博客详情页的链接。主要测试功能–1.检查页面元素,检查文章标题、发布时间、内容等是否正确展示。2.点击编辑按钮,看是否正常跳转至对应文章的编辑页,若为成功跳转检查按键是否异常,用户的网络是否通畅,并返回对应异常信息等。

博客列表页

博客列表页内容展示
博客列表页
前提条件 – 用户已登陆账号,且已跳转至博客列表页面。主要测试功能–1.检查页面元素,检查用户头像、昵称、文章数、外部链接等信息是否展示错误等。
2.功能测试,点击外部链接,测试是否跳转至对应网站;点击查看全文看是否跳转至对应文章的详情页。

博客详情页

博客详情页展示
在这里插入图片描述前提条件–用户处于登录状态下,且当前打开的是博客详情页的链接。主要测试功能–1.检查页面元素,检查文章标题、发布时间、内容等是否正确展示。2.点击编辑按钮,看是否正常跳转至对应文章的编辑页,若为成功跳转检查按键是否异常,用户的网络是否通畅,并返回对应异常信息等。

编辑页面

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

前提条件,检查用户通过何种方式打开编辑页面,若用户通过右上角写博客方式进入,则标记为发布新博客,若用户通过详情页点击编辑进入编辑页面则标记为修改博客内容。主要测试功能–元素检查,若用户以新发布博客方式进入本页则仅需检查文本框以及图上的相关功能是否能够正常使用即可,若用户以修改内容的方式进入本页则除了上述功能外仍需查看文章标题及内容是否和打开的文章一致。

自动化代码示例

# 创建驱动对象 Utils
from selenium import webdriver

# 在这个文件中配置好通用的信息
class Driver:
    driver = ""
    # 构造函数
    def __init__(self):
        self.driver = webdriver.Chrome()
        # driver = webdriver.Chrome()
        # if driver is None:
        #     raise RuntimeError("无法启动 Chrome WebDriver!")

blogdriver = Driver()
# BlogLogin 测试登录功能
from common.Utils import blogdriver
from selenium.webdriver.common.by import By
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 ElementsCheckUp(self):
        text = self.driver.find_element(By.CSS_SELECTOR,'body > div.container-login > div > h3').text
        print(text)
        text = self.driver.find_element(By.CSS_SELECTOR, 'body > div.container-login > div > div:nth-child(2) > span').text
        print(text)
        text = self.driver.find_element(By.CSS_SELECTOR, 'body > div.container-login > div > div:nth-child(3) > span').text
        print(text)
        text = self.driver.find_element(By.CSS_SELECTOR, '#submit').text
        print(text)

    #成功登录测试
    def LoginSuccess(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()
        time.sleep(5)

        # 检查是否登录成功 -- by用户名
        self.driver.find_element(By.CSS_SELECTOR,'body > div.container > div.left > div > h3')

        # 注销账号恢复初始状态
        self.driver.find_element(By.CSS_SELECTOR,'body > div.nav > a:nth-child(6)').click()

    # 异常登录测试 -- 账号和密码为空
    def LoginFail001(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,'#submit').click()

        # 检查是否登录失败
        time.sleep(3)
        alert = self.driver.switch_to.alert
        assert alert.text == "账号或密码不能为空"

        # 关闭弹窗
        self.driver.switch_to.alert.accept()

    # 异常登录测试 -- 正确账号和错误密码
    def LoginFail002(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('123')

        self.driver.find_element(By.CSS_SELECTOR,'#submit').click()

        # 检查是否登录失败
        time.sleep(3)
        alert = self.driver.switch_to.alert
        assert alert.text == "密码错误"

        # 关闭弹窗
        self.driver.switch_to.alert.accept()

    # 异常登录测试 -- 错误账号和正确密码
    def LoginFail003(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('zhanglisi')
        self.driver.find_element(By.CSS_SELECTOR,'#password').send_keys('123456')

        self.driver.find_element(By.CSS_SELECTOR,'#submit').click()

        # 检查是否登录失败
        time.sleep(3)
        alert = self.driver.switch_to.alert
        assert alert.text == "用户不存在"

        # 关闭弹窗
        self.driver.switch_to.alert.accept()

        # 异常登录测试 -- 错误账号和错误密码
    def LoginFail004(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('zhangsanlisi')
        self.driver.find_element(By.CSS_SELECTOR, '#password').send_keys('123')

        self.driver.find_element(By.CSS_SELECTOR, '#submit').click()

        # 检查是否登录失败
        time.sleep(3)
        alert = self.driver.switch_to.alert
        assert alert.text == "用户不存在"

        # 关闭弹窗
        self.driver.switch_to.alert.accept()
# BlogList 测试博客列表页
from common.Utils import blogdriver
from selenium.webdriver.common.by import By
import time

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 UnLoginTest(self):
        # self.driver.get('http://8.137.19.140:9090/blog_login.html')
        time.sleep(5)
        elmtext:str = self.driver.find_element(By.CSS_SELECTOR, 'div.container-login  h3').text
        print(elmtext)
        assert elmtext == "登陆"

    def ElementCheckUpByLogin(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()
        time.sleep(10)

        # 检查是否登录成功 -- by用户名
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.left h3').text)

        # 获取外部链接
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.left a').text)

        # 获取文章总数
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.left div:nth-child(5) > span:nth-child(1)').text)

        # 获取文章分类
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.left div:nth-child(5) > span:nth-child(2)').text)

        # 获取列表页信息 -- 第一篇文章标题
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > div.title').text)

        # 第一篇文章发布的时间
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > div.date').text)

        # 第一篇文章内容
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > div.desc').text)

        # 查看原文信息
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > a').text)


    def SeeMoreByLogin(self):
        # 检查用户是否在登录状态下
        time.sleep(2)
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.left h3').text)
        # 点击查看全文
        self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > a').click()
        time.sleep(2)

        # 检查是否跳转至详情页
        # print(self.driver.find_element(By.CSS_SELECTOR, 'div.right div.operating > button:nth-child(1)').text)
        # print(self.driver.find_element(By.CSS_SELECTOR, 'div.right div.operating > button:nth-child(2)').text)

        # 返回列表页,继续完成后续测试
        self.driver.back()


    def UpElementByLogin(self):
        # 点击主页

        self.driver.find_element(By.CSS_SELECTOR, 'div.nav > a:nth-child(4)').click()
        # 检查是否跳转至主页 -- 通过昵称和博客列表第一篇的标题
        time.sleep(2)
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.left h3').text)
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > div.title').text)

        time.sleep(2)
        # 点击写博客
        self.driver.find_element(By.CSS_SELECTOR, 'div.nav > a:nth-child(5)').click()
        # 检查是否跳转成功 -- 通过发布博客
        print(self.driver.find_element(By.CSS_SELECTOR, '#submit').get_attribute('value'))
        self.driver.back()

        time.sleep(2)
        self.driver.find_element(By.CSS_SELECTOR,'body > div.nav > a:nth-child(6)').click()

        # 检查是否注销成功
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.container-login h3').text)


# BlogDetail 测试博客详情页
from common.Utils import blogdriver
from selenium.webdriver.common.by import By
import time

class BlogDetail:
    url = ''
    driver = ''

    def __init__(self):
        self.url = "http://8.137.19.140:9090/blog_detail.html?blogId=91386"
        self.driver = blogdriver.driver
        self.driver.get(self.url)

    def UnLoginTest(self):
        # 未登录状态下打开博客详情页 -- 跳转至登录页面 --> 检测是否跳转至登录页
        time.sleep(3)
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.container-login > div > h3').text)

    def ElementCheckUpByLogin(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()
        time.sleep(5)

        # 检查是否登录成功 -- by用户名
        print(self.driver.find_element(By.CSS_SELECTOR, 'body > div.container > div.left > div > h3').text)
        # 打开详情页
        self.driver.find_element(By.CSS_SELECTOR, 'div.right > div:nth-child(1) > a').click()
        time.sleep(2)
        # 检查是否跳转成功
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.right div.operating > button:nth-child(1)').text)
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.right div.operating > button:nth-child(2)').text)

        # 检查文章标题-时间-内容
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div > div.title').text)
        print(self.driver.find_element(By.CSS_SELECTOR, 'div.right > div > div.date').text)
        print(self.driver.find_element(By.CSS_SELECTOR, '#h2-u5728u8FD9u91CCu5199u4E0Bu4E00u7BC7u535Au5BA2').text)


    def FunctionTestByLogin(self):
        time.sleep(3)

        # 检查编辑按钮是否正常
        self.driver.find_element(By.CSS_SELECTOR, 'div.right div.operating > button:nth-child(1)').click()
        time.sleep(2)
        # 检查是否跳转成功
        print(self.driver.find_element(By.CSS_SELECTOR, '#submit').text)


        # 返回博客详情页面界面
        self.driver.back()

        time.sleep(3)
        # self.driver.find_element(By.CSS_SELECTOR, 'div.right > div > div.operating > button:nth-child(2)').click()

from common.Utils import blogdriver
from selenium.webdriver.common.by import By
import time

class BlogEdit:
    url = ''
    driver = ''
    def __init__(self):
        self.url = "http://8.137.19.140:9090/blog_edit.html"
        self.driver = blogdriver.driver
        self.driver.get(self.url)

    def EditTestFromUrl(self):
        time.sleep(5)
        UpText = self.driver.find_element(By.CSS_SELECTOR, '#submit').get_attribute('value')
        if UpText == '发布文章':
            print("当前正在编辑文章,进入方式为使用URL")
            self.driver.find_element(By.CSS_SELECTOR, '#title').send_keys("哈哈哈")

            self.driver.find_element(By.CSS_SELECTOR,
                                     '#submit').click()
        self.driver.quit()

项目Bug

bug描述:文章总数与实际总数不一致
在这里插入图片描述
bug2描述:
用户未登录状态下仍能编辑博客,且点击发布博客后内容丢失,未能正常跳转至登录页登录后发布博客
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2380033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习新浪潮】什么是多模态大模型?

多模态大模型是人工智能领域的前沿技术方向,它融合了多种数据模态(如文本、图像、语音、视频、传感器数据等),并通过大规模参数模型实现跨模态的联合理解与生成。简单来说,这类模型就像人类一样,能同时“看”“听”“读”“说”,并将不同信息关联起来,完成复杂任务。 …

机器学习前言2

1.机器学习 2.机器学习模型 3.模型评价方法 4.如何选择合适的模型 介绍 机器学习(Machine Learning, ML)是人工智能(AI)的核心分支,致力于通过数据和算法让计算机系统自动“学习”并改进性能,而无需显式编…

【成品设计】基于Arduino的自动化农业灌溉系统

《基于STM32的单相瞬时值反馈逆变器》 硬件设计: ESP-C3最小系统板:主控芯片,内部集成wifi。土壤湿度传感器:采集土壤湿度。温度传感器:采集土壤温度。水泵模块:水泵继电器软管。按键3个:参数…

前端页面 JavaScript数据交互

前言:学习JavaScript为前端设置动态效果,实现交互。JavaScript是一种广泛应用于网页开发的脚本语言,它能够使网页变得更加动态和交互性。作为一种客户端脚本语言,JavaScript可以被嵌入到HTML中,并且可以被所有现代的网…

esp32课设记录(三)mqtt通信记录 附mqtt介绍

目录 安装mqttx(云端部署) 安装mosquitto(本地部署) 编程,连接wifi 编程,连接mqtt,实现数据接收 实际效果展示: 附录:mqtt介绍 工作流程简述: 工作流…

string类(详解)

【本节目标】 1. 为什么要学习string类 2. 标准库中的string类 3. string类的模拟实现 4. 扩展阅读 1. 为什么学习string类? 1.1 C语言中的字符串 C 语言中,字符串是以 \0 结尾的一些字符的集合,为了操作方便, C 标准库中提供…

MATLAB | R2025a 更新了哪些有趣的东西?

千呼万唤始出来,MATLAB R2025A 来见面,这次更新比往常晚了两个月,让我们看看更了哪些好玩的新东西叭:首先下载更新启动一气呵成,映入眼帘的是: 1 基本界面 基本界面变得和 MATLAB 网页版一模一样了&#…

前缀和——和为K的子数组

作者感觉本题稍稍有点难度,看了题解也思考了有一会TWT 显然,暴力我们是不可取的,但这里我们可以采取一种新的遍历数组形式,从后向前,也就是以i位置为结尾的所有子数组,这个子数组只统计i位置之前的。 然后…

深入理解 ZAB:ZooKeeper 原子广播协议的工作原理

目录 ZAB 协议:ZooKeeper 如何做到高可用和强一致?🔒ZAB 协议的核心目标 🎯ZAB 协议的关键概念 💡ZAB 协议的运行阶段 🎬阶段一:Leader 选举 (Leader Election) 🗳️阶段二&#xff…

GraphPad Prism项目的管理

《2025新书现货 GraphPad Prism图表可视化与统计数据分析(视频教学版)雍杨 康巧昆 清华大学出版社教材书籍 9787302686460 GraphPadPrism图表可视化 无规格》【摘要 书评 试读】- 京东图书 GraphPad Prism统计数据分析_夏天又到了的博客-CSDN博客 项目…

驱动-Linux定时-timer_list

了解内核定时相关基础知识 文章目录 简要介绍timer_list 特点API 函数实验测试程序 - timer_mod.c编译文件-Makefile实验验证 注意事项总结 简要介绍 硬件为内核提供了一个系统定时器来计算流逝的时间(即基于未来时间点的计时方式, 以当前时刻为计时开始…

STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调

导言 如上所示,STM32F103有两个基本定时器TIM6与TIM7,所谓「基本定时器」,即功能最简单的定时器。 项目地址: github: LL库: https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library22_Basic_Timer寄存器方…

5个yyds的.Net商城开源项目

今天一起来盘点下5个商城开源项目。 1、支持多语言、多商店的商城,.Net7 EF7领域驱动设计架构(Smartstore) 项目简介 Smartstore 支持桌面和移动平台、多语言、多商店、多货币的商城,并支持SEO优化,支持无限数量的…

[项目深挖]仿muduo库的并发服务器的解析与优化方案

标题:[项目深挖]仿muduo库的并发服务器的优化方案 水墨不写bug 文章目录 一、buffer 模块(1)线性缓冲区直接扩容---->环形缓冲区定时扩容(只会扩容一次)(2)使用双缓冲(Double Buf…

国标GB28181视频平台EasyGBS校园监控方案:多场景应用筑牢安全防线,提升管理效能

一、方案背景​ 随着校园规模不断扩大,传统监控系统因设备协议不兼容、数据分散管理,导致各系统之间相互独立、数据无法互通共享。在校园安全防范、教学管理以及应急响应过程中,这种割裂状态严重影响工作效率。国标GB28181软件EasyGBS视频云…

SHIMADZU岛津 R300RC300 Operation Manual

SHIMADZU岛津 R300RC300 Operation Manual

使用 Docker 部署 React + Nginx 应用教程

目录 1. 创建react项目结构2. 创建 .dockerignore3. 创建 Dockerfile4. 创建 nginx.conf5. 构建和运行6. 常用命令 1. 创建react项目结构 2. 创建 .dockerignore # 依赖目录 node_modules npm-debug.log# 构建输出 dist build# 开发环境文件 .git .gitignore .env .env.local …

API Gateway REST API 集成 S3 服务自定义 404 页面

需求分析 使用 API Gateway REST API 可以直接使用 S3 作为后端集成对外提供可以访问的 API. 而当访问的 URL 中存在无效的桶, 或者不存在的对象时, API Gateway 默认回向客户端返回 200 状态码. 而实际上这并不是正确的响应, 本文将介绍如何自定义返回 404 错误页面. 基本功…

关于systemverilog中在task中使用force语句的注意事项

先看下面的代码 module top(data);logic clk; inout data; logic temp; logic sampale_data; logic [7:0] data_rec;task send_data(input [7:0] da);begin(posedge clk);#1;force datada[7];$display(data);(posedge clk);#1;force datada[6]; $display(data); (posed…

Python Day26 学习

继续NumPy的学习 数组的索引 一维数组的索引 创建及输出 arr1d np.arange(10) # 数组: [0 1 2 3 4 5 6 7 8 9] arr1d array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 取出数组的第一个元素,最后一个元素 代码实现 arr1d[0] arr1d[-1] 取出数组中索引为3&#x…