论坛系统的测试
项目背景
论坛系统采用前后端分离的方式来实现,同时使用数据库 来处理相关的数据,同时将其部署到服务器上。前端主要有7个页面组成:登录页,列表页,论坛详情页,编辑页,个人信息页,我的帖子页,站内信页,使用以上页面实现了一个简单的论坛系统。其结合后端实现了以下的主要功能:登录,编辑帖子,退出登录,删除帖子,发送信息,修改头像,个人信息等功能。
项目功能
该论坛系统主要实现了以下几个功能:登录,注销,发布帖子,删除帖子,发送站内信等功能。
- 登录功能:如果没有账号密码,先进行注册,填写用户名,昵称,密码以及确认密码,点击注册之后,后端会先对密码进行加密,然后将数据写入到数据库中,注册成功之后跳转到登陆页面进行登录。登录会填写账号密码,点击登录对密码进行加密,然后与数据库中存的密码进行对比,若相同则登录成功,反之登录失败。
- 主页页面:主页有导航栏,导航栏代表不同的帖子类型,可以在主页的首页查看所有的帖子,点击帖子类型,可以只展示该类型的帖子。点击帖子也可以查看帖子的详细信息。在主页右上角可以通过关键字来查询对应的帖子,也可以访问'个人中心'和'我的帖子'以及退出登录。
- 详情页面:这个页面中会显示出来帖子的标题,发布时间,浏览帖子总数,点赞数,以及留言数,并且你也可以对这篇帖子进行点赞和留言。如果访问的帖子是自己发布的帖子,还会有编辑和删除两个按钮。也可以点击其他用户的名字,可以访问其他用户的空间。
- 用户全部帖子页面:点击'我的帖子',会把当前用户所发布的帖子全部展示出来,右侧有个人介绍,类似于QQ空间,点击其他用户,可以访问其他用户的空间,也可以给其他用户留言。
- 站内信页面:点击发送信息之类的按钮,会弹出来一个模态框,输入文字之后可以将信息发送给其他用户。
测试计划
功能测试
测试用例

实际执行测试的部分操作步骤/截图
注册

登录

发布帖子在主页中查看

用户详情

发送私信

接收私信

自动化测试
注册
package com.haifan.forum.test;import com.haifan.forum.utils.AutoTestUtils;
import org.openqa.selenium.By;public class ForumRegisterTest extends AutoTestUtils{public ForumRegisterTest(String url) {super(url);}// 正常注册public void registerSuccess() {driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("delaiwen");driver.findElement(By.xpath("//*[@id=\"nickname\"]")).sendKeys("delaiwen");driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123456");driver.findElement(By.xpath("//*[@id=\"passwordRepeat\"]")).sendKeys("123456");driver.findElement(By.xpath("//*[@id=\"policy\"]")).click();driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();getScreenShot(getClass().getName());driver.quit();}public void registerUsernameNull() {driver.findElement(By.xpath("//*[@id=\"nickname\"]")).sendKeys("delaiwen");driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123456");driver.findElement(By.xpath("//*[@id=\"passwordRepeat\"]")).sendKeys("123456");driver.findElement(By.xpath("//*[@id=\"policy\"]")).click();driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();getScreenShot(getClass().getName());driver.quit();}public void registerPasswordNull() {driver.findElement(By.xpath("//*[@id=\"nickname\"]")).sendKeys("delaiwen");driver.findElement(By.xpath("//*[@id=\"policy\"]")).click();driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();getScreenShot(getClass().getName());driver.quit();}public void registerAllNull() {driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();getScreenShot(getClass().getName());driver.quit();}
}

登录
package com.haifan.forum.test;import com.haifan.forum.utils.AutoTestUtils;
import org.checkerframework.checker.units.qual.A;
import org.openqa.selenium.By;public class ForumLoginTest extends AutoTestUtils {public ForumLoginTest(String url) {super(url);}public void loginSuccess() {driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("delaiwen");driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123456");driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();getScreenShot(getClass().getName());}public void loginUsernameNull() {driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123456");driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();getScreenShot(getClass().getName());}public void loginPasswordNull() {driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("delaiwen");driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();getScreenShot(getClass().getName());}
}

编辑帖子
package com.haifan.forum.test;import com.haifan.forum.utils.AutoTestUtils;
import org.apache.commons.codec.digest.DigestUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;import java.awt.desktop.QuitEvent;public class ForumEditTest extends AutoTestUtils {public ForumEditTest(String url) {super(url);}public ForumEditTest() {}public void login() {driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("delaiwen");driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123456");driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();}public WebElement setByXpath(String xpath) {WebElement element = driver.findElement(By.xpath(xpath));return element;}public void deleteForumSuccess() {login();setByXpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[1]/a/strong").click();setByXpath("//*[@id=\"bit-forum-content\"]/div[2]/div/div/div[1]/div[2]/div[2]/div/div[3]/div/a/span").click();driver.quit();}public void postForumSuccess() {login();setByXpath("//*[@id=\"bit-forum-content\"]/div[1]/div/div/div[2]/div/a[1]").click();WebElement board = setByXpath("//*[@id=\"article_post_borad\"]/option[6]");WebElement title = setByXpath("//*[@id=\"article_post_title\"]");title.sendKeys("wozaiceshi");WebElement content = setByXpath("//div[@id=\"bit-forum-content\"]//div[contains(@class, \"editormd\")]//textarea");content.sendKeys("wozaiceshi");WebElement publish = setByXpath("//*[@id=\"article_post_submit\"]");publish.click();getScreenShot(getClass().getName());driver.quit();}public void postForumTitleNull() {WebElement board = setByXpath("//*[@id=\"article_post_borad\"]/option[6]");WebElement content = setByXpath("//*[@id=\"edit-article\"]/div[1]/div[6]/div[1]/div/div");content.sendKeys("wozaiceshi");WebElement publish = setByXpath("//*[@id=\"article_post_submit\"]");publish.click();getScreenShot(getClass().getName());driver.quit();}public void postForumContentNull() {WebElement board = setByXpath("//*[@id=\"article_post_borad\"]/option[6]");WebElement title = setByXpath("//*[@id=\"article_post_title\"]");title.sendKeys("wozaiceshi");WebElement publish = setByXpath("//*[@id=\"article_post_submit\"]");publish.click();getScreenShot(getClass().getName());driver.quit();}
}

用户详情
package com.haifan.forum.test;
import com.haifan.forum.utils.AutoTestUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
public class ForumDetailTest extends AutoTestUtils {public ForumDetailTest(String url) {super(url);}public WebElement setByXpath(String xpath) {WebElement element = driver.findElement(By.xpath(xpath));return element;}public void login() {driver.findElement(By.xpath("//*[@id=\"username\"]")).sendKeys("delaiwen");driver.findElement(By.xpath("//*[@id=\"password\"]")).sendKeys("123456");driver.findElement(By.xpath("//*[@id=\"submit\"]")).click();}public void detail() {login();setByXpath("/html/body/div[1]/header[1]/div/div/div[3]/a").click();setByXpath("//*[@id=\"index_user_profile\"]").click();getScreenShot(getClass().getName());}
}

相关文章:
论坛系统的测试
项目背景 论坛系统采用前后端分离的方式来实现,同时使用数据库 来处理相关的数据,同时将其部署到服务器上。前端主要有7个页面组成:登录页,列表页,论坛详情页,编辑页,个人信息页,我…...
宠物店小程序怎么做?助力实体店实现营销突破
宠物店小程序怎么做?助力实体店实现营销突破 ——一个宠物店老板的“真香”实战分享 一、行业现状:线下宠物店的“流量焦虑” 作为开了3年宠物店的“铲屎官供应商”,这两年明显感觉生意难做了:某宝9.9包邮的狗粮、某团“满…...
《Mycat核心技术》第21章:高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)
作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀,…...
obsidian ios git同步
首先感谢几位博主的文章,我现在时间久了,未保存原文地址。以下是我自己的执行步骤总结。 应用商店安装 iSH 打开iSH,执行 apk update 安装下面软件,(我觉得只安装第一个应该就行,下次测试)。 …...
当 “原子” 遇上 “光腔”:量子计算的新舞台
在微观世界里,原子就像一个个会 “跳舞” 的小精灵,而科学家正试图用 “光的牢笼” 困住它们,让这些小精灵为量子计算 “打工”。最近,哈佛大学和 MIT 的研究团队在《科学》杂志上发表了一项突破性研究,他们让单个原子…...
移动端六大语言速记:第1部分 - 基础语法与控制结构
移动端六大语言速记:第1部分 - 基础语法与控制结构 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言的基础语法与控制结构,帮助开发者快速理解各语言间的差异与共性。 1. 基础语法 1.1 数据类型 各语言的基本数据…...
针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结
以下是针对 SQL 查询中 IN 子句性能优化 以及 等值 JOIN 和不等值 JOIN 对比 的详细解决方案、代码示例及表格总结: 问题 1:IN 的候选值过多(如超过 1000 个) 问题描述 当 IN 列表中的值过多时,SQL 会逐个比较每个值…...
微信小程序唤起app
1、前提 1、app与小程序主体需一致,可以前往微信公众平台关联。 2、小程序的场景值为1069,也就是得从app打开小程序,小程序才能唤起app。 2、vue3代码示例 <template><view class"maxBox bgc"><button open-typ…...
深度学习Note.5(机器学习.6)
1.Runner类 一个任务应用机器学习方法流程: 数据集构建 模型构建 损失函数定义 优化器 模型训练 模型评价 模型预测 所以根据以上,我们把机器学习模型基本要素封装成一个Runner类(加上模型保存、模型加载等功能。) Runne…...
从零开始设计Transformer模型(1/2)——剥离RNN,保留Attention
声明: 本文基于哔站博主【Shusenwang】的视频课程【RNN模型及NLP应用】,结合自身的理解所作,旨在帮助大家了解学习NLP自然语言处理基础知识。配合着视频课程学习效果更佳。 材料来源:【Shusenwang】的视频课程【RNN模型及NLP应用…...
Uniapp 持续出现 Invalid Host/Origin header 解决方法
目录 前言1. 问题所示2. 原理分析前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 执行代码的时候,源源不断,一直持续出现这个 Invalid Host/Origin header [WDS]...
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的缓存技术:使用 Redis 提升性能
<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…...
音视频 YUV格式详解
前言 本文介绍YUV色彩模型,YUV的分类和常见格式。 RGB色彩模型 在RGB颜色空间中,任意色光F都可以使用R、G、B三色不同的分量混合相加而成即: F = R + G + B.。即我们熟悉的三原色模型。 RGB色彩空间根据每个分量在计算机中占用的存储字节数可以分为以下几种类型,字节数…...
华为配置篇-BGP实验
BGP 一、简述二、常用命令总结三、实验 一、简述 IBGP 水平分割:从一个 IBGP 对等体学到的路由,不会再通告给其他的 IBGP 对等体。在一个 AS 内部,路由器之间通过 IBGP 交换路由信息。如果没有水平分割机制,当多个路由器之间形成…...
一个服务器算分布式吗,分布式需要几个服务器
一个服务器不构成分布式系统。分布式系统的核心在于多台独立的计算机(服务器)协同工作,通过通信网络共享资源、共同完成任务。以下是对问题的详细分析: 1. 单台服务器 ≠ 分布式 单台服务器的架构是集中式的,所有功能…...
vue element-ui 工程创建
vue element-ui 工程创建 按照步骤 : https://blog.csdn.net/wowocpp/article/details/146590400 创建工程 vue create demo3 cd demo3 npm run serve 在demo3 目录里面 执行如下命令 npm install element-ui -S 然后查看 package.json main.js 添加代码&…...
unity点击button后不松开通过拖拽显示模型松开后模型实例化
using System.Collections; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;[RequireComponent(typeof(Button))] // 确保脚本挂在Button上 public class DragButtonSpawner : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandle…...
arco design框架中的树形表格使用中的缓存问题
目录 1.问题 2.解决方案 1.问题 arco design框架中的树形表格使用中的缓存问题,使用了树形表格的load-more懒加载 点击展开按钮后,点击关闭,再次点击展开按钮时,没有调用查询接口,而是使用了缓存的数据。 2.解决方…...
《AI大模型应知应会100篇》第2篇:大模型核心术语解析:参数、Token、推理与训练
第2篇:大模型核心术语解析:参数、Token、推理与训练 摘要 本文将用通俗易懂的语言拆解大模型领域的四大核心概念:参数、Token、训练与推理。通过案例对比、代码实战和成本计算,帮助读者快速掌握这些术语的底层逻辑与实际应用价值…...
【28BYJ-48】STM32同时驱动4个步进电机,支持调速与正反转
资料下载:待更新。。。。 先驱动起来再说,干中学!!! 1、实现功能 STM32同时驱动4个步进电机,支持单独调速与正反转控制 需要资源:16个任意IO口1ms定时器中断 目录 资料下载:待更…...
手动实现一个迷你Llama:使用SentencePiece实现自己的tokenizer
自己训练一个tokenizertokenizer需要的模块SentencePiece 库tokenizer类中的初始化函数tokenizer类中的encode函数tokenizer类中的decode函数完整代码训练函数数据分片临时文件SentencePiece 训练参数 自己训练一个tokenizer tokenizer需要的模块 encode: 将句子转换为tokend…...
【超详细】讲解Ubuntu上如何配置分区方案
Ubuntu 的分区方案 一、通用分区方案(200G为例) EFI系统分区(仅UEFI启动模式需要,) 大小:512MB–1GB类型:主分区(FAT32格式)挂载点:/boot/efi说明࿱…...
Gradle-基础
一.安装 1. 2.配置环境变量 GRADLE_HOME D:\gradle\gradle-5.6.4 GRADLE_USER_HOME D:\gradle\localRepository 3.下载源配置 安装目录下的init.d文件夹里创建一个init.gradle文件,下载顺序从上到下,内容࿱…...
Anolis系统下安装Jenkins
1.安装java、maven yum install -y java-17-openjdk-devel maven git wget 2.配置环境变量 1.查看java和maven所在目录 [rootlocalhost ~]# which java /usr/bin/java [rootlocalhost bin]# ll /usr/bin/java lrwxrwxrwx 1 root root 22 4月 1 17:20 /usr/bin/java ->…...
Python网络爬虫:从入门到实践
目录 什么是网络爬虫? 网络爬虫的工作原理 常用Python爬虫库 编写爬虫的步骤 实战示例 注意事项与道德规范 未来趋势 1. 什么是网络爬虫? 网络爬虫(Web Crawler)是一种自动化程序,通过模拟人类浏览行为&#x…...
LabVIEW 调用 Python 函数
此程序是 LabVIEW 调用 Python 函数实现双精度数相加的典型示例。通过 LabVIEW 搭建交互框架,借助 “Open Python Session” 创建 Python 代码运行环境,定位 Python 模块路径后调用 “Add” 函数,最终实现数据处理并关闭会话。整个流程展现了…...
视频分析设备平台EasyCVR视频结构化AI智能分析:筑牢校园阳光考场远程监控网
一、背景分析 近年来,学校考试的舞弊现象屡禁不止,严重破坏考试的公平性,不仅损害广大考生的切身利益,也在社会上造成恶劣的影响。为有效制止舞弊行为,收集确凿的舞弊证据,在考场部署一套可靠的视频监控…...
AWS用Glue读取S3文件上传数据到Redshift,再导出到Quicksight完整版,含VPC配置
1. 项目背景 AWS的官方文档,关于Glue和Vpc配置部分已经比较旧了,按照官方文档配置的流程始终跑不通,花了一番时间和波折后,才终于完整的跑通了。 在数据分析和商业智能(BI)领域,我们常需要将存…...
Qt WebSockets使用
Qt WebSockets 是 Qt 官方提供的 WebSocket 协议 实现库,支持全双工通信(客户端/服务端),适用于实时交互应用(如聊天、游戏、实时数据监控)。 1. 核心功能 完整的 WebSocket 协议支持 符合 RFC 6455 标准,支持 ws:// 和 wss://(加密)。 自动处理握手、帧拆分、Ping/…...
Docker学习--容器生命周期管理相关命令--start/stop/restart命令
docker start 命令作用: 启动一个或多个已经创建的容器。 语法: docker start [参数] CONTAINER [CONTAINER…](要操作的容器的名称,可以同时操作多个) 参数解释: -a:附加到容器的标准输入输出…...
