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.mzph.cn/news/610201.shtml

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

相关文章

漫漫数学之旅004

文章目录 经典格言数学习题古今评注根号的故事数学家小传(一)乔治波利亚(二) 克里斯托弗鲁登道夫经典格言 数学包括用最迂回曲折的方式证明最显而易见的事实。——乔治波利亚(Gorge Polya) 乔治波利亚(George Polya)的这句名言揭示了数学证明的本质和魅力。在数学中,…

非工程师指南: 训练 LLaMA 2 聊天机器人

引言 本教程将向你展示在不编写一行代码的情况下&#xff0c;如何构建自己的开源 ChatGPT&#xff0c;这样人人都能构建自己的聊天模型。我们将以 LLaMA 2 基础模型为例&#xff0c;在开源指令数据集上针对聊天场景对其进行微调&#xff0c;并将微调后的模型部署到一个可分享的…

华为 1+X《网络系统建设与运维(高级)》认证模拟实验上机试题

华为 1X《网络系统建设与运维&#xff08;高级&#xff09;》认证模拟实验上机试题 一、考试背景二、考试说明2.1考试分数说明2.2考试要求2.3考试环境介绍2.4启动考试环境2.5保存答案(非常重要) 三、考试正文3.1注意事项3.2校区内&#xff08;LAN&#xff09;3.2.1任务 1&#…

上门洗衣洗鞋小程序多门店管理模式是怎么样的

做干洗店和洗鞋店的老板们很多都不止一个门店&#xff0c;多门店的管理模式下&#xff0c;去做一个上门洗衣洗鞋小程序&#xff0c;需要有哪些必要的功能才能让不同的门店管理起来不乱呢。首先需要先确定一下不同门店的管理都会面临哪些经营场景和需求。 第一&#xff0c;加盟店…

Qt5插件开发入门+示例

目的 1、为什么用插件 现在大家最讲模块化开发了,怎么算模块化,分成不同的类,分成不同的文件夹,高内聚,低耦合,这个当然算是。 从高层次讲,它们是在一起的,只是逻辑上的模块化,不是物理上的模块化,或者说不是彻底的模块化,彻底的模块化应该像一个辆自行车一样,车…

计算机毕业设计-----ssm+mysql医药进销存系统

功能介绍 医药进销存系统&#xff0c;主要功能包括&#xff1a; 公告管理&#xff1a;发布公告、公告列表&#xff1b; 生产管理&#xff1a;订单列表、增加生产、订单日志&#xff1b; 分店采购&#xff1a;分店审核、采购&#xff1b; 总店仓库&#xff1a;出库管理、仓库列…

2024 Midjourney 基础教程(⼆):了解 Midjourney Bot 和AI绘画使用技巧进阶教学

在上⼀篇⽂章中&#xff0c;我们学到了如何注册 Midjourney &#xff0c;开通付费订阅&#xff0c;并画出了可能是⾃⼰的第⼀张 AI绘画。怎么样&#xff1f;这种将想象的画⾯&#xff0c;变为现实世界图⽚的感觉。 是否有种造物者的错觉&#xff0c;同时有种开盲盒的惊喜感&…

市域治理一体化综合指挥平台解决方案:PPT全文42页,附下载

关键词&#xff1a;市域社会治理&#xff0c;智慧网格&#xff0c;市域社会治理现代化&#xff0c;智慧网格综合管理平台&#xff0c;市域治理 一、市域治理&#xff08;智慧网格&#xff09;一体化建设需求分析 1、职能部门需求&#xff1a;职能部门在市域治理中发挥着主导作…

关于谷歌浏览器如何将背景换为黑色,字体换为白色

一.关于chorme浏览器如何换色 #跟着我一起来看一下吧 操作步骤 步骤 1.在谷歌的搜索框里搜索此网址——chrome://flags/ 如图 2.访问此网址 如图 3.我们在搜索框搜索:Auto Dark Mode for Web Contents 如图 4.开启Web内容的自动暗模式 选择enbled 5.确认重新启动 选择…

126.(leaflet篇)leaflet松散型arcgis缓存切片加载

地图之家总目录(订阅之前必须详细了解该博客) arcgis缓存切片数据格式如下: 完整代码工程包下载,运行如有问题,可“私信”博主。效果如下所示: leaflet松散型arcgis缓存切片加载 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYP

2.2.3机器学习—— 判定梯度下降是否收敛 + α学习率的选择

2.2.3 判定梯度下降是否收敛 α学习率的选择 2.1、 判定梯度下降是否收敛 有两种方法&#xff0c;如下图&#xff1a; 方法一&#xff1a; 如图&#xff0c;随着迭代次数的增加&#xff0c;J(W,b)损失函数不断下降当 iterations 300 之后&#xff0c;下降的就不太明显了 / …

赋能智慧农业生产,基于YOLOv3开发构建农业生产场景下油茶作物成熟检测识别系统

AI赋能生产生活场景&#xff0c;是加速人工智能技术落地的有利途径&#xff0c;在前文很多具体的业务场景中我们也从实验的角度来尝试性地分析实践了基于AI模型来助力生产生活制造相关的各个领域&#xff0c;诸如&#xff1a;基于AI硬件实现农业作物除草就是一个比较熟知的场景…

【数字图像处理】水平翻转、垂直翻转

图像翻转是常见的数字图像处理方式&#xff0c;分为水平翻转和垂直翻转。本文主要介绍 FPGA 实现图像翻转的基本思路&#xff0c;以及使用紫光同创 PGL22G 开发板实现数字图像水平翻转、垂直翻转的过程。 目录 1 水平翻转与垂直翻转 2 FPGA 布署与实现 2.1 功能与指标定义 …

Amazing OpenAI API:把非 OpenAI 模型都按 OpenAI API 调用

分享一个有趣的小工具&#xff0c;10MB 身材的小工具&#xff0c;能够将各种不同的模型 API 转换为开箱即用的 OpenAI API 格式。 让许多依赖 OpenAI API 的软件能够借助开发者能够接触到的&#xff0c;非 OpenAI 的 API 私有部署和使用起来。 写在前面 这个小工具软件写于两…

ChatGPT知名开源项目有哪些

ChatGPT-Next-Web&#xff1a;基于ChatGPT API的私有化部署网页聊天系统 主要功能&#xff1a; 只需在 1 分钟内即可在 Vercel 上一键免费部署&#xff0c;支持私有服务器快速部署&#xff0c;支持使用私有域名支持ChatGPT3.5、4等常见模型Linux/Windows/MacOS 上的紧凑型客户…

Ribbon学习思维导图

参考资料 1、OpenFeign与Ribbon源码分析总结与面试题 2、万字剖析OpenFeign整合Ribbon实现负载均衡的原理 3、扒一扒Nacos、OpenFeign、Ribbon、loadbalancer组件协调工作的原理 4、OpenFeign原来是这么基于Ribbon来实现负载均衡的

第18集《佛法修学概要》

戊五、结示法要 请大家打开讲义第四十四页。我们讲因果同时&#xff0c;借缘显现。 从因果转变的角度&#xff0c;佛教是说“罪从心起将心忏&#xff0c;心若灭时罪亦亡。”那么我们要知道&#xff0c;业是怎么来的&#xff1f;怎么会有业&#xff1f;为什么苹果掉下来&#x…

DEATHNOTE: 1

首先通过kali使用nmap进行主机发现 发现IP地址为192.168.75.129的主机 发现其22端口和80端口开放 对其进行详细扫描发现其操作系统是Linux 4.15 - 5.6 访问192.168.75.129&#xff1a;80会重定向到另一个页面 修改一下kali的/ect/hosts的添加一句192.168.75.129 deathnote.v…

【Vue3】2-8 : 条件渲染与列表渲染及注意点

本书目录&#xff1a;点击进入 一、条件渲染 - v-if 表达式 1.1 真值与假值 1.2 v-if &#xff0c;v-else-if &#xff0c;v-else 1.3 实战&#xff1a;isShow1 为真值时 显示 bbbbb &#xff1e; 代码 &#xff1e; 效果 二、列表渲染 - v-for 2.1 渲染 - 数组 &…

Spring基于注解的AOP控制事务

首先在.xml中开启sprong对注解事务的支持 applicationContext.xml <tx:annotation-driven transaction-manager"transactionManager"/> 然后再Service中加上注解 service Service Transactional(readOnlytrue,propagation Propagation.SUPPORTS) public cl…