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

news2024/11/18 9:28:17

一)项目简介:

用户管理系统是依据于前后端分离来实现的,是基于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();
    //验证首页元素展示是正确
    @BeforeEach
    public void getUrl(){
        //打开浏览器
        driver.get("http://127.0.0.1:8080/login.html");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
    }
    @Order(1)
    @Test
    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");
    }
    @AfterEach
    public 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();
   // 验证首页元素展示是正确
    @BeforeAll
    public 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"));
    }
    @AfterAll
    public 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.coloradmin.cn/o/1234975.html

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

相关文章

模电 01

一.半导体基本知识 1.优点&#xff1a;体积小、重量轻、使用寿命长、输入功率小、功率转换效率高。 2.性能介于导体与绝缘体 3.常用半导体材料&#xff1a;硅&#xff08;SI&#xff09; 镉&#xff08;Ge&#xff09;,化合物半导体&#xff1a;砷化镓&#xff08;GaAs&…

【封装UI组件库系列】全局样式的定义与重置

封装UI组件库系列第二篇样式​​​​​​​ ​​​​​​&#x1f31f;前言 &#x1f31f;定义全局样式 生成主题色和不同亮度的颜色 ​编辑 中性色及其他变量 &#x1f31f;样式重置 &#x1f31f;总结 ​​​​​​​​​​​​​​&#x1f31f;前言 在前端开发中&…

SpringBoot趣探究--1.logo是如何打印出来的

一.前言 从本篇开始&#xff0c;我将对springboot框架做一个有趣的探究&#xff0c;探究一下它的流程&#xff0c;虽然源码看不懂&#xff0c;不过我们可以一点一点慢慢深挖&#xff0c;好了&#xff0c;下面我们来看一下本篇的知识&#xff0c;这个logo是如何打印出来的&#…

2014年2月24日 Go生态洞察:FOSDEM 2014上的Go演讲精选

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【Echart】Echart设置label太长隐藏:

文章目录 第一种&#xff1a;竖排显示第二种&#xff1a;显示部分第三种&#xff1a;强制显示所有标签并旋转 第一种&#xff1a;竖排显示 xAxis: {type: category,data: res.data.data.sz.xAxis,axisLabel:{fontSize:12,formatter: function(value) {return value.split().joi…

gitlab安装以及创建用户创建组,修改密码 邮箱配置 数据备份与恢复--保姆级教学!

GitLab是一种基于Web的Git仓库管理工具&#xff0c;它允许您在组织或个人级别上创建和管理Git仓库&#xff0c;以便在一个中心位置上执行代码管理和协作工作。GitLab提供了强大的功能&#xff0c;如代码审查、问题跟踪、CI/CD、容器注册表、Wiki和持续集成等。 以下是GitLab的…

gitlab安装配置及应用

安装 ##安装依赖 yum install -y curl policycoreutils-python openssh-server perl#上传包 rz gitlab-jh-16.5.2-jh.0.el7.x86_64.rpm 安装 yum install gitlab-jh-16.0.3-jh.0.el7.x86_64.rpm 初始化并启动 # 以下两种方法都可以配置访问地址&#xff0c;第一种需要在yum安…

2023年【A特种设备相关管理(锅炉压力容器压力管道)】模拟考试题及A特种设备相关管理(锅炉压力容器压力管道)作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;模拟考试题参考答案及A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及A特种设备相关…

[Docker]八.Docker 容器跨主机通讯

一.跨主机通讯原理 在主机192.168.31.140上的docker0(172.17.0.0/16)中有一个容器mycentos( 172.17.0.2/16), 在主机192.168.31.81上的docker0(172.17.0.0/16)中有一个容器mycentos( 172.17.0.2/16),然后在主机192.168.31.140上ping主机192.168.31.81,发现ping不通要实现两个主…

【代数学习题4.1】从零理解范数与迹 —— 求极小多项式

从零理解范数与迹 —— 求极小多项式 写在前面概念解释题目解答 1. 极小多项式极小多项式的求法1. 对 α \alpha α 的极小多项式python求解 2. 对 α 1 \alpha 1 α1 的极小多项式python找到多项式python找到极小多项式 3. 对 α 2 α 1 \alpha^2 \alpha 1 α2α1 的…

高校档案室建设标准-高校数字档案室建设需考虑哪些因素

高校档案室是高等教育机构所建立的档案存放与管理的机构&#xff0c;主要负责高校行政、教学、科研、文化和保密等方面的档案的收集、整理、保存、利用和管理工作。高校档案室是高等教育机构的重要组成部分&#xff0c;旨在为高校的历史研究、管理和服务提供必要的档案资源。同…

STM32F4串口USART发送为00的解决方案

检查接线是否正确检查TX是否为复用推挽输出 3.检查是否将TX和RX引脚重映射为USART功能 在STM32中&#xff0c;每个GPIO引脚可以配置为不同的复用功能&#xff0c;例如UART、SPI、I2C等。具体来说&#xff0c;GPIO_PinAFConfig函数用于配置GPIO引脚的复用功能。它的参数包括GPIO…

Java使用x-www-form-urlencoded发请求

平常在开发过程中用的最多的就是JSON格式&#xff0c;请求编码就是 application/json&#xff0c;但偏偏有些接口是 x-www-form-urlencoded&#xff0c;怎么办呢&#xff0c;重新封装喽 在POSTMan工具是叫 x-www-form-urlencoded 在 APIpost工具中是叫 urlencoded Map<Str…

Monoxide relay机制和连弩挖矿

这篇文章就两个点&#xff0c;relay机制 、 连弩挖矿 relay 最终原子性 Eventual Atomicity 一笔跨链交易&#xff0c;从取款shard中发出&#xff0c;到存款shard中. 当收款shard中将这笔夸片交易打包上链后&#xff0c;原子性才执行结束。 这样做的延迟是比较小的。 如何应…

uniapp、微信小程序返回上页面刷新数据

目录 前言&#xff1a; 方法1&#xff1a; 方法2&#xff1a; 方法3&#xff1a; 前言&#xff1a; 返回上页面刷新数据这个功能主要用于在当前页面点击跳转到另一个页面之后&#xff0c;在另一个页面对数据进行了操作&#xff0c;比如&#xff1a;阅读量&#xff0c;然后返…

接入电商数据平台官方开放平台API接口获取商品实时信息数据,销量,评论,详情页演示

要接入电商数据平台官方开放平台API接口获取商品实时信息数据、销量、评论和详情页演示&#xff0c;需要按照以下步骤进行操作&#xff1a; 找到可用的API接口&#xff1a;首先&#xff0c;需要找到支持查询商品信息的API接口。可以在电商数据平台的官方开放平台上查找相应的AP…

react等效memo的方法

视频教程 前端技术&#xff5c;Dan博客&#xff5c;在你写memo()之前_哔哩哔哩_bilibili 把与ExpensiveTree的无关的dom做成一个组件 第二种情况&#xff0c;color在ExpensiveTree组件的父级dom 创建一个组件&#xff0c;将state的color和input写上&#xff0c;而ExpensiveTr…

【智能优化算法】从蚁群到动物园

目录 引言蚁群优化算法&#xff08;ACO&#xff09;ACO 机理ACO 模型描述ACO 移动策略 粒子群优化算法&#xff08;PSO&#xff09;PSO 机理PSO 模型描述 萤火虫群优化算法&#xff08;GSO&#xff09;GSO 机理GSO 模型描述 群智能优化算法 引言 21世纪&#xff0c;人类社会已经…

梯度引导的分子生成扩散模型- GaUDI 评测

GaUDI模型来自于以色列理工Tomer Weiss的2023年发表在预印本ChemRxiv上的工作 《Guided Diffusion for Inverse Molecular Design》。原文链接&#xff1a;Guided Diffusion for Inverse Molecular Design | Materials Chemistry | ChemRxiv | Cambridge Open Engage GaUDI模型…