IT论坛测试

news2024/9/23 9:34:47

目录

一、项目介绍

项目名称

项目简介

相关技术

项目展示

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

测试用例设计

注册页面

登陆页面 

首页面

发布帖子页面 

修改个人信息页面 

功能测试 

注册页面

登录页面

首页面

 发布帖子页面

 修改个人信息页面

 三、接口测试

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 {

    @Resource
    private IUserService userService;

    @Resource
    private ObjectMapper objectMapper;

    @Test
    void 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));
    }

    @Test
    void createNormalUser() {
        // 构造用户
        User user = new User();
        user.setUsername("TestUser1");
        user.setNickname("单元测试用户1");
        user.setPassword("123456");
        user.setSalt("123456");
        // 调用Service
        userService.createNormalUser(user);
        System.out.println("注册成功");
        System.out.println("=====================");

        user.setUsername("bitboy");
        userService.createNormalUser(user);
        System.out.println("注册成功");
    }

    @Test
    void 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));
    }

    @Test
    void 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
    @Transactional
    void 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
    @BeforeAll
    static 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);
        // 判断跳转页面url
        String url = driver.getCurrentUrl();
        // 断言url
        Assertions.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://www.coloradmin.cn/o/936192.html

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

相关文章

HAproxy+keepalived高可用配置搭建

目录 一、概述 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;核心功能 &#xff08;三&#xff09;关键特性 &#xff08;四&#xff09;应用场景 二、安装 1&#xff09;拓补图 2&#xff09;配置 &#xff08;一&#xff09;内核配置 &#xff08;二…

【golang】派生数据类型---指针 标识符、关键字等

1、指针 对比C/C中的指针&#xff0c;go语言中的指针显得极为简洁&#xff0c;只是简单的获取某个空间的地址 或者 根据指针变量中的内容 获取对应存储空间的内容等操作。 具体示例如下&#xff1a; go中使用指针需要注意的点&#xff1a; 可以通过指针改变它所指向的内存空…

5 STM32标准库函数 之 外部中断/事件控制器(EXTI)所有函数的介绍及使用

5 STM32标准库函数 之 外部中断/事件控制器&#xff08;EXTI&#xff09;所有函数的介绍及使用 1. 图片有格式2 文字无格式五 库函数之外部中断/事件控制器&#xff08;EXTI&#xff09;所有函数的介绍及使用前言一、图片预览&#xff0c;无格式&#xff08;CSDN&#xff09;二…

C++ 工具

C参考手册 Learncppcplusplustutorialspoint/cplusplusAwesomeC 写在最后&#xff1a;若本文对您有帮助&#xff0c;请点个赞啦 ٩(๑•̀ω•́๑)۶

RS485保护电路

今天给大家分享485接口的EMC设计&#xff0c;希望对电路设计&#xff0c;及相关软件开发的人员有帮助。 一、原理图 1. RS485接口6KV防雷电路设计方案 &#xff08;RS485接口防雷电路&#xff09; 接口电路设计概述&#xff1a; RS485用于设备与计算机或其它设备之间通讯&…

c++11 标准模板(STL)(std::basic_ostringstream)(一)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allo…

week6刷题

题解: 使用二分查找 class Solution { public:int minArray(vector<int>& numbers) {int low 0;int high numbers.size() - 1;while (low < high) {int pivot low (high - low) / 2;if (numbers[pivot] < numbers[high]) {high pivot;}else if (numbers…

学习JAVA打卡第四十四天

Scanner类 ⑴Scanner对象 scanner对象可以解析字符序列中的单词。 例如&#xff1a;对于string对象NBA 为了解析出NBA的字符序列中的单词&#xff0c;可以如下构造一个scanner对象。 将正则表达式作为分隔标记&#xff0c;即让scanner对象在解析操作时把与正则表达式匹配的字…

<C++> STL_stack和queue

1.stack的介绍和使用 1.1 stack的介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&am…

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成 目录 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成。 生成对抗…

抖店的出单主要靠什么?给你们分析下抖店的运营逻辑,建议看完!

我是王路飞。 做抖店只有一个目的&#xff0c;就是出单、赚钱。 那么从开通抖店开始&#xff0c;到最后店铺出单&#xff0c;这中间的一些运营流程就是你出单的关键了。 那么抖店的出单主要靠什么呢&#xff1f; 我的观点是&#xff1a;产品流量。给你们分析下抖店的运营逻…

【JavaEE】Spring事务-@Transactional参数介绍-事务的隔离级别以及传播机制

【JavaEE】Spring事务&#xff08;2&#xff09; 文章目录 【JavaEE】Spring事务&#xff08;2&#xff09;1. Transactional 参数介绍1.1 value 和 transactionManager1.2 timeout1.3 readOnly1.4 后面四个1.5 isolation 与 propagation 2. Spring 事务隔离级别 - isolation2.…

登录校验-Filter-登录校验过滤器

目录 思路 登录校验Filter-流程 步骤 流程图 登录校验Filter-代码 过滤器类 工具类 测试登录 登录接口功能请求 其他接口功能请求 前后端联调 思路 前端访问登录接口&#xff0c;登陆成功后&#xff0c;服务端会生成一个JWT令牌&#xff0c;并返回给前端&#xff0…

【C++】C++ 引用详解 ⑦ ( 指针的引用 )

文章目录 一、二级指针可实现的效果二、指针的引用1、指针的引用 等同于 二级指针 ( 重点概念 )2、引用本质 - 函数间接赋值简化版本3、代码示例 - 指针的引用 一、二级指针可实现的效果 指针的引用 效果 等同于 二级指针 , 因此这里先介绍 二级指针 ; 使用 二级指针 作为参数 …

JWT 技术的使用

应用场景&#xff1a;访问某些页面&#xff0c;需要用户进行登录&#xff0c;那我们如何知道用户有没有登录呢&#xff0c;这时我们就可以使用jwt技术。用户输入的账号和密码正确的情况下&#xff0c;后端根据用户的唯一id生成一个独一无二的token&#xff0c;并返回给前端&…

几个nlp的小任务(机器翻译)

几个nlp的小任务(机器翻译) 安装依赖库数据集介绍与模型介绍加载数据集看一看数据集的样子评测测试数据预处理测试tokenizer处理目标特殊的token预处理函数对数据集的所有数据进行预处理微调预训练模型设置训练参数需要一个数据收集器,把处理好数据喂给模型设置评估方法参数…

RHCE——八、DNS域名解析服务器

RHCE 一、概述1、产生原因2、作用3、连接方式4、因特网的域名结构4.1 拓扑4.2 分类4.3 域名服务器类型划分 二、DNS域名解析过程1、分类2、解析图&#xff1a;2.1 图&#xff1a;2.2 过程分析 三、搭建DNS域名解析服务器1、概述2、安装软件3、/bind服务中三个关键文件4、配置文…

孪生网络(Siamese Network)

基本概念 孪生网络&#xff08;Siamese Network&#xff09;是一类神经网络结构&#xff0c;它是由两个或更多个完全相同的网络组成的。孪生网络通常被用于解决基于相似度比较的任务&#xff0c;例如人脸识别、语音识别、目标跟踪等问题。 孪生网络的基本思想是将输入数据同时…

数据I/O

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