学习交流论坛-测试报告

🌟 欢迎来到 我的博客! 🌈

💡 探索未知, 分享知识 !💫

在这里插入图片描述

本文目录

    • 1. 项目描述
    • 2. 测试计划
      • 2.1 功能测试
        • 2.1.1 测试环境
        • 2.1.2 编写测试用例
        • 2.1.3 部分手工功能测试
      • 2.2 ==自动化测试==
        • 2.2.1 注册页面
        • 2.2.2 登录页面
        • 2.2.3 博客列表页面


1. 项目描述

一个基于Spring的前后端分离的论坛系统,用于提供一个学习交流,分享技术文章和个人见解的平台。支持帖子发布、评论、私信用户、管理等功能。

2. 测试计划

2.1 功能测试

2.1.1 测试环境
  • 操作系统:Windows 10旗舰版
  • 项目运行环境:IntelliJ IDEA 2023.2.3、MySQL5.7、JDK1.8
  • 浏览器:Chorme, Edge, FireFox
  • 自动化脚本环境:IntelliJ IDEA 2023.2.3,
  • 测试技术: 手工单元测试和自动化测试
  • 测试人员:我本人
2.1.2 编写测试用例
  • 功能测试点
    在这里插入图片描述
  • 非功能测试点
    在这里插入图片描述
2.1.3 部分手工功能测试
注册页面
  • 场景一 : 输入的用户名在数据库中存在,且两次输入密码相同
  • 预期结果: 提示用户已经存在
  • 实际结果:提示用户已经存在,与预期结果一致。在这里插入图片描述
  • 场景二: 输入用户名不存在,密码与却密码一致,点击注册
  • 预期结果:注册成功,跳转回登录界面
  • 实际结果:注册成功,跳转回登录界面,与预期结果一致。
登录页面
  • 场景1:输入用户名正确, 密码不正确,点击登录
  • 预期结果:登录失败,给出错误提示
  • 实际结果:登录失败,给出错误提示, 与预期结果一致
    在这里插入图片描述
  • 场景2:输入用户名正确, 密码正确,点击登录
  • 预期结果:登录成功,跳转到首页博客列表页
  • 实际结果:登录成功,跳转到首页博客列表页, 与预期结果一致
首页页面
  • 场景1:未登录状态下,点击首页
    预期结果:跳转回登录界面
    实际结果:跳转回登录界面,与预期结果一致
  • 场景2:登录状态下,点击“首页”
    预期结果:导航栏显示所有的版块名,下方显示所有帖子列表,右上方显示登录用户信息
    实际结果:与预期结果一致
    在这里插入图片描述
  • 场景3:登录状态下,点击导航栏处的版块名“Java”
    预期结果:下方显示Java名称,该版块下的帖子数量,版块下的所有帖子列表,右上方显示登录用户信息
    实际结果:与预期结果一致
    在这里插入图片描述
  • 场景4:登录状态下,在搜索框输入关键字“数据库”搜索
    预期结果:下方显示帖子正文中所有存在“数据库”这三个字的帖子;
    实际结果:刷新回到首页界面,与预期不符。不支持搜索功能。
  • 场景5:登录状态下,点击“月亮”按钮
    预期结果:进入夜间模式的切换
    实际结果:进入夜间模式的切换,与预期相符。
  • 场景6:登录状态下,点击“发布帖子”按钮
    预期结果:进入博客编辑页面,版块名默认选择Java
    实际结果:与预期相符。
    在这里插入图片描述
帖子详情页面
  • 场景1:未登录状态下,点击首页下的任意一条帖子内容
    预期结果:跳转回登录界面
    实际结果:跳转回登录界面,与预期结果一致。
  • 场景2:登录状态下,点击首页下的一条帖子内容“西安”
    预期结果:跳转到该帖子详情页面
    实际结果:与预期相符。
  • 场景3:登录状态下,点击首页下的一条帖子内容“测试”(帖子作者“newCharry”,当前登录作者“TestUser”)
    预期结果:跳转到该帖子详情页面,最上方显示帖子信息,左侧显示帖子作者信息,下方显示该帖子的内容,下方只显示点赞按钮。
    实际结果:与预期相符。
    在这里插入图片描述
  • 场景4:登录状态下,下方点赞按钮
    预期结果:上方显示的点赞数加1
    实际结果:与预期相符。
    在这里插入图片描述

2.2 自动化测试

2.2.1 注册页面
注册页面

验证注册成功的情况 :

  • 场景1:注册用户名在数据库不存在,昵称,两次密码一致,注册成功,跳转回登录界面
    在这里插入图片描述
    在这里插入图片描述
	/**
     * 注册用户名在数据库不存在,昵称,两次密码一致,注册成功,跳转回登录界面
     * @param userName 用户名
     * @param nickname 昵称
     * @param password1 密码
     * @param password2 确认密码
     */
    @Order(1)
    @ParameterizedTest
    @CsvSource(value = "TestUser1,TestUser1,111111,111111")
    void Register(String userName, String nickname, String password1,String password2) throws InterruptedException, IOException {
        // 打开登录页面
        webDriver.get("http://124.71.152.247:8081/sign-in.html");
        // 点击注册按钮
        webDriver.findElement(By.xpath("/html/body/div/div/div/div[1]/div/div[3]/a")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys("userName");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 输入昵称
        webDriver.findElement(By.cssSelector("#nickname")).sendKeys("nickname");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys("password1");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 输入确认密码
        webDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("password2");
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 确认协议
        webDriver.findElement(By.cssSelector("#policy")).click();
        // 完成注册
        webDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000); // 等待1s

        String expectUrl = "http://124.71.152.247:8081/sign-in.html"; // 预计跳转页面URL
        String currentUrl = webDriver.getCurrentUrl(); // 当前页面URL

        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
        Assertions.assertEquals(expectUrl, currentUrl); // 比较
        System.out.println("注册成功!");
        // 对页面进行截图
        File srcFile  = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        String fileName = "RegisterTest.png";
        FileUtils.copyFile(srcFile, new File(fileName));

        Thread.sleep(1000); // 等待1s
        //因为自动化测试会测试多个账号,所有在一个账号检测完了后,还需要回退到登录界面
        webDriver.navigate().back();
    }

验证注册失败的情况

  • 场景2:注册用户名在数据库存在,昵称,两次密码一致,注册失败,获取警告框信息。
    代码同上。测试结果
    在这里插入图片描述
    在这里插入图片描述
2.2.2 登录页面
登录页面
  • 登录成功测试
    场景1:测试用户名正确,密码正确,登录成功

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

	/**
     * 测试用户名正确,密码正确,登录成功
     * @param username 用户名
     * @param password 密码
     */
    @Order(1)
    @ParameterizedTest
    @CsvSource(value = "TestUser1,111111")
    void Login1(String username, String password) throws InterruptedException, IOException {
        // 打开登录页面
        webDriver.get("http://124.71.152.247:8081/sign-in.html");
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        // 输入密码
        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);

        Thread.sleep(1000); // 等待1s

        // 检查是否跳转到博客列表页
        String expectUrl = "http://124.71.152.247:8081/index.html";
        String curUrl = webDriver.getCurrentUrl();
        Assertions.assertEquals(expectUrl, curUrl);
        System.out.println("登录成功 !");

        // 获取页面截图
        File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        String fileName = "login1.png";
        FileUtils.copyFile(srcFile, new File(fileName));

        Thread.sleep(1000); // 等待1s,等待弹窗出现
        //因为测试多个账号,所有在一个账号检测完了后,还需要回退到登录界面
        webDriver.navigate().back();
    }
  • 登录失败测试
    场景2:测试用户名正确,密码错误,登录失败
    在这里插入图片描述
/**
     * 测试用户名正确,密码错误,登录失败
     * @param username 用户名
     * @param password 密码
     */
    @Order(2)
    @ParameterizedTest
    @CsvSource(value = "TestUser1,111")
    void Login2(String username, String password) throws InterruptedException, IOException {
        // 打开登录页面
        webDriver.get("http://124.71.152.247:8081/sign-in.html");
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        // 点击登录
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("#submit")).click();

        Thread.sleep(1000); // 等待1s

        String text = webDriver.findElement(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div")).getText();
        System.out.println(text);
    }
2.2.3 博客列表页面
  • 未登录状态下测试
    场景1:未登录状态下进入博客列表页,直接跳转回登录界面。测试通过。
    实际结果: 未登录,直接跳转到登录页面
    在这里插入图片描述
    在这里插入图片描述
    /**
     * 未登录状态下进入博客列表页,直接跳转回登录界面。测试通过。
     */
    @Order(1)
    @Test
    void BlogList1() throws InterruptedException, IOException {
        // 不登录,直接打开博客显示列表页
        webDriver.get("http://124.71.152.247:8081/index.html");

        Thread.sleep(1000); // 等待1s

        // 获取当前界面的url地址
        String expectUrl = "http://124.71.152.247:8081/sign-in.html";
        String curUrl = webDriver.getCurrentUrl();

        // 判断是否跳转到登录界面
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        Assertions.assertEquals(expectUrl, curUrl);

        // 截图
        File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        String fileName = "BlogListFailed.png";
        FileUtils.copyFile(srcFile, new File(fileName));
    }
  • 登录状态下测试
    场景2:登录后进入博客列表页,查看“首页”元素是否存在,查看是否含有“发布帖子”按钮。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
 /**
     * 登录后进入博客列表页,查看“首页”元素是否存在,查看是否含有“发布帖子”按钮。
     * @param username 用户名
     * @param password 密码
     */
    @Order(2)
    @ParameterizedTest
    @CsvSource(value = "TestUser1,111111")
    void BlogList2(String username, String password) throws InterruptedException, IOException {
        // 打开登录页面
        webDriver.get("http://124.71.152.247:8081/sign-in.html");
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        // 点击登录
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        webDriver.findElement(By.cssSelector("#submit")).click();

        Thread.sleep(1000); // 等待1s

        // 查看"页面"的文本内容显示是否正确
        String expectText1 = "首页";
        String text1 = webDriver.findElement(By.cssSelector("#nav_board_index > a > span.nav-link-title")).getText();
        Assertions.assertEquals(expectText1, text1);

        //截图
        File srcFile =  ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        String fileName = "BlogListSuccess1.png";
        FileUtils.copyFile(srcFile, new File(fileName));

        // 查看"发布帖子"的按钮点击后是否正确跳转
        webDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();
        //查看是否跳转到博客编辑页面
        String expectUrl = "http://124.71.152.247:8081/index.html";
        String curUrl = webDriver.getCurrentUrl();
        Assertions.assertEquals(expectUrl, curUrl);
        System.out.println("已跳转到边界帖子页面");

        // 截图
        File srcFile2 =  ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        String fileName2 = "BlogListSuccess2.png";
        FileUtils.copyFile(srcFile2, new File(fileName2));
    }
......(部分自动化测试脚本)


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

链表(2) ---- 完整版

目录 一 . 前言二 . 头文件声明三 . 代码思绪1. 查找函数的实现2. 在指定位置之前插入3. 在指定位置之后插入4. 删除指定位置的结点5. 删除指定位置之后的结点6. 销毁链表 四 . 完整代码五 . 总结 正文开始 一 . 前言 补充说明: 1、链式机构在逻辑上是连续的&#…

【算法】前缀和

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、一维前缀和二、二维前缀和三、寻找数值的中心下标四、除自身以外数组的乘积五、和为k的子数组六、和…

【Github】sync fork后,意外关闭之前提交分支的pr申请 + 找回被关闭的pr请求分支中的文件

【Github】sync fork后,意外关闭之前提交分支的pr申请 找回被关闭的pr请求分支中的文件 写在最前面原因解析提交pr,pr是什么?rebase 或者 merge 命令 找到分支中被删除的文件找到被关闭的提交请求pr方法1:在公共仓库被关闭的pr中…

LeetCode in Python 69. Sqrt(x) (x的平方根)

求x的平方根,第一想法可能是遍历0~x,求其平方,找到或且但其时间复杂度为O(n),或是想到遍历0~M即可,其中M x // 2,将时间复杂度降至O()。本文利用二分思想,给出一种时间复…

博睿数据亮相GOPS全球运维大会,Bonree ONE 2024春季正式版发布!

2024年4月25日,博睿数据 Bonree ONE 2024 春季正式版焕新发布。同时,博睿数据AIOps首席专家兼产品总监贺安辉携核心产品新一代一体化智能可观测平台 Bonree ONE 亮相第二十二届 GOPS 全球运维大会深圳站。 Bonree ONE 2024 春季版产品重点升级数据采集、…

网上打印资料多少钱一张?网上打印价格是多少?

在数字化时代,网上打印服务正逐渐成为一种便捷、高效的打印解决方案。对于许多需要打印资料的用户来说,了解网上打印的价格和服务质量至关重要。那么,网上打印资料到底多少钱一张?网上打印价格又是如何呢?今天&#xf…

视频号下载小程序:轻松获取视频号视频

在数字化时代,短视频已成为人们日常生活中不可或缺的一部分。为了满足用户随时随地观看视频的需求,视频号小程序应运而生。本文将详细介绍视频号小程序的下载方法、功能特点以及使用技巧,帮助您更好地享受短视频带来的乐趣。 一、视频号小程…

C++ 之 string类 详细讲解

喜欢的人有点难追怎么办 那就直接拉黑 七个女生在一起是七仙女,那七个男生在一起是什么? 葫芦七兄弟 目录 一、为什么要学习string类 二、标准库中的string类 1.string类 2.string类的常用接口说明 2.1 string类对象的常见构造 2.2 string类对…

Vivado-OOC

OOC⇒Out-of-Context 在Vivado中,对于顶层设计,vivado使用自顶向下的全局(global)综合,将顶层文件下的所有模块都进行综合,但是在实际设计过程中,顶层设计会被多次修改和综合,但是有…

AI语音侵权第一案:配音演员获赔25万元,如何保护你的声音资产?

会议之眼 快讯 近日,北京互联网法院对全国首例AI声音侵权案作出一审宣判,引发了社会对AI技术与个人权益保护关系的广泛讨论。 原告殷某,一名配音师,发现自己的声音被AI化后在“魔音工坊”APP上出售,遂将运营主体等五…

Linux的学习之路:20、进程信号(2)

摘要 本章讲一下进程信号的阻塞信号和捕捉信号和可重入函数 目录 摘要 一、阻塞信号 1、阻塞信号 2、信号集操作函数 二、捕捉信号 1、内核如何实现信号的捕捉 2、代码实演 三、可重入函数 一、阻塞信号 1、阻塞信号 实际执行信号的处理动作称为信号递达(Delivery) …

MyBatis源码之前言—JDBC编码存在的问题和Mybatis的介绍

MyBatis源码之前言—JDBC编码存在的问题和Mybatis的介绍 为了方便操作,我们在sjdwz_test数据库下建立一张表: CREATE TABLE t_student (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(255) DEFAULT NULL COMMENT 名字,age int(255…

Web端Webrtc,SIP,RTSP/RTMP,硬件端,MCU/SFU融合视频会议系统方案分析

Web端视频融合,会议互通已经是视频会议应用的大趋势,一是目前企业有大量的老视频会议硬件设,二新业务又需要Web端支持视频会议监控直播需求,迫切需要一个融合对接的方案,即能把老的设备用起来,又能对接新的…

【每日刷题】Day22

【每日刷题】Day22 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 1669. 合并两个链表 - 力扣(LeetCode) 2. 11. 盛最多水的容器 - 力扣&#…

分类算法——ROC曲线与AUC指标(九)

知道TPR与FPR TPRTP/(TP FN) 所有真实类别为1的样本中,预测类别为1的比例 FPR FP/(FP TN) 所有真实类别为0的样本中,预测类别为1的比例 ROC曲线 ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义…

Linux 内核设备树 ranges属性

今天有人问了我一下ranges属性&#xff0c;找了相关资料确认后&#xff0c;记录一下&#xff1a; 参考资料链接&#xff1a;让你完全理解linux内核设备树ranges属性地址转换 - vkang - 博客园 (cnblogs.com) ranges属性定义如下&#xff1a; ranges < local_address pa…

webpack面试题(持续汇总ing。。。)

webpack的编译过程 初始化 此阶段&#xff0c;webpack会将CLI参数、配置文件、默认配置进行融合&#xff0c;形成一个最终的配置对象。对配置的处理过程是依托一个第三方库 yargs 完成的。此阶段相对比较简单&#xff0c;主要是为接下来的编译阶段做必要的准备目前&#xff0c;…

三数之和 ---- 双指针

题目链接 题目: 分析: 解法一: 暴力解法, 将所有的三元组都算出来看是否为0, 题目要求去重操作, 所以我们可以使用set去重解法二: 因为我们知道当计算两数之和时, 我们使用的方法是将数组排序,然后利用"双指针"那么同理, 计算三个数之和: 1. 排序2. 固定一个数a, …

数据库管理-第176期 浅析代码团队建设(20240425)

数据库管理176期 2024-04-25 数据库管理-第176期 浅析代码团队建设&#xff08;20240425&#xff09;1 国内现状2 需求管控3 竞争与迭代总结 数据库管理-第176期 浅析代码团队建设&#xff08;20240425&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09…

安卓Activity的setContentView()流程分析

目录 前言一、Activity的视图加载过程1.1 视图结构1.2 流程分析1.2.1 Activity.java -->setContentView()1.2.2 Activity.java -->getWindow()1.2.3 PhoneWindow.java -->setContentView()1.2.4 PhoneWindow.java --->installDecor()1.2.4.1 PhoneWindow.java ---&…