当前位置: 首页 > news >正文

博客系统自动化测试项目实践

文章目录

    • 一.测试需求分析
      • 1.功能分析
      • 2.非功能分析
    • 二.制定测试方案(计划 + 策略)
    • 三.编写测试用例
    • 四.执行自动化测试用例
    • 五.编写测试报告
    • 六.项目总结

一.测试需求分析

1.功能分析

通过功能测试需求分析
在这里插入图片描述

2.非功能分析

非功能分析主要从:界面,性能,安全性,兼容性,可维护性等来分析

  • 界面
    布局、排版美观,设计符合当下时代。
    界面的按键和跳转能够正常使用。
  • 性能
    跳转页面不超过 3 秒。执行业务逻辑不超过 3 秒。
  • 安全
    防止用户数据泄露,预防sql注入,病毒危害系统
  • 兼容
    保证在不同系统(macOS,Windows),不同终端设备(PC,移动),不同浏览器上系统能正常运转
  • 可维护
    方便后续修复和扩展系统功能

二.制定测试方案(计划 + 策略)

测试范围以及测试点
用户登录页面,注册页面,博客发布模块,博客删除模块,博客修改模块,博客主页模块。

测试方法: 自动化测试

测试所涉及的类型:功能,界面测试

三.编写测试用例

本次测试采用自动化测试主要对功能方面来进行测试用例的编写,通过前面对功能测试需求的分析,主要对六个功能模块来设计测试用例

在这里插入图片描述

四.执行自动化测试用例

自动化脚本如下:

package com.example.blog_test;import lombok.SneakyThrows;
import org.assertj.core.data.Index;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.openqa.selenium.*;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.springframework.boot.test.context.SpringBootTest;
import sun.security.util.Password;import javax.swing.*;
import java.time.Duration;
import java.util.List;import static java.lang.Thread.sleep;
import static org.junit.jupiter.api.Assertions.*;@SpringBootTest
public class ApplicationTest {/*** 测试登录模块*/@Nested@Disabledpublic class LoginTest{@SneakyThrows@ParameterizedTest@CsvFileSource( files = "src/test/resources/TestSource/UserAcount.csv")void test(String name,String pwd){Driver driver = new Driver();driver.MaxWindow();driver.get(PublicVariable.LoginUrl);//服务器性能太低 加载页面慢driver.Wait(5);//输入用户名账号WebElement UserName = driver.findElementByCss("#username");WebElement password = driver.findElementByCss("#password");UserName.sendKeys(name);password.sendKeys(pwd);//点击登录按钮WebElement button = driver.findElementByCss("#submit");button.click();//预期结果:跳转主页
//            WebDriverWait wait = new WebDriverWait(driver.getWebDriver(), Duration.ofSeconds(10)); // 设置等待时间为10秒
//            WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#app")));sleep(100);String CurUrl = driver.getUrl();assertEquals(CurUrl,PublicVariable.IndexUrl);//关闭窗口driver.quit();}}/*** 测试注册模块*/@Nested@Disabledpublic class RegisterTest{}/*** 测试注销模块*/@Nested@Disabledpublic class LogoutTest{@SneakyThrows@Testvoid test(){Driver driver = new Driver();//登录Tool.login(driver);//点击注销按钮WebElement LogOutBtn = driver.findElementByCss("#app > div > div > a:nth-child(8)");LogOutBtn.click();driver.confirm();sleep(1000);//预期结果: 导航栏 只有注册 登录 主页三个按钮List<WebElement> lists = driver.findElements("#app > div > div > a");assertEquals(lists.size(),3);}}/*** 测试博客发布模块*/@Nested@Disabledpublic class ReleaseTest{@SneakyThrows@ParameterizedTest@CsvFileSource( files = "src/test/resources/TestSource/BlogDetail.csv")public void test(String title, String content){Driver driver = new Driver();//登录Tool.login(driver);//获取导航栏元素列表List<WebElement> webElementList = driver.findElements("#app > div > div > a");//选取写博客功能元素WebElement target = null;for(int i = 0 ;i<webElementList.size();i++){WebElement element = webElementList.get(i);if(element.getText().equals(Tool.Pub_blog)){target = element;continue;}}//进入博客发布页面 填写内容target.click();sleep(5000);WebElement Title = driver.findElementByCss("#add_title");Actions actions = new Actions(driver.getWebDriver());//输入内容actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(content).perform();//输入标题Title.sendKeys(title);//点击发布List<WebElement> lists = driver.findElements(".title > button");for(int i  =0;i<lists.size();i++){WebElement element = lists.get(i);if(element.getText().equals("发布文章")){element.click();sleep(1000);driver.reject();break;}}//预期结果:跳转到主我的博客页面 主页面第一篇文章为刚发布文章sleep(1000);String CurUrl = driver.getUrl();String IndexTitle = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > header:nth-child(1) > header:nth-child(1) > h2").getText();String IndexContent = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > main > span").getText();assertEquals(CurUrl,PublicVariable.MyBlogUrl);assertEquals(IndexTitle,title);assertEquals(IndexContent,content);}}/*** 测试博客删除模块*/@Nested@Disabledpublic class DeleteTest{@Testvoid test(){Driver driver = new Driver();//先写入一篇文章Tool.pub_blog(driver,"测试","测试");//删除改文章List<WebElement> elements = driver.findElements("#app .el-main .el-main");WebElement el = elements.get(0);List<WebElement> lists = el.findElements(By.cssSelector("button"));for(int i = 0;i<lists.size();i++){WebElement btn = lists.get(i);if(btn.getText().equals("删除文章")){btn.click();driver.confirm();break;}}//预期结果: 展台显示暂无内容WebElement h1 = driver.findElementByCss("h1");assertNotNull(h1);assertEquals(h1.getText(),"暂无内容");}}/*** 测试博客修改模块*/@Nested@Disabledpublic class ModifyTest{@SneakyThrows@ParameterizedTest@CsvFileSource( files = "src/test/resources/TestSource/BlogDetail.csv")void test(String title,String content){Driver driver = new Driver();//先写入一篇文章Tool.pub_blog(driver,"测试","测试");//修改文章List<WebElement> elements = driver.findElements("#app .el-main .el-main");WebElement el = elements.get(0);List<WebElement> lists = el.findElements(By.cssSelector("button"));for(int i = 0;i<lists.size();i++){WebElement btn = lists.get(i);if(btn.getText().equals("修改文章")){btn.click();break;}}sleep(100);//输入修改内容WebElement Title = driver.findElementByCss("#add_title");Actions actions = new Actions(driver.getWebDriver());//输入内容actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(content).perform();new Actions(driver.getWebDriver()).click(Title).perform();//输入标题actions.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).sendKeys(title).perform();WebElement submitEl = driver.findElementByCss("#submit");submitEl.click();sleep(100);driver.reject();String CurUrl = driver.getUrl();sleep(500);//预期结果: 页面跳转到我的博客页面 且标题内容与修改相同String IndexTitle = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > header:nth-child(1) > header:nth-child(1) > h2").getText();String IndexContent = driver.findElementByCss("#app > div > section > div.el-scrollbar > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > section > section > main > section > main > span").getText();assertEquals(CurUrl,PublicVariable.MyBlogUrl);assertEquals(IndexTitle,title);assertEquals(IndexContent,content);}}/*** 测试博客主页模块*/@Nestedpublic class IndexTest{@Testvoid test() {//插入多篇文章Tool.pub_blog(new Driver(), "测试", "测试");Tool.pub_blog(new Driver(), "测试", "测试");Driver driver  = new Driver();driver.MaxWindow();driver.get(PublicVariable.IndexUrl);WebElement pageNum = driver.findElementByCss("#app > div > section > div.pagination > div > ul > li");//预期结果 分页数目大于1assertNotEquals(Integer.parseInt(pageNum.getText()),1);}}}

被测试项目源代码链接:https://github.com/911400586/Blog_System
自动化脚本源代码:https://github.com/911400586/Blog_Auto_Test

五.编写测试报告

点击下方连接查看详细测试报告
博客系统测试报告

六.项目总结

测试用例根据用户需求分析来设计,而且有整体框架,算是比较详细全面。
有待改善的地方:
系统中有一些模块的功能是类似的,导致设计测试用例的时候重复,略显冗余。
系统中的一些功能模块,设计出的测试用例覆盖率较低。

相关文章:

博客系统自动化测试项目实践

文章目录 一.测试需求分析1.功能分析2.非功能分析 二.制定测试方案&#xff08;计划 策略&#xff09;三.编写测试用例四.执行自动化测试用例五.编写测试报告六.项目总结 一.测试需求分析 1.功能分析 通过功能测试需求分析 2.非功能分析 非功能分析主要从:界面,性能,安全性,…...

软考高级之系统架构师系列之操作系统基础

概念 接口 操作系统为用户提供两类接口&#xff1a;操作一级的接口和程序控制一级的接口。操作一级的接口包括操作控制命令、菜单命令等&#xff1b;程序控制一级的接口包括系统调用。 UMA和NUMA UMA&#xff0c;统一内存访问&#xff0c;Uniform Memory Access&#xff0c…...

制作一个可以arm架构下运行的docker镜像(for Python)

看完本篇文章&#xff0c;你将得到一个可以arm架构下运行的python 基础镜像。 题外话 这里直接说docker镜像有点儿草率&#xff0c;因为目前很多容器都是Podman了。 podman的介绍 arm和aarch傻傻分不清楚 现在这两个是一样的意思了。 arm64和aarch64之间的区别 开始制作镜…...

Goland连接服务器/虚拟机远程编译开发

创建SSH连接 SSH用于与远程服务器建立连接 Settings -> Tools -> SSH Configurations 添加新的ssh连接&#xff0c;Host为ip地址&#xff0c;Username为用户名&#xff0c;认证方式这里选择密码验证 全部填完后可以点击Test Connection测试连接是否成功 创建Deployment…...

大数据Doris(十四):Doris表中的数据基本概念

文章目录 Doris表中的数据基本概念 一、​​​​​​​Row & Column...

【Linux】Linux环境配置以及部署项目后端

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Linux环境配置 1.JDK ①上传安装包到…...

RabbitMQ消费者的可靠性

目录 一、消费者确认 二、失败重试机制 2.1、失败处理策略 三、业务幂等性 3.1、唯一消息ID 3.2、业务判断 3.3、兜底方案 一、消费者确认 RabbitMQ提供了消费者确认机制&#xff08;Consumer Acknowledgement&#xff09;。即&#xff1a;当消费者处理消息结束后&#x…...

云计算助力史上首届“云上亚运”圆满成功!

201金&#xff0c;魔幻的BGM&#xff0c;以及崛起的中国科技&#xff0c;让杭州亚运会成功出圈。 很多网友表示太震撼了&#xff01;开幕式很漂亮&#xff0c;杭州为了奥运造新城真豪横&#xff0c;看完一整个文化自信住&#xff01; 赛场内外除了无数个令人感动的瞬间&#…...

博彦科技:以金融为起点,凭借创新技术平台真打实干

【科技明说 &#xff5c; 重磅专题】 成立于1995年的博彦科技&#xff0c;已有28年左右的发展历程。 我没有想到&#xff0c;博彦科技也对AIGC领域情有独钟。博彦科技自研的数字人产品SaaS平台&#xff0c;可以接入包括百度文心一言、阿里通义千问等AI大模型产品。可见&#…...

NLP实践——中文指代消解方案

NLP实践——中文指代消解方案 1. 参考项目2. 数据2.1 生成conll格式2.2 生成jsonline格式 3. 训练3.1 实例化模型3.2 读取数据3.3 评估方法3.4 训练方法 4. 推理5. 总结 1. 参考项目 关于指代消解任务&#xff0c;有很多开源的项目和工具可以借鉴&#xff0c;比如spacy的基础模…...

【Redis】认识Redis-特点特性应用场景对比MySQL重要文件及作用

文章目录 认识redisredis的主要特点redis的特性&#xff08;优点&#xff09;redis是单线程模型&#xff0c;为什么效率这么高&#xff0c;访问速度这么快redis应用场景redis不可以做什么MySQL和Redis对比启动RedisRedis客户端Redis重要文件及作用 认识redis redis里面相关的小…...

goland setup go env

go env -w设置的变量&#xff0c;在goland中不生效&#xff0c;需要额外配置。 点击goland->preference&#xff0c;在go module里&#xff0c;设置go环境变量即可。...

如何打造一支敏捷测试团队

文章目录 摘要01 从测试角度理解敏捷理念什么是敏捷&#xff1f;测试人员应该怎样理解敏捷理念&#xff1f;敏捷宣言对于测试活动的启发与思考总结如下。敏捷原则12条敏捷实践框架为什么要做敏捷 02 什么是敏捷测试03 敏捷测试为什么会失败04 诊断脑暴会的成果示例敏捷测试原则…...

STM32F40EZT6 PWM可控制电压原理

PWM可控制电压原理 主要通过PWM 输入模式根据控制单位时间内输出的平均电压&#xff0c;以调节电压大小。而PWM输出模式通过调节占空比&#xff0c;控制平均电压大小&#xff1b; 设置TIM为PWM输出模式 第一步&#xff1a;时钟使能&#xff1a; GPIO&#xff0c;TIM; 第二步&a…...

信号灯集,消息队列

信号灯集 1、概念 信号灯(semaphore)&#xff0c;也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制&#xff1b;System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯。 通过信号灯集实现…...

我在Vscode学OpenCV 初步接触

OpenCV是一个开源的计算机视觉库&#xff0c;可以处理图像和视频数据。它包含了超过2500个优化过的算法&#xff0c;用于对图像和视频进行处理&#xff0c;包括目标识别、面部识别、运动跟踪、立体视觉等。OpenCV支持多种编程语言&#xff0c;包括C、Python、Java等&#xff0c…...

[threejs]让导入的gltf模型显示边框

边框1效果图如下&#xff1a; 代码如下&#xff1a; const gltfLoader1 new GLTFLoader();gltfLoader1.load( "/assets/box/1/scene.gltf" ,function(gltf){let model gltf.scene;model.scale.set(3,3,3)// scene1.add(model);// renderer1.render(scene1, camera…...

YOLOv5优化:独家创新(SC_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

💡💡💡本文独家改进:独家创新(SC_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐 SC_C_Detect | 亲测在多个数据集能够实现大幅涨点 目录 1. SC_C_Detect介绍 2. SC_C_Detect加入YOLOv5 2.1 新建models/head_improve.py...

作物模型--土壤数据制备过程

作物模型–土壤数据制备过程 首先打开FAO网站 下载下面这两个 Arcgis打开.bil文件 .mdb文件在access中转成.xls格式 Arcgis中对.bil文件定义投影...

学习笔记|单样本t检验|无统计学意义|规范表达|《小白爱上SPSS》课程:SPSS第四讲 | 单样本T检验怎么做?很单纯很简单!

目录 学习目的软件版本原始文档一、实战案例二、案例解析本案例之目的 四、SPSS操作1、正态性检验Tips&#xff1a;无统计学意义 2、t检验结果 五、结果解读六、规范报告1、规范表格2、规范文字 注意划重点 学习目的 SPSS第四讲 | 单样本T检验怎么做&#xff1f;很单纯很简单&…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...