BlogPark测试报告

目录

一,项目背景

二,项目功能

三,测试计划

3.1 测试用例的设计

3.2 功能测试

1.正常登录

2.正常写博客测试 (输入完整的标题和内容)

3.发布博客之后跳转到详情页观察是否有刚发布的博客

4.删除博客观察列表的博客数量是否减少 

5.修改博客 

 6.注销,注销成功后回到登陆页面

四,自动化测试 

4.1 使用Selenium进行测试的步骤

1.根据项目的核心功能编写测试用例

2.创建自动化项目,根据测试用例书写测试脚本 

4.2 编写脚本进行自动化测试

1.登录功能测试

2.博客列表页数量不为0测试

3.添加博客功能测试

4.博客详情页功能测试

5.删除博客功能测试

6.博客注销功能测试


测试代码链接:spring: spring学习中的相关代码测试 - Gitee.com

项目访问链接(已部署):登陆页面(账号:admin 密码:123)

一,项目背景

  1. BlogPark采用了前后端分离的方法来实现的,同时使用了MySQL、Redis进行数据的存储,并将其部署到了云服务器上。前端有8个页面构成:登陆注册、添加博客、博客编辑、博客详情、热榜博客、全部博客列表、个人博客列表以及个人中心。
  2. 在一般的博客项目上进行了许多的扩展:
    1. 使用邮箱注册以及验证码登录
    2. 使用Redis缓存共享session及热榜博客信息
    3. 使用线程池定时进行热榜的更新
    4. 使用@Async实现异步进行数据鞥带读写操作
    5. 使用扫描线程进行敏感词的过滤并记录日志
    6. 使用Hutool工具进行密码的加盐机密处理
    7. 使用资源路径映射访问本地资源
    8. 使用正则表达式对返回给前端的MD格式的数据去除关键字
    9. ......

二,项目功能

针对BlogPark里面的诸多功能,这里对其一些核心功能进行了功能测试以及自动化测试,涉及到的功能有:登录、注销、写博客以及删除博客等功能。

  1. 登录功能:用户名以及密码已经在后端写入了数据库,没有实现账户注册功能,即:用户名以及密码是已经存在的。登录成功后就会跳转到列表页面。
  2. 列表页面:可以在列表页查看有限数量的博客简介,其包括博客标题、发布时间以及内容概要。在左侧可以看到登录的用户以及文章数、分类数等的模块。在右上角有主页、写博客和注销三个功能:主页即列表页,写博客即博客编辑页,注销即注销用户,回到登录页面。
  3. 详情页面:在列表页面点击“查看全文”按钮就会跳转到详情页,此时就可以看到该篇博客的完整内容。在右上角同样有主页、写博客、删除和注销四个功能:删除即删除该篇博客,删除之后就会跳转到列表页面,该篇博客就被成功删除。
  4. 写博客:在登录之后的任意界面点击“写博客”之后就会进入博客编辑页面,此时就可以进行博客的编写,点击“发布文章”后就可以成功发布文章,此时就会跳转到列表页。

三,测试计划

3.1 测试用例的设计

3.2 功能测试

1.正常登录

2.正常写博客测试 (输入完整的标题和内容)

3.发布博客之后跳转到详情页观察是否有刚发布的博客

4.删除博客观察列表的博客数量是否减少 

5.修改博客 

 6.注销,注销成功后回到登陆页面

四,自动化测试 

4.1 使用Selenium进行测试的步骤

1.根据项目的核心功能编写测试用例

2.创建自动化项目,根据测试用例书写测试脚本 

前提:如果使用的是Java语言进行自动化测试的话,需要创建一个Maven的工程,并添加相关的测试依赖:

<!--        添加selenium依赖--><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency>

4.2 编写脚本进行自动化测试

1.登录功能测试

    @Order(1)@ParameterizedTest@CsvFileSource(resources = "/LoginSuccess.csv")void LoginSuccess(String username,String password,String blog_list_url) throws InterruptedException {//打开博客登录页面webDriver.get("http://localhost:8080/login.html");Thread.sleep(1000);//输入账号adminwebDriver.findElement(By.cssSelector("#username")).sendKeys(username);//输入密码123webDriver.findElement(By.cssSelector("#password")).sendKeys(password);//点击提交按钮跳转到列表页webDriver.findElement(By.cssSelector("#submit")).click();Thread.sleep(1000);//获取列表页的urlString curUrl = webDriver.getCurrentUrl();//获取当前页的url是不是博客列表页,获取到则代表测试通过,否则测试不通过Thread.sleep(1000);Assertions.assertEquals(blog_list_url,curUrl);Thread.sleep(1000);}
LoginSuccess.csv文件内容:admin,123,http://localhost:8080/myblog_list.html

2.博客列表页数量不为0测试

    @Order(2)@Testvoid BlogList() throws InterruptedException {//打开博客列表页webDriver.get("http://localhost:8080/myblog_list.html");Thread.sleep(1000);//获取页面上所有博客标题对应的元素int title_num = webDriver.findElements(By.cssSelector(".title")).size();//如果元素数量不为0,测试通过Assertions.assertNotEquals(0,title_num);}

3.添加博客功能测试

    @Order(3)@Testvoid EditBlog() throws InterruptedException {//找到写博客按钮,点击webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();Thread.sleep(1000);//找到输入框输入标题//通过JS脚本进行输入((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");Thread.sleep(1000);//点击发布webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();Thread.sleep(1000);//使用弹窗操作Alert alert = webDriver.switchTo().alert();alert.dismiss();Thread.sleep(1000);}

4.博客详情页功能测试

    @Order(4)@ParameterizedTest@MethodSource("generator")void BlogDetail(String expected_url,String expected_title,String expected_blogTitle) throws InterruptedException {//找到第一篇博客对应的查看全文按钮webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(4)")).click();Thread.sleep(1000);//获取当前页面urlString curUrl = webDriver.getCurrentUrl();Thread.sleep(1000);//获取当前页面titleString curTitle = webDriver.getTitle();Thread.sleep(1000);//获取博客标题String curBlogTitle = webDriver.findElement(By.cssSelector("#title")).getText();Thread.sleep(1000);Assertions.assertEquals(expected_title,curTitle);Assertions.assertEquals(expected_blogTitle,curBlogTitle);if(curUrl.contains(expected_url)) {System.out.println("测试通过");} else {System.out.println(curUrl);System.out.println("测试不通过");}}public static Stream<Arguments> generator() {return Stream.of(Arguments.arguments("http://localhost:8080/blog_content.html?id=","博客正文","自动化测试"));@Order(5)@Testvoid BlogInfoChecked() {webDriver.get("http://localhost:8080/myblog_list.html");// 获取第一篇博客标题String first_blog_title = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.title")).getText();// 获取第一篇博客发布时间String first_blog_time = webDriver.findElement(By.xpath("//*[@id=\"artlist\"]/div[1]/div[2]")).getText();// 校验博客标题是不是自动化测试Assertions.assertEquals("自动化测试", first_blog_title);// 如果时间是2023-6-12年发布的,测试通过if(first_blog_time.contains("2023-06-12")) {System.out.println("测试通过");} else {System.out.println("当前时间是:" + first_blog_time);System.out.println("测试不通过");}}}

5.删除博客功能测试

    @Order(6)@Testvoid DeleteBlog() throws InterruptedException {//打开博客列表页webDriver.get("http://localhost:8080/myblog_list.html");Thread.sleep(1000);//点击删除按钮webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(6)")).click();Alert alert = webDriver.switchTo().alert();alert.accept();Thread.sleep(1000);Alert alert1 = webDriver.switchTo().alert();alert1.accept();//博客列表页第一篇博客标题不是"自动化测试"String first_blog_title = webDriver.findElement(By.xpath("//*[@id=\"artlist\"]/div[1]/div[1]")).getText();Thread.sleep(1000);//校验第一篇博客的标题不等于"自动化测试"Assertions.assertNotEquals(first_blog_title,"自动化测试");}

6.博客注销功能测试

    @Order(7)@Testvoid logout() throws InterruptedException {webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();Alert alert = webDriver.switchTo().alert();alert.accept();Thread.sleep(1000);//进行url校验String curUrl = webDriver.getCurrentUrl();Thread.sleep(1000);Assertions.assertEquals("http://localhost:8080/blog_list.html",curUrl);}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下从sqlite3源码编译出sqlite3库及相关可执行程序

目录 1. 下载sqlite3源码并编译 2. 下载Tcl库并编译 3. 再次编译sqlite源码 1. 下载sqlite3源码并编译 打开SQLite Download Page&#xff0c;滚动到页面的下面&#xff0c;找到源码量最大的那个&#xff08;其它的估计也行&#xff0c;但源码最大的本人感觉功能最全&#…

【unity小技巧】FPS游戏实现相机的偏移震动、武器射击后退和后坐力效果

最终效果 文章目录 最终效果前言相机偏移震动相机震动脚本换弹节点震动 武器射击后退效果武器后坐力效果完结 前言 关于后坐力之前其实已经分享了一个&#xff1a;FPS游戏后坐力制作思路 但是实现起来比较复杂&#xff0c;如果你只是想要简单的实现&#xff0c;可以看看这个&…

软件测试|Python对JSON的解析和创建详解

简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;已经成为当今互联网应用中广泛使用的数据格式之一。Python提供了内置的模块来解析和创建JSON数据&#xff0c;使得在Python中处理JSON变得非常简单。本文将详细介绍Python…

GB28181视频汇聚平台EasyCVR级联后,部分通道视频无法播放是什么原因?

GB28181协议智慧安防平台EasyCVR是基于各种IP流媒体协议传输的视频汇聚和融合管理平台。视频流媒体服务器EasyCVR采用了开放式的网络结构&#xff0c;支持高清视频的接入和传输、分发&#xff0c;平台提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制…

Python 网络爬虫的常用库汇总(建议收藏)

Python 在编写网络爬虫常常用到的一些库。 Python爬虫网络库主要包括&#xff1a;urllib、requests、lxml、fake-useragent、bs4(BeautifulSoup)、grab、pycurl、urllib3、httplib2、RoboBrowser 、MechanicalSoup、mechanize、socket、Unirest for Python、hyper、PySocks、t…

Spring MVC的RequestMapping注解、controller方法返回值

1.使用说明 作用&#xff1a;用于建立请求URL和处理请求方法之间的对应关系。 出现位置&#xff1a; 类上&#xff1a; 请求 URL的第一级访问目录。此处不写的话&#xff0c;就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理&…

Realm Management Extension领域管理扩展之安全状态

RME基于Arm TrustZone技术。TrustZone技术在Armv6中引入,提供以下两个安全状态: 安全状态(Secure state)非安全状态(Non-secure state)以下图表显示了在AArch64中的这两个安全状态以及通常在每个安全状态中找到的软件组件: 该架构将在安全状态运行的软件与在非安全状态运…

UV贴图和展开初学者指南

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 介绍 这正是本文的主题——UV贴图——登上舞台的时候。大多数 3D 建…

Transformer 的双向编码器表示 (BERT)

一、说明 本文介绍语言句法中&#xff0c;最可能的单词填空在self-attention的表现形式&#xff0c;以及内部原理的介绍。 二、关于本文概述 在我之前的博客中&#xff0c;我们研究了关于生成式预训练 Transformer 的完整概述&#xff0c;关于生成式预训练 Transformer (GPT) 的…

基于神经网络的手写汉字提取与书写评分系统研究

相关源码和文档获取请私聊QQ:3106089953 论文目录结构 目 录 摘 要 I Abstract II 目 录 IV 第1章 绪论 1 1.1. 研究背景与意义 1 1.2. 国内外研究现状 2 1.2.1. 文本定位技术研究现状 2 1.2.2. 手写汉字识别研究现状 3 1.2.3. 汉字书写质量评价方法研究现状 4 1.3. 本文所做工…

Qt pro文件

1. 项目通常结构 2.pri文件 pri文件可定义通用的宏&#xff0c;例如创建一个COMMON.pri文件内容为 COMMON_PATH D:\MyData 然后其它pri或者pro文件如APPTemplate.pro文件中通过添加include(Common.pri) &#xff0c;QtCreator就会自动在项目结构树里面创建对应的节点 3.变量…

3D人体姿态估计

3D人体姿态估计是指通过算法对输入的图像或视频进行分析&#xff0c;推断出人体的三维姿态信息。该技术可以应用于许多领域&#xff0c;如虚拟现实、运动分析、人机交互等。 1. 算法原理&#xff1a; 3D人体姿态估计利用深度学习模型作为算法的核心&#xff0c;通过网络学习人…

【web】springboot3 生成本地文件 url

文章目录 流程效果静态资源访问ServiceServiceImplController 流程 avatar_dir&#xff1a;请求图片在服务端的存放路径user.dir&#xff1a;项目根目录 效果 静态资源访问 application.yml 设置静态文件存储路径custom:upload:avatar_dir: ${user.dir}/avatar_dir/avatar_d…

GO语言笔记2-变量与基本数据类型

变量使用步骤 声明赋值使用 package main import "fmt" func main(){var age int //声明一个 int类型的变量叫ageage 18 //给变量用 赋值fmt.Println(age) //使用变量 输出变量的值 } 编译运行输出变量值 变量的四种使用方式 package main import "fmt&q…

金和OA C6 HomeService.asmx SQL注入漏洞复现

0x01 产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网+监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 0x02 漏洞概述 金和OA C6 HomeService.asmx接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞…

MiniTab的正态性检验结果的分析

正态性检验概述 可使用 正态性检验 确定数据是否不服从正态分布。 执行菜单&#xff1a;要执行正态性检验&#xff0c;请选择统计 > 基本统计 > 正态性检验。 正态性检验 的假设 对于正态性检验&#xff0c;进行如下假设。 H0&#xff1a;数据服从正态分布。H1&…

【VUE】无法加载文件 \node\vue.ps1,因为在此系统上禁止运行脚本。问题解决

问题描述 在VS Code中输入vue create -p dcloudio/uni-preset-vue uniapp-demo命令时报错 无法加载文件 D:\address\node\vue.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Executi…

数据结构之B树和B+树

数据结构可视化演示链接&#xff0c;也就是视频中的网址 文章目录 一、B-Tree二、BTree(B-Tree变种) 一、B-Tree 样例图 叶节点具有相同的深度&#xff0c;叶节点的指针为空所有索引元素不重复节点中的数据索引从左到右递增排列 二、BTree(B-Tree变种) 样例图 非叶子节…

水文模型(科普类)

SWMM 模型概况&#xff1a; SWMM5 系列拥有编辑区域数据的功能&#xff0c;而且能模拟水文、 水力和水质。其核心部分是管道汇流计算模块&#xff0c;提供了恒定流法、运动波法和动力波法三种水动力学 方法。其中动力波法通过求解完整的圣维南方 程组进行计算&#xff0c;能够…

【代码随想录】刷题笔记Day48

前言 早上练车去了&#xff08;好久没有8点前醒了&#xff09;&#xff0c;练科目二两小时下来脚根可真酸啊&#xff0c;希望下周一把过。练完顺带去Apple西湖免费换新了耳机&#xff0c;羊毛爽&#xff01; 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09;…