JAVA项目测试----用户管理系统

一)项目简介:

用户管理系统是依据于前后端分离来实现的,是基于Spring SpringBoot Spring MVC,SpringAOP,MyBatis等框架来实现的一个用户管理网站,并且已经部署到了云服务器上,

目前的用户管理系统实现了超级管理员的注册功能,用户管理员的新增,删除,修改,用户分页展示,批量删除,多条件查询等功能

二)测试计划:

测试对象:基于SSM实现的用户管理系统

测试目的:验证用户管理系统是否可以正常的运行,验证用户管理系统是否符合用户的需求

测试点:主要针对常用的主流程功能进行测试,除此之外还有界面测试+功能测试+兼容性测试+安全性测试+可靠性测试+容错性测试+性能测试+网络测试;

测试方法:主要使用黑盒测试方法,自动化测试工具使用Selenium4+junit5

三)手工测试用例的编写:

 飞书访问链接:https://nxqjlyz94q2.feishu.cn/wiki/GwIRwI5Ebi3qtDkfJq4cG3bPnWe?create_from=create_doc_to_wiki#mindmap

一)针对于登录界面进行测试:

一)界面测试:


二)功能测试:

三)兼容性+易用性+安全性测试+性能测试:

4)可靠性:让软件运行几周,软件正常运行的时间/软件在这段期间运行的时间+软件在这段期间出故障的时间

二)针对于用户列表页进行功能测试:(其他非功能测试和上出的登录非功能测试类似)

三)针对于用户修改页面和用户修改页面进行功能测试(其他非功能测试和上出的登录非功能测试类似)

四)基于selenium4+junit5进行自动化测试

创建全局驱动对象,避免频繁创建销毁

一)针对于登录界面进行自动化测试

1)校验首页是否正常展示功能并且通过多参数验证用户登录功能


@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest  {private static ChromeDriver driver= (ChromeDriver) CommonDriver.getDriver();//验证首页元素展示是正确@BeforeEachpublic void getUrl(){//打开浏览器driver.get("http://127.0.0.1:8080/login.html");driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));}@Order(1)@Testvoid CheckElementLogin(){//1.检查页面上一些文字的显示,url是否正确String text1=driver.findElement(By.cssSelector("#body > div > h3")).getText();String text2=driver.findElement(By.cssSelector("#body > div > div:nth-child(2) > label")).getText();String text3=driver.findElement(By.cssSelector("#body > div > div:nth-child(3) > label")).getText();String text4=driver.findElement(By.cssSelector("#submit")).getAttribute("value");String url=driver.getCurrentUrl();//2.校验信息元素是否正确,比如说校验文本是否符合预期Assertions.assertEquals(text1,"管理员登录");Assertions.assertEquals(text2,"用户名:");Assertions.assertEquals(text3,"密码:");Assertions.assertEquals(text4,"登录");Assertions.assertEquals(url,"http://127.0.0.1:8080/login.html");}@AfterEachpublic void close(){driver.close();}
}

2)针对于登录构建多数据登录

@ParameterizedTest@MethodSource("loginData")public void login(String username,String password) throws InterruptedException {//定位到登陆页面中的输入框核按钮进行登陆操作driver.findElement(By.cssSelector("#loginname")).sendKeys(username);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(10);}public static Stream<Arguments> loginData(){return Stream.of(Arguments.arguments("张三","123"),Arguments.arguments("zhangsan","admin"));}
多组参数化执行本身不会新打开一个浏览器的窗口重新进行输入第二组参数化的执行还是使用的是第一组参数画的界面,比如说构造数据的时候会出现当时用到第一组参数化的构造的参数以后,此时还会针对于第二组参数来进行参数化的构造(此时和第一组参数使用的是同一个界面),如果说此是针对于第一组参数用户登陆成功了,直接跳转到列表页了,那么当第二组参数参数构造以后,系统执行以后发现此时页面是在列表页,自然无法定位到输入框和按钮,此时就会出现nosuchelement异常

@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest  {private static ChromeDriver driver=  CommonDriver.getDriver();// 验证首页元素展示是正确@BeforeAllpublic static void getUrl(){//打开浏览器driver.get("http://127.0.0.1:8080/login.html");driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));}@Test@Order(2)void CheckElementLogin(){//1.检查页面上一些文字的显示,url是否正确String text1=driver.findElement(By.cssSelector("#body > div > h3")).getText();String text2=driver.findElement(By.cssSelector("#body > div > div:nth-child(2) > label")).getText();String text3=driver.findElement(By.cssSelector("#body > div > div:nth-child(3) > label")).getText();String text4=driver.findElement(By.cssSelector("#submit")).getAttribute("value");String url=driver.getCurrentUrl();//2.校验信息元素是否正确,比如说校验文本是否符合预期Assertions.assertEquals(text1,"管理员登录");Assertions.assertEquals(text2,"用户名:");Assertions.assertEquals(text3,"密码:");Assertions.assertEquals(text4,"登录");Assertions.assertEquals(url,"http://127.0.0.1:8080/login.html");}//@ParameterizedTest@Order(1)@MethodSource("loginData")public void login(String username,String password) throws InterruptedException {//这个参数化本身不会新打开一个浏览器的窗口重新进行输入//定位到登陆页面中的输入框核按钮进行登陆操作driver.findElement(By.cssSelector("#loginname")).sendKeys(username);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();//第一组参数构造失败以后,登陆失败,手动使用Alert框来将输入框按钮按下Alert alert=driver.switchTo().alert();alert.accept();Thread.sleep(10);}public static Stream<Arguments> loginData(){return Stream.of(Arguments.arguments("zhangsan","admin"));}@AfterAllpublic static void close() throws InterruptedException {driver.close();}
}

1)通过上面进行参数化的校验以后,就可以构造成正确的用户名和错误密码来进行测试,还可以根据更多的测试点进行测试

2)一定要注意driver.getAttribute()是获取到对应的属性值,element的getText方法是用来获取html标签内的文本的值的;

二)针对于列表页+新增用户进行测试:

校验添加完成元素成功以后是否成功跳转到了首页,校验一些重要信息是否正确

@TestMethodOrder(MethodOrderer.class)
public class ListTest {public int count=0;private static ChromeDriver driver=CommonDriver.getDriver();//1.检测列表页中的元素信息,校验当前页面中的元素是否符合预期@Test@Order(1)public void TestList() throws InterruptedException {//1.前提是必须用户登录过了,不会打回给前端driver.get("http://127.0.0.1:8080/login.html");driver.findElement(By.cssSelector("#loginname")).sendKeys("zhangsan");driver.findElement(By.cssSelector("#password")).sendKeys("admin");driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(3000);//2.点击登录按钮Alert alert=driver.switchTo().alert();alert.accept();Thread.sleep(3000);//显示等待,防止程序执行速度远远高于代码执行速度而导致页面无法抓取元素//3.校验首页信息是否正确String text1=driver.findElement(By.xpath("/html/body/div/h3")).getText();Assertions.assertEquals(text1,"用户信息列表");String text2=driver.findElement(By.cssSelector("body > div > div:nth-child(2) > form > div:nth-child(2) > label")).getText();Assertions.assertEquals(text2,"籍贯");//4.跳转到新增用户界面,并验证新增界面的一些元素是否正确driver.findElement(By.cssSelector("body > div > div:nth-child(3) > a:nth-child(1)")).click();String text=driver.findElement(By.cssSelector("body > div > h3")).getText();Assertions.assertEquals(text,"添加用户");}//2.进入到新增用户的界面,进行添加信息以后跳转到首页@Order(2)@ParameterizedTest@MethodSource("")public void TestAddUser(User user) throws InterruptedException {//1.填写登陆名字,用户名密码和登陆密码driver.findElement(By.cssSelector("#loginname")).sendKeys(user.getLoginname());driver.findElement(By.cssSelector("#username")).sendKeys(user.getUsername());driver.findElement(By.cssSelector("#password")).sendKeys(user.getPassword());driver.findElement(By.cssSelector("#password2")).sendKeys(user.getPassword());//2.填写对应的按钮的操作if(user.getSex().equals("男")) driver.findElement(By.cssSelector("#man")).click();else driver.findElement(By.cssSelector("#women")).click();//3.下拉框Select select=new Select(driver.findElement(By.cssSelector("#address")));select.selectByVisibleText(user.getAddress());//4.qq邮箱driver.findElement(By.cssSelector("#qq")).sendKeys(user.getQq());driver.findElement(By.cssSelector("#email")).sendKeys(user.getEmail());driver.findElement(By.cssSelector("#age")).sendKeys(""+user.getAge());if(user.getIsadmin()==1) driver.findElement(By.cssSelector("#admin_yes")).click();else  driver.findElement(By.cssSelector("#admin_no")).click();//5.点击按钮driver.findElement(By.cssSelector("#btn_sub")).click();//6.是否继续添加Thread.sleep(4000);Alert alert=driver.switchTo().alert();alert.accept();alert.accept();//首先弹出对话框添加成功,然后弹出对话框是否手动添加,可以通过增加的动态参数的user个数来灵活地进行调配}public static Stream<User> TestAddUser() throws InterruptedException {User user1=new User();user1.setUsername("wangwu");user1.setPassword("wangwu");user1.setLoginname("wangwu");user1.setIsadmin(1);user1.setAddress("北京");user1.setEmail("wangwu");user1.setSex("男");user1.setAge(10);user1.setQq("123");Thread.sleep(3000);User user2=new User();user2.setUsername("lisi");user2.setPassword("lisi");user2.setLoginname("lisi");user2.setIsadmin(1);user2.setAddress("上海");user2.setEmail("lisi");user2.setSex("男");user2.setAge(10);user2.setQq("123");Thread.sleep(3000);return Stream.of(user1,user2);}
}
三)针对于列表页和删除用户进行测试:

删除单个用户

删除多个用户

四)针对于列表页和批量查询用户做测试:
五)针对于列表页和修改用户做测试:

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

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

相关文章

竞赛 题目:基于深度学习的手势识别实现

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的手势识别实现 该项目较为新颖&#xff0c;适合作为竞赛课题…

python中Thread实现多线程任务

目录 多线程概括&#xff1a; 使用 Thread 模块创建线程 如果不使用多线程&#xff1a; 多线程概括&#xff1a; 多线程是一种并发执行的编程方式&#xff0c;允许程序同时执行多个独立的线程&#xff0c;每个线程在程序中运行独立的任务。每个线程都是程序的基本执行单元&a…

csdn - mermaid

目录 方向节点样式形状箭头 子图流程图类图uml图甘特图 https://blog.csdn.net/sandalphon4869/article/details/89341443 https://blog.csdn.net/swinfans/article/details/89393853 https://zhuanlan.zhihu.com/p/614018391 https://blog.csdn.net/qq_42491125/article/detai…

万字长文深入理解 cache,写出高性能代码

CACHE的一致性 Cache的一致性有这么几个层面 1. 一个CPU的icache和dcache的同步问题 2. 多个CPU各自的cache同步问题 3. CPU与设备&#xff08;其实也可能是个异构处理器&#xff0c;不过在Linux运行的CPU眼里&#xff0c;都是设备&#xff0c;都是DMA&#xff09;的cache同…

用百度AI大模型给头像换风格

心血来潮想尝试尝试AI小应用&#xff0c;给图片加个风格&#xff08;例如微信头像&#xff09;&#xff0c;于是有了这篇简短的教程 目录 1. 领取免费资源2. 在应用列表创建应用3. 在线API调试4. 效果对比 1. 领取免费资源 网站&#xff1a;百度智能云 百度给提供了很多AIGC的…

OpenCV入门7——OpenCV中的滤波器(包括低通滤波与高通滤波,其中低通滤波用于降噪,而高通滤波用于边缘检测)

文章目录 图像滤波卷积相关概念锚点 实战图像卷积Blur an image with a 2d convolution matrix 方盒滤波与均值滤波高斯滤波中值滤波双边滤波高通滤波—索贝尔算子高通滤波—沙尔算子高通滤波—拉普拉斯算子边缘检测Canny 图像滤波 卷积核滤波器 卷积相关概念 锚点 锚点…

详解硬盘的接口、总线和协议

总线&#xff1a;总线是计算机系统中用于连接各个硬件组件的一种通信方式&#xff0c;它可以实现数据、地址和控制信号的传输。在服务器中&#xff0c;内部总线起着承载数据和控制信号的重要作用。总线在单位时间内能传输数据量称为带宽。分为SATA&#xff0c;SAS&#xff0c;P…

linux 系统调用流程分析

x86 1.系统调用 系统调用是用户空间程序与内核交互的主要机制。系统调用与普通函数调用不同&#xff0c;因为它调用的是内核里的代码。使用系统调用时&#xff0c;需要特殊指令以使处理器权限转换到内核态。另外&#xff0c;被调用的内核代码由系统调用号来标识&#xff0c;而…

牛顿迭代法求平方根--C++简单实现

1. 简介 牛顿迭代法是求近似根的一种方法。 以求平方根为例。 如 x 2 m x^2m x2m 令 f ( x ) x 2 − m f(x)x^2-m f(x)x2−m 则 f ′ ( x ) 2 x f(x)2x f′(x)2x 函数 f ( x ) f(x) f(x)在 x 0 x_0 x0​处的切线方程为 g ( x ) f ′ ( x 0 ) ( x − x 0 ) f ( x 0 ) g(…

Android studio Build Log乱码+错误: 找不到符号符号

控制台输出乱码&#xff0c;首先解决乱码问题&#xff0c;才可以精确的知道问题所在&#xff1b; android studio>Help>Edit Custom VM Options... 输出一行代码在里面&#xff0c;保存&#xff0c;重启IDE -Dfile.encodingUTF-8 Clean 一下工程&#xff0c;然后Rebu…

【Django-02】 Model模型和模型描述对象Meta

Model和Meta 概念ModelMetaModel支持的字段类型Meta 属性例子 概念 就是对象的意思&#xff0c;底层一个Model对应一张表&#xff0c;而Meta是Model的内部类&#xff0c;是用来描述Model和数据库表的相关元数据信息&#xff0c;比如主键&#xff0c;排序&#xff0c;unique_ke…

上门维修安装派单系统小程序APP开发之会员级别设计深度解析

啄木鸟鲁班大师上门安装维修平台APP开发之VIP会员解析&#xff0c;在APP或者小程序里设置的会员叫VIP级别会员&#xff0c;系统一共分为4种会员&#xff0c;注册会员&#xff0c;正式会员&#xff0c;VIP金卡会员&#xff0c;VIP钻卡会员。注册用户是指注册了平台但是没有消费记…

预计2023年交付35万台,增速超400%!HUD硬核玩家强势崛起

随着HUD市场渗透率加速提升&#xff0c;其高速增长期已经来临。 W-HUD和AR-HUD在中国市场的萌芽导入期是在2020年前后&#xff0c;此前HUD市场不温不火&#xff0c;主要归因于以往W-HUD FOV较小&#xff0c;成像画面有限&#xff0c;显示内容简单且效果粗糙&#xff1b;而AR-H…

解决selenium使用chrome下载文件(如pdf)时,反而打开浏览器的预览界面

文章目录 解决方法完整的配置 解决方法 在初始化浏览器的时候&#xff0c;添加以下配置即可&#xff1a; option webdriver.ChromeOptions()prefs {"profile.managed_default_content_settings.images": 2, # 禁止加载图片# permissions.default.stylesheet: 2, …

Linux下使用宏定义判断系统架构和系统类型

文章目录 查看编译器当前支持的宏定义查找指定的宏不同架构不同系统 附录-编译器内部常用的一些宏定义宏定义实际应用使用宏定义判断系统架构使用宏定义判断系统类型 一般情况下在linux下做C/C方面的开发不需要太关注系统架构&#xff0c;当然如果涉及到不同架构下的适配问题&a…

软考小记-软件工程

模块的控制范围包括模块本身及其所有的从属模块。模块的作用范围是指模块一个判定的作用范围&#xff0c;凡是受这个判定影响的所有模块都属于这个判定的作用范围.&#xff0c;原则上一个模块的作用范围应该在其控制范围之内&#xff0c;若没有&#xff0c;则可以将判定所在模块…

安装向量数据库milvus及其Attu

前置条件安装docker compose 在宿主机上创建文件目录 mkdir -p /home/sunyuhua/milvus/db mkdir -p /home/sunyuhua/milvus/conf mkdir -p /home/sunyuhua/milvus/etcd下载docker-compose.yml wget https://github.com/milvus-io/milvus/releases/download/v2.2.11/milvus-s…

OpenGL_Learn14(光照贴图)

1. 漫反射贴图 在光照场景中&#xff0c;它通常叫做一个漫反射贴图(Diffuse Map)&#xff08;3D艺术家通常都这么叫它&#xff09;&#xff0c;它是一个表现了物体所有的漫反射颜色的纹理图像。 我们会将纹理储存为Material结构体中的一个sampler2D 。我们将之前定义的vec3漫反…

积分...

黎曼积分: ∫ a b f ( x ) d x lim ⁡ m a x Δ x i − > 0 ∑ 0 n f ( z i ) Δ x i \int_a^bf(x)dx\lim\limits_{max \Delta x_i->0}\sum_0^nf(z_i)\Delta x_i ∫ab​f(x)dxmaxΔxi​−>0lim​∑0n​f(zi​)Δxi​ Δ x i x i − x i − 1 \Delta x_ix_i-x_{i-1…

AI技术实力认证,宏电股份荣获2023年度AI天马“领军企业”

近日&#xff0c;由中国新一代人工智能发展战略研究院指导&#xff0c;深圳市人工智能产业协会主办&#xff0c;广东未来产业研究院承办的2023年度“AI天马”认定最终结果公布&#xff0c;宏电股份荣获AI天马“领军企业”奖项。 宏电股份基于20余年的技术沉淀&#xff0c;在工业…