BlogPark测试报告

news2024/11/18 3:19:56

目录

一,项目背景

二,项目功能

三,测试计划

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);
        //输入账号admin
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        //输入密码123
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        //点击提交按钮跳转到列表页
        webDriver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
        //获取列表页的url
        String 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)
    @Test
    void 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)
    @Test
    void 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);
        //获取当前页面url
        String curUrl = webDriver.getCurrentUrl();
        Thread.sleep(1000);
        //获取当前页面title
        String 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)
    @Test
    void 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)
    @Test
    void 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)
    @Test
    void 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.coloradmin.cn/o/1371783.html

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

相关文章

如何创建微信小程序?高效实现你的创意

在数字化浪潮下&#xff0c;微信小程序以其便捷高效的特点逐渐成为人们日常生活与商业活动的重要载体。有很多人却被难住&#xff0c;若没有没有编程经验&#xff0c;如何创建微信小程序&#xff1f;答案是通过合理利用工具&#xff0c;让创意迅速落地为功能完备的小程序。 一…

【qml】第一次尝试qml与c++交互

背景&#xff1a; 目的是学习qml&#xff0c;因为看到很多qml的酷炫效果&#xff0c;想试一试。 看过网上一些代码&#xff0c;qt提供的工具类好几个&#xff0c;看着就晕。只想提炼一下&#xff0c;做个记录。 我先整理了一套自己的想法&#xff1a;所谓交互&#xff0c;还…

浏览器缓存引发的odoo前端报错

前两天&#xff0c;跑了一个odoo16项目&#xff0c;莫名其妙的前端报错&#xff0c; moment.js 报的错&#xff0c; 这是一个时间库&#xff0c;不是我自己写的代码&#xff0c;我也没做过任何修改&#xff0c;搞不清楚为什么报错。以为是odoo的bug&#xff0c;所以从gitee下载…

K8S存储卷和数据卷

容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会恢复到初始状态&#xff0c;一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消失 容器…

rax3000m 刷机 uboot + immortalwrt

0. 环境 - win10 ubuntu22 - rax3000m 生产日期20231027 一台&#xff08;nand版本的&#xff09; 1. 上电&#xff0c;登录web 电脑连接路由器LAN1 http://192.168.10.1/ 账号&#xff1a;user 密码&#xff1a;KK6kYC!3 上网设置&#xff1a;自动获取IP 2. 开启 ssh 2…

Linux CentOS 7.6安装JDK详细保姆级教程

一、检查系统是否自带jdk java --version 如果有的话&#xff0c;找到对应的文件删除 第一步&#xff1a;先查看Linux自带的JDK有几个&#xff0c;用命令&#xff1a; rpm -qa | grep -i java第二步:删除JDK&#xff0c;执行命令&#xff1a; rpm -qa | grep -i java | xarg…

软件测试工程师,从6K到25k的测试之路养成,一路狂飙...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、技术方向 就技…

华为数通HCIA题库(750题)

完整题库在这里&#xff1a;华为数通HCIA-RS题库注释版-加水印.pdf资源-CSDN文库 此处只节选几题。 1.网络管理员在网络中捕获到了一个数据帧&#xff0c;其目的MAC地址是01-00-5E-AO-B1-C3。关于该MAC地址的说法正确的是&#xff08; )。 A.它是一个单播MAC地址 B.它是一个广播…

linux 里面在docker 里面安装pg 数据库(亲测有效)

目录 1 上传 1 上传 上传之后tar 包&#xff0c;将他变成镜像 输入docker images,发现目前是没有镜像的&#xff0c;现在将tar 包变成镜像 docker load -i postgresql.tar以上就将tar 包变成镜像了 现在在宿主机找一个地方&#xff0c;存放数据库的数据 /home/softinstall/…

Unity 实用方法 合集

Unity 实用方法 合集 Unity 打字机效果2D 坐标旋转计算球面坐标求值平滑移动鼠标位置获取2D屏幕坐标转世界坐标物体朝向目标多物体中心点生成本地图片加载画面线框显示画面线框显示 搭载效果 贝塞尔曲线绘制贝塞尔曲线绘制 搭载效果 网格弯曲网格弯曲 搭载效果 Delaunay 模型生…

【FPGA/verilog -入门学习17】vivado 实现串口自发自收程序

1&#xff0c;需求 PC使用串口助手给FPGA板发送9600 波特率的数据&#xff0c;FPGA板接收到数据后&#xff0c;回复同样的数据给PC 2&#xff0c;需求分析 按模块可以划分为&#xff1a; rx接收模块&#xff0c;将输入的8位并行rx 数据转换成[7:0]rx_data 信号&#xff0c;当…

性能优化--实战利用arthas排查java服务cpu占用过高的问题

使用jps -l查看目前的java应用进程 启动arthas&#xff0c;选择需要监控的进程 dashboar查看该应用整体情况 使用thread命令&#xff0c;查看占用cpu过高的几个线程ID 然后使用thread 线程ID查看具体线程在执行哪些内容&#xff0c;可以看到对应的类和方法 正在上传… 重…

K8S实践:非常实用kubectl的别名工具推荐,助你高效工作

转载至我的博客 &#xff0c;公众号&#xff1a;架构成长指南 大家好&#xff0c;我是蜗牛哥&#xff0c;今天介绍一款k8s的别名工具&#xff0c;可以让你高效工作&#xff0c;下面是相关介绍 介绍 我们在管理 Kubernetes集群和执行指定任务是比较复杂和费时的。但是如果使用…

益生菌抗癌?补充这种益生菌,抑制肝癌,还改善肠道健康

撰文 | 宋文法 肠道菌群&#xff0c;是人体不可分割的组成部分&#xff0c;生活在我们肠道内的数万亿细菌对健康起着重要作用&#xff0c;它们影响着人的新陈代谢、消化能力、抵御感染、控制人体对药物的反应&#xff0c;甚至还能预防某些癌症。 非酒精性脂肪肝病&#xff0c;是…

虚幻UE 材质-纹理 1

本篇笔记主要讲两个纹理内的内容&#xff1a;渲染目标和媒体纹理 媒体纹理可以参考之前的笔记&#xff1a;虚幻UE 媒体播放器-视频转成材质-播放视频 所以本篇主要讲两个组件&#xff1a;场景捕获2D、场景捕获立方体 两个纹理&#xff1a;渲染目标、立方体渲染目标 三个功能&am…

构建高效学习平台:企业培训系统源码深度解析

企业培训系统是组织中培养和提升员工技能的核心工具。本文将深入探讨企业培训系统的源码&#xff0c;通过关键技术代码解析&#xff0c;揭示其中的设计原理和功能实现&#xff0c;以构建更高效的学习平台。 1. 环境配置与依赖项安装 首先&#xff0c;让我们关注源码的环境配…

Vue3:Axios配置及使用

Axios官方 一、安装&#xff1a; //使用 npm: $ npm install axios//使用 bower: $ bower install axios//使用 yarn: $ yarn add axios 在package-lock.json文件可以查看axios版本 二、配置&#xff1a; milliaAxios.js 配置axios import axios from axios // 创建一个 ax…

AI老照片修复-Bringing-Old-Photos-Back-to-Life

&#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. AI老照片修复原理-…

AP5153 低压差 线性降压恒流IC 手电筒LED电源驱动

AP5153 是一种 PWM 调光的、低压 差的 LED 线性降压恒流驱动器。 AP5153 仅需要外接一个电阻和一个 NMOS 管就可以构成一个完整的 LED 恒 流驱动电路&#xff0c; 调节该外接电阻就可以调节 输出电流&#xff0c;输出电流可调范围为 20mA 到 3.0A。 AP5153 还可以通过在 DIM…