IT论坛测试

目录

一、项目介绍

项目名称

项目简介

相关技术

项目展示

二 、测试用例设计和功能测试

测试用例设计

注册页面

登陆页面 

首页面

发布帖子页面 

修改个人信息页面 

功能测试 

注册页面

登录页面

首页面

 发布帖子页面

 修改个人信息页面

 三、接口测试

1.Junit单元测试

用户接口 

2.Swagger API测试

接口测试版块总览:

 回复接口:

帖子接口: 

版块接口: 

用户接口:

站内信接口: 

 四 自动化测试

1.使用selenium进行自动化测试准备工作

1)引入依赖

2)创建公共类

 3)创建测试套件类

2.对登录页面进行自动化测试


一、项目介绍


项目名称

        IT论坛

项目简介

        IT 论坛项⽬围绕帖⼦与⽤⼾两个核⼼⻆⾊进⾏业务处理,可以对帖⼦增删改查,点赞,回复,对⽤⼾注册登录、信息的修改等。

相关技术

  1. 使⽤统⼀返回格式+全局错误信息定义处理前后端交互时的返回结果;
  2. 使⽤拦截器实现⽤⼾登录校验,方便效验用户信息;
  3. 使⽤MybatisGeneratorConfig⽣成常用的增删改查⽅法,简化代码编写;
  4. 集成 Swagger 实现⾃动⽣成 API 测试接⼝,方便后端接口测试;
  5. 使⽤jQuery 完成 AJAX 请求,并处理 HTML⻚⾯标签。
  6. 引入了 editor.md,editor.md 是一个开源的页面 markdown 编辑器组件

项目展示

访问地址: http://8.130.53.233:8848/sign-in.html
源码地址: https://gitee.com/zhang-qi715/forum

二 、测试用例设计和功能测试


测试用例设计

测试用例会从功能测试,界面测试,兼容性测试,易用性测试,安全性测试,性能测试六个方面进行设计。

注册页面

登陆页面 

首页面

发布帖子页面 

修改个人信息页面 

功能测试 

注册页面

输入用户名

输入昵称输入密码输入确认密码勾选同意条款点击注册预期结果实际结果
不勾选点击提示不能为空每个输入框下都提示不能为空
张三不勾选点击除用户名外都提示不能为空其余三个提示不能为空
张三张三123456111111不勾选点击提示密码和确认密码不相同提示请检查确认密码
张三张三123456123456不勾选点击提示勾选条款勾选框标红,点击注册结果无效
张三张三123456123456勾选点击注册成功注册成功,跳转到登录页面

登录页面

给定一个正确的用户名和密码。

用户名:张三

密码:123456 

输入用户名输入密码操作预期结果实际结果
点击登录提示用户名和密码不能为空提示用户名和密码不能为空
zhangsan(错误用户名)点击登录提示密码不能为空提示密码不能为空
zhangsan(错误用户名)123456点击登录提示用户名或密码错误提示用户名或密码错误
张三111111点击登录提示用户名或密码错误提示用户名或密码错误
张三123456点击登录登录成功登录成功,跳转首页面

首页面

操作预期结果实际结果
点击Java跳转到Java板块跳转到Java板块
点击“测试”跳转到帖子详情页跳转到帖子详情页
点击发布帖子跳转到发布帖子页面跳转到发布帖子页面
点击月亮图标切换到夜间模式切换到夜间模式
点击铃铛图标显示站内信显示站内信

 发布帖子页面

输入标题输入内容操作预期结果实际结果
点击发布提示请输入帖子标题提示请输入帖子标题
测试标题点击发布提示请输入帖子内容提示请输入帖子内容
测试标题测试内容点击发布发布成功发布成功,跳转至首页

 修改个人信息页面

操作预期结果实际结果
点击修改头像,上传头像头像变更为刚上传的头像图片无变化(修改头像功能未实现)
输入邮箱地址,点击修改修改成功修改成功
输入电话号码,点击修改修改成功修改成功
输入错误原密码,点击提交提示密码效验失败提示密码效验失败
输入正确原密码,新密码和确认密码不同,点击提交提示两次密码输入不相同提示两次密码输入不相同
输入正确原密码,新密码和确认密码相同,点击提交修改成功修改成功

 三、接口测试


1.Junit单元测试

这里我展示一个单元测试

用户接口 

@SpringBootTest
class UserServiceImplTest {@Resourceprivate IUserService userService;@Resourceprivate ObjectMapper objectMapper;@Testvoid selectByName() throws JsonProcessingException {User user = userService.selectByName("bitboy");System.out.println(objectMapper.writeValueAsString(user));System.out.println("=====================================");user = userService.selectByName("bitboy111");System.out.println(objectMapper.writeValueAsString(user));}@Testvoid createNormalUser() {// 构造用户User user = new User();user.setUsername("TestUser1");user.setNickname("单元测试用户1");user.setPassword("123456");user.setSalt("123456");// 调用ServiceuserService.createNormalUser(user);System.out.println("注册成功");System.out.println("=====================");user.setUsername("bitboy");userService.createNormalUser(user);System.out.println("注册成功");}@Testvoid login() throws JsonProcessingException {User user = userService.login("bitboy", "123456");System.out.println(objectMapper.writeValueAsString(user));user = userService.login("123456", "123456");System.out.println(objectMapper.writeValueAsString(user));}@Testvoid selectById() throws JsonProcessingException {User user =  userService.selectById(1L);System.out.println(objectMapper.writeValueAsString(user));user =  userService.selectById(2L);System.out.println(objectMapper.writeValueAsString(user));}@Test@Transactionalvoid addOneArticleCountById() {userService.addOneArticleCountById(1L);System.out.println("更新成功");userService.addOneArticleCountById(2L);System.out.println("更新成功");userService.addOneArticleCountById(10L);System.out.println("更新成功");}
}

其余单元测试可以参考我的gitee链接:forum: 基于 Spring 的前后端分离的论坛系统 - Gitee.com

2.Swagger API测试

测试链接:(得先在本地启动项目)http://127.0.0.1:8888/swagger-ui/index.html#/

接口测试版块总览

 回复接口:

帖子接口: 

版块接口: 

用户接口:

站内信接口: 

这里展示一个接口的一个功能测试过程:

用户接口的登录过程:

过程:

 

结果:

 

 四 自动化测试


1.使用selenium进行自动化测试准备工作

1)引入依赖

创建一个maven项目,在pop.xml中引入以下依赖

    <dependencies><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.2</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.9.2</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite --><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version><scope>test</scope></dependency><!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite --><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.1</version><scope>test</scope></dependency></dependencies>

2)创建公共类

因为对每一个页面进行测试都需要创建浏览器驱动,所以我们可以把他提取出来并设置成静态的,就可以让创建和销毁驱动的操作只实现一次,其他类都继承这个类即可。

public class AutoTestUtils {private static ChromeDriver driver;public static ChromeDriver createDrive() {if (driver == null) {driver = new ChromeDriver();// 隐式等待, 渲染页面, 防止找不到页面元素driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);}return driver;}
}

 3)创建测试套件类

创建一个类,通过@Suite注解识别该类为测试套件类,使用@SelectClasses来注解声明我们要运行哪些类。

 

@Suite
@SelectClasses({LoginTest.class, IndexTest.class})
public class RunSuite {
}

2.对登录页面进行自动化测试

①打开登陆网页


②对登陆页面上的文字进行判断
页面上的用户名,密码,登录按钮是否都正常显示
点击注册按钮能否正常跳转页面


③测试窗口伸缩
测试窗口缩小至指定大小,放大到最大

④错误的登录测试
用户名为空,提示用户名不能为空
密码为空,提示密码不能为空
用户名密码不匹配,提示用户名或密码错误


⑤正确的登录测试
输入正确的用户名与密码,登陆成功,跳转至首页,判断跳转的url是否正确,以及跳转页面上的文字是否显示正确

⑥运行结果
测试全部通过

代码详情:

/*** @author: ZQ* @date: 2023/8/27 17:42* @description:*/
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest extends AutoTestUtils {// 获取浏览器驱动public static ChromeDriver driver = createDrive();/*** 打开网页*/@Test@BeforeAllstatic void init() {// 跳转到登录页面driver.get("http://8.130.53.233:8848/sign-in.html");// 隐式等待页面加载完成driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);}//    /**
//     * 对登陆页面的一些文字显示进行判断
//     */
//    @Test
//    @Order(1)
//    void loginPageTest() {
//        // 检查系统名称
//        String expect = "用户登录";
//        String actual = driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2")).getText();
//        Assertions.assertEquals(expect, actual);
//        // 判断登录窗口的内容
//        String expect2 = driver.findElement(By.cssSelector("#signInForm > div.mb-3 > label")).getText();
//        Assertions.assertEquals(expect2, "用户名");
//        String expect3 = driver.findElement(By.cssSelector("#signInForm > div.mb-2 > label")).getText();
//        Assertions.assertEquals(expect3, "密码");
//        // 检查登陆按钮是否存在
//        driver.findElement(By.cssSelector("#submit"));
//        // 检查注册按钮是否存在
//        driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a"));
//        // 点击注册按钮
//        driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a")).click();
//        // 判断跳转页面是否正确
//        String url = driver.getCurrentUrl();
//        Assertions.assertEquals(url, "http://8.130.53.233:8848/sign-up.html");
//    }/*** 测试窗口伸缩*/@Test@Order(2)public void windowSize() {driver.manage().window().setSize(new Dimension(900, 900));driver.manage().window().setSize(new Dimension(300, 300));driver.manage().window().maximize();}/*** 错误登录测试1*/@ParameterizedTest@Order(4)@CsvSource(value = {"张三, 12345"})void loginAbnormal1(String username, String password) {// 清空用户名和密码driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();// 用户名为空driver.findElement(By.cssSelector("#username")).click();driver.findElement(By.cssSelector("#password")).sendKeys(password);String expect = driver.findElement(By.cssSelector("#signInForm > div.mb-3 > div")).getText();// 断言Assertions.assertEquals(expect, "用户名不能为空");// 密码为空driver.findElement(By.cssSelector("#username")).sendKeys(username);driver.findElement(By.cssSelector("#password")).clear();String expectPass = driver.findElement(By.cssSelector("#signInForm > div.mb-2 > div > div")).getText();// 断言Assertions.assertEquals(expectPass, "密码不能为空");// 返回上一个页面
//        driver.navigate().back();// 这里不需要返回,并未跳转页面}/*** 错误登录测试2*/@ParameterizedTest@Order(4)@CsvSource(value = {"张三, 12345","张三1,123456"})void loginAbnormal2(String username, String password) {// 清空用户名和密码driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();// 输入用户名和密码driver.findElement(By.cssSelector("#username")).sendKeys(username);driver.findElement(By.cssSelector("#password")).sendKeys(password);// 点击登录driver.findElement(By.cssSelector("#submit")).click();// 等待弹窗内容driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 判断弹窗内容String expect = driver.findElement(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div > h2")).getText();// 断言Assertions.assertEquals(expect, "警告");// 返回上一个页面
//        driver.navigate().back();// 这里不需要返回,并未跳转页面}/*** 正确登录测试*/@ParameterizedTest@Order(4)@CsvSource(value = {"张三, 123456","李四, 123456"})void loginNormal(String username, String password) {// 清空用户名和密码driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();// 输入用户名和密码driver.findElement(By.cssSelector("#username")).sendKeys(username);driver.findElement(By.cssSelector("#password")).sendKeys(password);// 点击登录driver.findElement(By.cssSelector("#submit")).click();// 等待跳转页面driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 判断跳转页面urlString url = driver.getCurrentUrl();// 断言urlAssertions.assertEquals(url, "http://8.130.53.233:8848/sign-in.html");// 判断显示是否为首页String expect = driver.findElement(By.cssSelector("#article_list_board_title")).getText();// 断言Assertions.assertEquals(expect, "首页");// 返回上一个页面driver.navigate().back();// 这里不需要返回,并未跳转页面}
}

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

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

相关文章

性能测试流程? 怎么做性能测试?

一、前期准备 性能测试虽然是核心功能稳定后才开始压测&#xff0c;但是在需求阶段就应该参与&#xff0c;这样可以深入了解系统业务、重要功能的业务逻辑&#xff0c;为后续做准备。 二、性能需求分析&#xff08;评审&#xff09; 评审时&#xff0c;要明确性能测试范围、目…

泽众AutoRunner软件的使用方法,以测试win10环境下系统自带的计算器为例

准备工作&#xff1a; 系统&#xff1a;Win10 测试的软件&#xff1a;Win10自带的计算器 本文中AutoRunner软件的下载地址&#xff1a;https://dl.pconline.com.cn/download/1592874-1.html?qq-pf-topcqq.group &#xff08;大家也可以在泽众的官网下载&#xff0c;这个是我随…

【Android入门01】教你从0开发一个计算器软件——say No to “Hello world”,say Hi to Calculator

本文会手把手教你如何从0搭建一个系统自带的计算器应用。 前言 计算器应用只是一个普通的系统原生应用&#xff0c;并不设计数据库、网络交互的内容&#xff0c;也不需要使用MVVM等设计模式和高级的Jetpack组件。只要搞清界面设计和运算逻辑两部分&#xff0c;任何人都可以轻…

php 经纬度范围计算器,经纬度距离角度计算器|经纬度距离角度计算器(geography)下载v2.1 免费版 - 欧普软件下载...

经纬度距离角度计算器是一款简单好用的计算器软件&#xff0c;可以根据开始点、参考点、结束点、距离输出、角度输出等参数计算出两点距离和三点夹角&#xff0c;计算速度快&#xff0c;准确率高&#xff0c;需要的朋友可以来本站下载&#xff01; 经纬度距离角度计算器安装教程…

android中倒计时计算器,死亡计算器生命倒计时下载-死亡计算器生命倒计时软件下载 v8.8.0_5577安卓网...

死亡计算器生命倒计时下载分享给大家。火爆全抖音的生命倒计时&#xff0c;年龄计算器、死亡计算器、倒计时生日提醒等功能。通过精确到小数点的数据来告知人们珍惜时间的重要性&#xff01; 【软件说明】 人生在世三万天&#xff0c;好好珍惜每一刻的时光。独特功能&#xff1…

Linux(多进程与多线程)

目录 1、进程与线程概念 1.1 进程 1.2 线程 1.3 进程与线程区别 2、多进程 2.1多进程概念 2.2 进程相关API 2.3 多进程编程 3、多线程 3.1 多线程概念 3.2 多线程相关API 3.3 多线程编程 1、进程与线程概念 1.1 进程 在计算机科学中&#xff0c;进程是正在执行中…

虚拟机搭建集群

基于3台虚拟机搭建集群架构图 1.服务器准备 使用VMware Workstation虚拟机创建虚拟服务器来搭建集群&#xff0c;所用软件及版本如下&#xff1a; VMware Workstation 12.0 CentOS-6.5-64bit 2.基础虚拟机安装 2.1新建虚拟机&#xff08;虚拟硬件&#xff09; 关键步骤&a…

【web集群简介-01】

文章目录 一、web服务基础二、集群简介 一、web服务基础 web服务器HTTP基本原理 web服务基础HTTP 1.URL / URI URL全称为Uniform Resource Location&#xff0c;统一资源定位符 URI全称为Uniform Resource Identifier&#xff0c;统一资源标识符 URN:统一资源名称 (Uniform Re…

什么是虚拟计算机集群

这个问题来自近期几位网友的私信&#xff0c;他们不约而同问到一个问题&#xff1a;什么是虚拟计算机集群&#xff1f;Laxcus分布式操作系统是如何做的&#xff1f;下面就正式回答一下这个问题。 在我们传统的认知里&#xff0c;或者大家平常比较多接触的&#xff0c;都…

Linux下的5款主流高可用集群软件介绍

Linux集群主要分成三大类:高可用集群(High Availability Cluster)、负载均衡集群(Load Balance Cluster)、科学计算集群(High Performance Computing Cluster)。 其中高可用集群具有保障应用程序持续提供服务的能力,可以将因软、硬件、人为造成的故障对业务的影响降低到最小…

高可用 - 01 闲聊高性能集群

文章目录 什么是集群集群的特点与功能1. 高可用性与可扩展性2. 负载均衡与错误恢复3. 心跳监测与漂移IP地址 集群的分类1. 高可用集群高可用的概念常见的HA集群双机冷备双机热备双机互备多机互备 高可用集群软件 2. 负载均衡集群3. 分布式计算集群 HA集群中的相关术语1&#xf…

常见集群(Cluster)软件和技术解析

集群就是通过软件将一组服务器作为一个整体向客户提供资源。这些单个的服务器就是集群的节点。当对外提供资源的节点故障后&#xff0c;集群中其余的节点能够将资源接管起来&#xff0c;继续对客户提供资源。 集群技术的核心就是资源访问控制。由于集群中所有节点都可以访问集群…

[Linux基础与服务管理——常用集群高可用软件 Keepalived]

1.Keepalived 简介 Keepalived是Linux下的一个免费的、轻量级的高可用解决方案。是一个由C语言编写的路由软件&#xff0c;主要目标是为Linux系统和基于Linux的基础架构提供简单而强大的负载平衡和高可用性设。Keepalived实现了一组检查器&#xff0c;以根据其健康状况动态地和…

集群分为几种,用的软件分别是什么?

集群分为几种&#xff0c;用的软件分别是什么? 补充&#xff1a;涉及的组件 1.1、apache 跨平台的网页服务器&#xff0c;主要使用它做静态资源服务器&#xff0c;也可以做代理服务器转发请求 1.2、ngnix 高性能的 HTTP和反向代理服务器&#xff0c;ngnix处理能力相当于apache…

轻量级集群管理软件-Ansible

ansible概述和运行机制 ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成&#xff0c;类似于saltstack和Puppet&#xff0c;但是有一个不同和优点是我们不需要在节点中安装任何客户端 , 它使用SSH来和节点进行通信 Ansible基于 Pytho…

了解集群、集群的分类、常用的集群软硬件及选型介绍(内附详细图解)

Table of Contents 一、集群简介 二、集群的七大优点 三、集群的分类 四、常用的集群软硬件及选型介绍 一、集群简介 集群就是一组&#xff08;若干个&#xff09;相互独立的计算机&#xff0c;利用高速通信网络组成的一个较大的计算机服务系统&#xff0c;每个集群节点&…

数据I/O

I/O类型 区分同步或异步&#xff08;synchronous/asynchronous&#xff09;。 简单来说&#xff0c;同步是一种可靠的有序运行机制&#xff0c;当我们进行同步操作时&#xff0c;后续的任务是等待当前调用返回&#xff0c;才会进行下一步&#xff1b;而异步则相反&#xff0c;…

【赋权算法】Python实现熵权法

在开始之前&#xff0c;我们先说一下信息熵的概念。 当一件事情发生&#xff0c;如果是意料之中&#xff0c;那么这个事情就并不能拿来当做茶余饭后的谈资&#xff0c;我们可以说这个事情并没有什么信息和价值。而当一件不可能发生的事情发生的时候&#xff0c;我们可能就会觉…

【软件测试】大学毕业后顶着压力,巧合的开启了我人生的新篇章......

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

中国矿业大学徐海学院最不常见的网络工程计算机毕业设计题目推荐50例

之前有矿业大学徐海学院的童鞋在后台找我们&#xff0c;最近要准备毕业设计了&#xff0c;不会选题&#xff0c;希望可以帮忙给一些毕业设计题目&#xff0c;我整整花了一周把之前做的答辩通过的毕业设计成品进行整理&#xff0c;并精选一些容易实现且不会刷下来的题目列举下。…