博客系统项目测试报告

news2024/11/13 12:10:37

文章目录

  • 一.报告概要
  • 二.测试环境
  • 三.手工测试用例
  • 四.编写测试用例
  • 五.自动化测试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);
        // 输入账号admin
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 输入密码123
        webDriver.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);
        // 跳转到列表页
        // 获取到当前页面url
        String 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)
    @Test
    void 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();
        // 获取当前页面url
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        String cur_url = webDriver.getCurrentUrl();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 获取当前页面title
        String 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)
    @Test
    void 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);
        // 获取当前页面url
        String cur_url = webDriver.getCurrentUrl();
        Assertions.assertEquals("http://42.192.83.143:8563/blog_system/blog_list.html", cur_url);
    }
    /**
     * 校验已发布博客标题
     * 校验已发布博客时间
     */
    @Order(5)
    @Test
    void 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)
    @Test
    void 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)
    @Test
    void 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.coloradmin.cn/o/1646176.html

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

相关文章

嵌入式学习

笔记 作业 有如下结构体 struct Student{ char name[16]; int age; double math_score; double chinese_score; double english_score; double physics_score; double chemistry…

Linux用户日志审计系统

标题日期版本说明作者 用户日志审计系统 2024.05.06v.0.0.1权限lgb 测试环境&#xff1a;CentOS Stream 9 测试过程&#xff1a; 测试开始前&#xff0c;首先我们先建立一个用户。 将文件备份。 我们通过vim编辑器&#xff0c;打开 /etc/profile 文件进行编辑。 将提前编辑好…

【C语言】第一个C程序:hello world

printf简介 printf是C语言提供的库函数&#xff0c;可以在屏幕上打印格式化数据。这里不作展开&#xff0c;只需要知道&#xff0c;如果要打印hello world&#xff0c;就把双引号引起来的"hello world"作为参数传给printf就行了。如果想要在打印后换行&#xff0c;要…

Scratch编程v3.29.1少儿编程工具

软件介绍 SCRATCH是一款由麻省理工学院&#xff08;MIT&#xff09;媒体实验室开发的图形化编程语言和集成开发环境&#xff08;IDE&#xff09;。它的目标是让编程变得有趣、直观且易学&#xff0c;尤其是针对儿童和青少年群体。通过SCRATCH&#xff0c;用户可以通过拖放代码…

python安装问题及解决办法(pip不是内部或外部命令也不是可运行)

pip是python的包管理工具&#xff0c;使python可在cmd&#xff08;命令行窗口&#xff0c;WinR后输入cmd&#xff09;中执行 针对 “pip不是内部或外部命令也不是可运行” 问题&#xff0c;需要在安装的时候将python添加到环境变量中 上图第三个选项必须勾选才能在cmd中使用pi…

今日详解,教你如何不直播在视频号卖货

大家好&#xff0c;我是电商笨笨熊 视频号作为背靠微信的平台&#xff0c;从不需要考虑自身的流量问题&#xff0c; 因此在视频号推出之后就有大批的主播从其他平台转入视频号&#xff1b; 而这时候很多普通人应该也发现了新的机会&#xff0c;不再去内卷抖音、快手直播&…

(论文阅读-优化器)Orca: A Modular Query Optimizer Architecture for Big Data

目录 摘要 一、简介 二、背景知识 2.1 大规模并行处理 2.2 SQL on Hadoop 三、Orca架构 四、查询优化 4.1 优化工作流 4.2 并行查询优化 五、Metadata Exchange 六、可行性 6.1 Minimal Repros 6.2 优化器准确性测试 七、实验 八、相关工作 8.1 查询优化基础 8…

语音识别简介

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

微积分 --- 偏导数,方向导数与梯度(二)

方向导数 上图为一温度图&#xff0c;所反映的是加利福利亚洲和内华达州在十月的一天下午三点的温度。其中&#xff0c;图中的每一点都是温度T关于x,y的函数&#xff0c;即T(x,y)。对于图中的Reno市而言&#xff0c;沿着x方向的偏导反映的是温度沿着x方向&#xff0c;即沿着东方…

虚拟化之---virtio通信

一、理解virtio的背景 我们知道虚拟化hypervisor大的类型分为两种&#xff0c;全虚拟化和半虚拟化。 在全虚拟化的解决方案中&#xff0c;guest VM 要使用底层 host 资源&#xff0c;需要 Hypervisor 来截获所有的请求指令&#xff0c;然后模拟出这些指令的行为&#xff0c;这样…

深度神经网络中的不确定性研究综述

A.单一确定性方法 对于确定性神经网络&#xff0c;参数是确定的&#xff0c;每次向前传递的重复都会产生相同的结果。对于不确定性量化的单一确定性网络方法&#xff0c;我们总结了在确定性网络中基于单一正向传递计算预测y *的不确定性的所有方法。在文献中&#xff0c;可以找…

5-在Linux上部署各类软件

1. MySQL 数据库安装部署 1.1 MySQL 5.7 版本在 CentOS 系统安装 注意&#xff1a;安装操作需要 root 权限 MySQL 的安装我们可以通过前面学习的 yum 命令进行。 1.1.1 安装 配置 yum 仓库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql…

性能优化 | el-table中内嵌大量el-input控件导致渲染卡顿的问题

场景 项目中有一个应用场景&#xff0c;用户需要在表单中大量使用选择框以及输入框填写数据&#xff08;每一行大概有三十几个输入框&#xff09;&#xff0c;当选择框与输入框达到一定数量的时候&#xff0c;页面会出现输入不连续、卡顿的现象&#xff0c;如下图&#xff1a;…

纯血鸿蒙APP实战开发——自定义视图实现Tab效果

介绍 本示例介绍使用Text、List等组件&#xff0c;添加点击事件onclick,动画&#xff0c;animationTo实现自定义Tab效果。 效果预览图 使用说明 点击页签进行切换&#xff0c;选中态页签字体放大加粗&#xff0c;颜色由灰变黑&#xff0c;起到强调作用&#xff0c;同时&…

FreeRTOS资源管理

1.以前临界资源的保护方式 有使用过静态局部变量来保护临界资源&#xff0c;也有用队列&#xff0c;信号量&#xff0c;互斥量来保护临界资源。这些都是在多个任务会共同使用临界资源的情况下我们的保护方式。 问题提出&#xff1a;如果有个传感器在读取数据时有严格的时序&a…

2路模拟音频光端机 JR-CA02

概述 JR-CA02光端机由发送机JR-CA02 Tansmitter和接收机JR-CA02 Receiver组成&#xff0c;通过一定距离长度的光纤相连接&#xff0c;传输2路Audio模拟音频&#xff08;即1路立体声&#xff09;。且每路音频分配输出。 JR-CA02光端机具有运行主要技术参数的监测功能&#xff…

Java的java.util.concurrent.ExecutorService简介

在Java并发编程的璀璨星空中&#xff0c;ExecutorService无疑是那颗最耀眼的明星。它不仅是Java并发编程的核心组件之一&#xff0c;更是构建高并发、高性能应用的秘密武器。今天&#xff0c;我们就来一场说走就走的探索之旅&#xff0c;揭开它的神秘面纱&#xff01; &#x1…

【高校科研前沿】中国科学院地理资源所钟帅副研究员研究组博士生朱屹东为一作在Top期刊发文:从潜力到利用:探索西藏风能资源开发的技术路径优化布局

01 文章简介 论文名称&#xff1a;From potential to utilization: Exploring the optimal layout with the technical path of wind resource development in Tibet&#xff08;从潜力到利用:探索西藏风能资源开发的技术路径优化布局&#xff09; 文章发表期刊&#xff1a;《…

盘一盘接口测试的那些痛点,你现在会解决了吗

前言 说到接口测试&#xff0c;想必大家一定不会陌生。接口测试就是测试系统组件间&#xff0c;接口对接是否顺畅的一种测试。包括测试数据能否交换、能否传递、能否正常控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系&#xff0c;等等。 由于接口测试主要是检测系统…

MybatisPlus也能轻松生成三层架构代码?

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 目录 一、前言三层架构的流程图为什么使用…