博客系统项目测试报告

文章目录

  • 一.报告概要
  • 二.测试环境
  • 三.手工测试用例
  • 四.编写测试用例
  • 五.自动化测试Selenium
  • 测试项目主要特点

一.报告概要

  • 项目概要
    本项目是一个全功能的个人博客系统,旨在提供一个用户友好、功能全面的平台,允许用户注册、登录、浏览博客、查看详细内容、发表评论以及发布和管理个人博文。项目的核心功能包括博客列表、博客详情页、用户登录注册、个人中心和发布博客功能。

  • 技术栈
    SpringBoot, SpringMVC ,MyBatis, MySQL, HTML, CSS, JavaScript

  • 测试报告目的
    测试报告的主要目的是验证博客系统的功能完整性、性能和安全性。通过对每个核心功能的综合测试,确保系统能够在真实环境中稳定运行,并满足用户的预期需求。此外,报告还旨在识别潜在的问题和缺陷,为后续的开发和改进提供指导。

  • 测试报告范围和日期
    测试范围:涵盖所有核心功能的单元测试、集成测试和系统测试。特别关注用户交互、数据完整性、接口可靠性以及性能和安全性。

  • 测试日期:测试活动预计从2023年10月1日开始,至2023年10月31日结束。

  • 测试总体执行情况
    主要针对常见功能进行测试例如:博客登录页面,博客列表页面,博客详情页,博客编辑页…

二.测试环境

硬件:D0573AC9-C173-436A-B8B2-2549602DAD4C
软件:Google Chrome
开发工具:IDEA
测试工具:自动化测试工具Selenium
操作系统:Windows 11家庭中文版
浏览器版本:Google Chrome 版本 124.0.6367.119(正式版本) (64 位)

三.手工测试用例

博客登录页
在这里插入图片描述
博客注册页:
在这里插入图片描述
个人博客列表页
在这里插入图片描述
博客详情页:
在这里插入图片描述
博客编辑页:
在这里插入图片描述

四.编写测试用例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五.自动化测试Selenium

在这里插入图片描述
代码展示

package Blog;import com.sun.org.apache.xpath.internal.operations.Or;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.MethodSource;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;import static java.lang.Thread.sleep;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogCases extends InitAndEnd{public static Stream<Arguments> Generator() {return Stream.of(Arguments.arguments("http://42.192.83.143:8563/blog_system/blog_detail.html", "博客详情页","自动化测试"));}/**** 输入正确的账号,密码登录成功*/@Order(1)@ParameterizedTest@CsvFileSource(resources = "LoginSuccess.csv")void LoginSuccess(String username, String password, String blog_list_url) {System.out.println(username + password + blog_list_url);// 打开博客登录页面webDriver.get("http://42.192.83.143:8563/blog_system/blog_login.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入账号adminwebDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入密码123webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 点击提交按钮webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 跳转到列表页// 获取到当前页面urlString cur_url = webDriver.getCurrentUrl();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 如果url=http://42.192.83.143:8563/blog_system/blog_list.html,测试通过,否则测试不通过Assertions.assertEquals(blog_list_url, cur_url);// 列表页展示用户信息是admin// 用户名是admin测试通过,否则测试不通过webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);String cur_admin = webDriver.findElement(By.cssSelector("body > div.container > div.left > div > h3")).getText();Assertions.assertEquals(username, cur_admin);}/*** 博客列表页博客数量不为0*/@Order(2)@Testvoid BlogList() {// 打开博客列表页webDriver.get("http://42.192.83.143:8563/blog_system/blog_list.html");// 获取页面上所有博客标题对应的元素webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);int title_num = webDriver.findElements(By.cssSelector(".title")).size();// 如果元素数量不为0,测试通过Assertions.assertNotEquals(0 ,title_num);}/*** 博客详情页校验* url* 博客标题* 页面title是“博客详情页”*/@Order(4)@ParameterizedTest@MethodSource("Generator")void BlogDetail(String expected_url, String expected_title, String expected_blog_title) {// 找到第一篇博客对应的产看全文按钮webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/a")).click();// 获取当前页面urlwebDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);String cur_url = webDriver.getCurrentUrl();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 获取当前页面titleString cur_title = webDriver.getTitle();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 获取博客标题String cur_blog_title = webDriver.findElement(By.cssSelector("body > div.container > div.right > div > h3")).getText();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);Assertions.assertEquals(expected_title ,cur_title);Assertions.assertEquals(expected_blog_title, cur_blog_title);if(cur_url.contains(expected_url)) {System.out.println("测试通过");} else {System.out.println(cur_url);System.out.println("测试不通过");}}/**** 写博客*/@Order(3)@Testvoid EditBlog() throws InterruptedException {// 找到写博客按钮,点击webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 通过Js讲鼻涕进行输入((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");sleep(3000);// 点击发布webDriver.findElement(By.cssSelector("#submit")).click();sleep(3000);// 获取当前页面urlString cur_url = webDriver.getCurrentUrl();Assertions.assertEquals("http://42.192.83.143:8563/blog_system/blog_list.html", cur_url);}/*** 校验已发布博客标题* 校验已发布博客时间*/@Order(5)@Testvoid BlogInfoChecked() {webDriver.get("http://42.192.83.143:8563/blog_system/blog_list.html");// 获取第一篇博客标题String first_blog_title = webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > div.title")).getText();// 获取第一篇博客发布时间String first_blog_time = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[2]")).getText();// 校验博客标题是不是自动化测试Assertions.assertEquals("自动化测试", first_blog_title);// 如果时间是2023-5-23年发布的,测试通过if(first_blog_title.contains("2023-05-23")) {System.out.println("测试通过");} else {System.out.println("当前时间是:" + first_blog_time);System.out.println("测试不通过");}}/**** 删除和刚才发布的博客*/@Order(6)@Testvoid DeleteBlog() throws InterruptedException {// 打开博客列表页面webDriver.get("http://42.192.83.143:8563/blog_system/blog_list.html");// 点击全文按钮webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > a")).click();// 点击删除按钮webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(7)")).click();sleep(3000);// 博客列表页第一篇博客标题不是“自动化测试”String first_blog_title = webDriver.findElement(By.xpath("/html/body/div[2]/div[2]/div[1]/div[1]")).getText();// 校验当前博客标题不等于“自动化测试”webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);Assertions.assertNotEquals(first_blog_title, "自动测试");}/*** 注销*/@Order(7)@Testvoid Logout() {webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 校验url(登录url)String cur_url = webDriver.getCurrentUrl();Assertions.assertEquals("http://42.192.83.143:8563/blog_system/blog_login.html", cur_url);// 校验提交按钮WebElement webElement = webDriver.findElement(By.cssSelector("#submit"));Assertions.assertNotNull(webElement);}
}

1. 初始化测试环境:
继承InitAndEnd类,该类可能负责初始化WebDriver和关闭浏览器。

2. 生成测试数据:
使用Stream Generator()方法生成测试数据,这里只生成了一个测试案例,即博客详情页的URL、页面标题和博客标题。
3. 登录成功测试 (LoginSuccess):
使用@CsvFileSource读取CSV文件中的用户名、密码和预期的博客列表URL。
打开博客登录页面并输入账号密码。
点击提交按钮,验证是否成功跳转到博客列表页。
检查页面上是否显示了正确的用户名。
4. 博客列表页测试 (BlogList):
打开博客列表页面,验证博客标题的数量是否不为0。
博客详情页校验 (BlogDetail):
使用@MethodSource引入测试数据生成器。
点击博客列表中的“查看全文”按钮,验证当前URL、页面标题和博客标题是否符合预期。
5. 写博客测试 (EditBlog):
点击“写博客”按钮,使用JavaScript设置博客标题为“自动化测试”。
点击发布按钮,验证是否成功跳转到博客列表页面。
校验已发布博客信息 (BlogInfoChecked):
访问博客列表页面,检查最新博客的标题是否为“自动化测试”。
检查博客的发布时间是否为特定日期。
6. 删除博客测试 (DeleteBlog):
打开博客列表页面,点击“查看全文”按钮。
点击删除按钮,验证列表中是否不再显示“自动化测试”标题的博客。
7. 注销测试 (Logout):
点击注销按钮,验证是否成功跳转到登录页面,并检查登录按钮是否存在。
测试用例排序:
使用@TestMethodOrder和OrderAnnotation确保测试用例按指定顺序执行。
6. 等待机制:
代码中多次使用ThreadUtil.sleep和webDriver.manage().timeouts().implicitlyWait来等待页面元素加载。
7. 异常处理:
测试用例EditBlog中使用throws InterruptedException声明可能抛出的中断异常。
8. 断言验证:
使用Assertions类来验证测试结果是否符合预期。

这个测试流程涵盖了博客系统的主要功能,包括登录、列表展示、详情查看、写博客、信息校验、删除博客和注销。每个测试用例都设计有明确的预期结果,并通过断言来验证这些预期是否得到满足。

测试项目主要特点

  1. 自动化测试工具和框架的应用:
    通过采用自动化测试工具如Selenium和JUnit 5,您的项目实现了自动化测试脚本的编写,这有助于提高测试效率和系统运行的稳定性。

  2. UI测试的自动化:
    自动化测试涵盖了用户界面(UI)测试,这有助于减少人力投入,因为UI测试通常比较耗时且容易出错。

  3. 持续集成和持续交付(CI/CD):
    自动化测试与CI/CD流程相结合,可以在软件开发周期的早期发现问题,从而加快软件发布的速度。

  4. 参数化测试:
    使用参数化测试方法,您可以用不同的输入值多次运行相同的测试,这使得测试用例更加整洁,同时提高了代码的可读性和可维护性。

  5. 隐式等待的使用:
    通过使用隐式等待(implicitlyWait),您的测试脚本能够自动等待页面元素加载完成,这提高了自动化测试运行的效率和稳定性。

  6. 屏幕截图功能:
    当测试失败时,自动捕获屏幕截图,这为问题的溯源和解决提供了方便,因为截图可以直观地展示出错时的页面状态。

  7. 测试用例的顺序执行:
    使用@TestMethodOrder注解确保测试用例按照预定的顺序执行,这对于依赖于特定执行顺序的场景至关重要。

  8. 异常处理:
    测试脚本中包含了异常处理机制,如throws InterruptedException,这有助于确保测试在遇到异常时能够优雅地处理。

  9. 断言验证:
    测试脚本中使用了断言(Assertions)来验证测试结果是否符合预期,这是自动化测试中验证测试是否通过的关键部分。

  10. 详细的测试报告:
    测试结束后,可以生成包含所有测试结果的详细报告,这对于团队成员和项目利益相关者了解测试进度和结果非常有用。

  11. 测试数据的动态生成:
    通过自定义方法如Generator()动态生成测试数据,提高了测试的灵活性和可维护性。

  12. 跨浏览器兼容性测试:
    虽然您的描述中没有明确提到,但Selenium支持跨浏览器测试,这可以确保您的应用在不同的浏览器上都能正常工作。

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

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

相关文章

周刊是聪明人筛选优质知识的聪明手段!

这是一个信息过载的时代&#xff0c;也是一个信息匮乏的时代。 这种矛盾的现象在 Python 编程语言上的表现非常明显。 它是常年高居编程语言排行榜的最流行语言之一&#xff0c;在国外发展得如火如荼&#xff0c;开发者、项目、文章、播客、会议活动等相关信息如海如潮。 但…

#9松桑前端后花园周刊-React19beta、TS5.5beta、Node22.1.0、const滥用、jsDelivr、douyin-vue

行业动态 Mozilla 提供 Firefox 的 ARM64 Linux二进制文件 此前一直由发行版开发者或其他第三方提供&#xff0c;目前Mozilla提供了nightly版本&#xff0c;正式版仍需要全面测试后再推出。 发布 React 19 Beta 此测试版用于为 React 19 做准备的库。React团队概述React 19…

leetCode76. 最小覆盖子串

leetCode76. 最小覆盖子串 题目思路 代码 // 双指针 哈希表 // 这里cnt维护过程&#xff1a;先找到能够匹配T字符串的滑动窗口&#xff0c;然后这个cnt就固定了&#xff0c;因为i向前移动的同时&#xff0c;j也会维护着向前 // 就是当又出现能够满足T字符串的时候&#xff0…

Chrome浏览器安装React工具

一、如果网络能访问Google商店&#xff0c;直接安装官方插件即可 二、网络不能访问Google商店&#xff0c;使用安装包进行安装 1、下载react工具包 链接&#xff1a;https://pan.baidu.com/s/1qAeqxSafOiNV4CG3FVVtTQ 提取码&#xff1a;vgwj 2、chrome浏览器安装react工具…

基于ESP32和ESP8266的物联网开发过程(一)

给大家演示一个小工具&#xff0c;通过Wifi去连接ESP32或者ESP8266出来的一个热点。连接到这个热点之后&#xff0c;可以输密码&#xff0c;也可以不输密码。这里我设置的是不输密码直接进来&#xff0c;我这个是ESP8266。 进来之后直接点配置Wifi&#xff0c;然后可以看到ESP8…

【简单介绍下7-Zip】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

快速入门!学习鸿蒙App开发的终极指南!

鸿蒙&#xff08;HarmonyOS&#xff09;是华为推出的一款分布式操作系统&#xff0c;旨在为不同设备提供统一的操作体验。鸿蒙App开发可以让应用程序在多个设备上实现流畅运行。本文将介绍鸿蒙App开发的终极指南&#xff0c;帮助您快速入门。 开发环境搭建 鸿蒙App开发过程需要…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(五)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 继续接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 在下面的图片中&#…

小工具 - 用Astyle的DLL封装一个对目录进行代码格式化的工具

文章目录 小工具 - 用Astyle的DLL封装一个对目录进行代码格式化的工具概述笔记效果编译AStyle的DLL初次使用接口的小疑惑测试程序 - 头文件测试程序 - 实现文件测试程序 - RC备注END 小工具 - 用Astyle的DLL封装一个对目录进行代码格式化的工具 概述 上一个实验(vs2019 - ast…

知识图谱在提升大语言模型性能中的应用:减少幻觉与增强推理的综述

幻觉现象指的是模型在生成文本时可能会产生一些听起来合理但实际上并不准确或相关的输出&#xff0c;这主要是由于模型在训练数据中存在知识盲区所致。 为了解决这一问题&#xff0c;研究人员采取了多种策略&#xff0c;其中包括利用知识图谱作为外部信息源。知识图谱通过将信息…

简单介绍IIC通信协议

文章目录 一&#xff0c;简单介绍二&#xff0c;IIC物理层三&#xff0c;IIC通信时序1.起始位与停止位2.IIC读写地址位信号3.IIC应答信号4.IIC数据位收发信号 四&#xff0c;总线速率五&#xff0c;主机发送数据流程六&#xff0c;主机接收数据流程七&#xff0c;IIC的时钟延展…

【云原生】Pod 的生命周期(二)

【云原生】Pod 的生命周期&#xff08;一&#xff09;【云原生】Pod 的生命周期&#xff08;二&#xff09; Pod 的生命周期&#xff08;二&#xff09; 6.容器探针6.1 检查机制6.2 探测结果6.3 探测类型 7.Pod 的终止7.1 强制终止 Pod7.2 Pod 的垃圾收集 6.容器探针 probe 是…

uniapp文本框上下滚动问题

一个基本需求&#xff0c;textarea标签没有办法通过手拖动的方式进行滚动&#xff0c;当文字超出其容量后&#xff0c;想要编辑上面被遮挡部分的文字这边难以点到&#xff0c;电脑可以鼠标滚轮&#xff0c;但手机需要拖动但无效&#xff1a; 下面提供了我的解决思路&#xff1a…

高精地图是怎么构建的?方案有哪些?高精度语义地图构建的一点思考

高精地图是怎么构建的&#xff1f;方案有哪些&#xff1f;高精度语义地图构建的一点思考 高精度(High-Definition, HD)语义地图是目前自动驾驶领域的一个重要研究方向&#xff0c;近年随着Transformer和BEV的大火&#xff0c;很多大佬团队都开展了HD语义地图构建相关的工作。2…

【005_音频开发_基础篇_ALSA_Codec_驱动-MA120x0P功放】

005_音频开发_基础篇_ALSA_Codec_驱动-MA120x0P功放 文章目录 005_音频开发_基础篇_ALSA_Codec_驱动-MA120x0P功放创作背景MA120X0P输出模式BTLSEPBTLSEBTL 硬件配置方式/硬件Limiter限幅器限幅器作用过程 主要寄存器操作指令 ma120x0p.cma120x0p.h 创作背景 学历代表过去、能…

Vue MVVM这一篇就够啦!

Vue vs React 相似之处: 它们都有使用 Virtual DOM虚拟DOM-CSDN博客&#xff1b;提供了响应式&#xff08;Reactive&#xff09;和组件化&#xff08;Composable&#xff09;的视图组件。将注意力集中保持在核心库&#xff0c;而将其他功能如路由和全局状态管理交给相关的库。R…

GreptimeDB 助力国家电网数字换流站打造稳定高效的时序数据底座

电网体系作为现代社会运行的支柱之一&#xff0c;为各行各业、千家万户提供了电能的基本支持。从家庭到企业&#xff0c;医院到学校&#xff0c;交通到通讯&#xff0c;电力电网的应用贯穿始终。近年来&#xff0c;特高压换流站成为国家电网的重点建设工程&#xff0c;“十四五…

vivado Virtex 和 Kintex UltraScale+ 比特流设置

下表所示 Virtex 和 Kintex UltraScale 器件的器件配置设置可搭配 set_property <Setting> <Value> [current_design] Vivado 工具 Tcl 命令一起使用。

RAG 修炼手册|一文讲透 RAG 背后的技术

今天我们继续剖析 RAG&#xff0c;将为大家详细介绍 RAG 背后的例如 Embedding、Transformer、BERT、LLM 等技术的发展历程和基本原理&#xff0c;以及它们是如何应用的。 01. 什么是 Embedding? Embedding 是将离散的非结构化数据转换为连续的向量表示的技术。 在自然语言…

管理能力学习笔记九:授权的常见误区和如何有效授权

授权的常见误区 误区一&#xff1a;随意授权 管理者在授权工作时&#xff0c;需要依据下属的能力、经验、意愿问最自己&#xff1a;这项工作适合授权给Ta做吗&#xff1f;如果没有&#xff0c;可以通过哪些方法进行培训呢&#xff1f; 误区二&#xff1a;缺乏信任 心理暗示…