基于学习交流社区的自动化测试实现

news2024/11/26 9:56:30

一 项目介绍


项目名称

项目展示链接: 学习交流社区

项目介绍

项目介绍: 学习交流社区是一个基于Spring的前后端分离的在线论坛系统。使用了MySQL数据库来存储相关信息,项目完成后使用Xshell将其部署到云服务器上。

前端页面: 前端共由八个页面构成:注册页面,登录页面,首页,编辑帖子页面,帖子列表页面,个人中心页面,修改个人信息页面,帖子详情页面。

项目总结: 该项目可以实现通过发布帖子分享技术,并通过别人发布的帖子学习知识来进行技术交流,所以也可称之为技术交流社区。

项目功能

学习交流社区主要实现了以下功能
用户注册,用户登录,编辑帖子,删除帖子,查看帖子,点赞帖子,站内信,编辑个人信息等功能。


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


1.测试用例设计

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

①登录页面

在这里插入图片描述

②注册页面

在这里插入图片描述

③首页

在这里插入图片描述

④发布帖子页面

在这里插入图片描述

⑤修改个人信息页面

在这里插入图片描述

2.功能测试环境

测试环境: win11
项目运行: CentOS,maven,JDK1.8
浏览器: Chrome浏览器

3.实际执行功能测试的部分操作

①登录页面

页面展示
在这里插入图片描述

给定一个正确的账号密码:
用户名:锦鲤
密码:123456

操作

输入用户名输入密码操作预期结果实际结果
点击登录提示用户名不能为空,密码不能为空提示用户名不能为空,密码不能为空
张三(错误的用户名)点击登录提示用户名或密码错误提示用户名或密码错误
锦鲤(正确的用户名)点击登录提示密码不能为空提示密码不能为空
锦鲤(正确的用户名)123(错误的密码)点击登录提示用户名或密码错误提示用户名或密码错误
锦鲤(正确的用户名)123456(正确的密码)点击登录登录成功成功登录

②注册页面

页面展示

在这里插入图片描述

操作

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

③首页

页面展示

在这里插入图片描述
操作

操作预期结果实际结果
点击Java跳转至Java版块跳转至Java版块
点击发布帖子跳转至发布帖子页面跳转至发布帖子页面
点击“任一帖子标题”跳转至帖子详情页跳转至帖子详情页
点击月亮标志切换为夜晚模式切换为夜晚模式
点击铃铛标志显示所有私信显示所有私信

④发布帖子页面

页面展示
在这里插入图片描述

操作

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

⑤修改个人信息页面

页面展示
在这里插入图片描述

操作

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

三 接口测试


接口测试使用了:

  1. Junit单元测试
  2. Springfox Swagger 生成 API,完成 API 单元测试

1.Junit单元测试

单元测试类:

在这里插入图片描述

这里只列举用户接口和帖子接口的单元测试,其余类似

①用户接口

这里列举了注册,登录和修改个人信息的测试代码。

注册方法测试:

    @Test
    @Transactional
    void createNormalUser() {
        // 构造User对象
        User user = new User();
        user.setUsername("boy1");
        user.setNickname("boy");

        // 定义一个原始的密码
        String password = "123456";
        // 生成盐
        String salt = UUIDUtil.UUID_32();
        // 生成密码的密文
        String ciphertext = MD5Util.md5Salt(password, salt);
        // 设置加密后的密码
        user.setPassword(ciphertext);
        // 设置盐
        user.setSalt(salt);
        // 调用Service层的方法
        userService.createNormalUser(user);
        // 打印结果
        System.out.println(user);
    }

修改个人信息测试:

    @Test
    @Transactional
    void modifyInfo() {
        User user = new User();
        user.setId(3l); // 用户Id
        user.setUsername("testUser"); // 登录名
        user.setNickname("testUser1"); // 昵称
        user.setGender(null); // 性别
        user.setEmail("qqq@qq.com");// 邮箱
        user.setPhoneNum("15366668888"); // 电话
        user.setRemark("测试"); // 个人简介
        // 调用Service
        userService.modifyInfo(user);
    }

登录测试:

    @Test
    void login() {
        User user = userService.login("bitboy", "123456");
        System.out.println(user);
    }

②帖子接口

这里列举了发布帖子,查询所有帖子列表,删除帖子,点赞帖子的测试代码。

发布帖子测试:

    @Test
    @Transactional
    void create() {
        Article article = new Article();
        article.setUserId(2L); // boy
        article.setBoardId(1L); // java版块
        article.setTitle("单元测试");
        article.setContent("测试内容");
        articleService.create(article);
        System.out.println("发贴成功");
    }

查询所有帖子列表:

    @Test
    void selectAll() throws JsonProcessingException {
        // 调用Service
        List<Article> articles = articleService.selectAll();
        // 转换成JSON字符串并且打印
        System.out.println(objectMapper.writeValueAsString(articles));
    }

点赞帖子和删除帖子方法测试:

    @Test
    @Transactional
    void thumbsUpById() {
        articleService.thumbsUpById(1L);
        System.out.println("点赞成功");
    }

    @Test
    @Transactional
    void deleteById() {
        articleService.deleteById(11l);
        System.out.println("删除成功");
    }

2.Swagger API测试

测试链接:学习交流社区

接口测试版块总览

在这里插入图片描述

回复接口:

在这里插入图片描述

帖子接口:

在这里插入图片描述

版块接口:

在这里插入图片描述

用户接口:

在这里插入图片描述

站内信接口:

在这里插入图片描述

⭐⭐⭐这里每个接口展示一个功能的测试过程。

①用户接口

功能:用户登录

账号:锦鲤
密码:123456

测试过程:
在这里插入图片描述

结果:登录成功
在这里插入图片描述

①帖子接口

功能:获取用户列子列表

输入用户id:1

测试过程:

在这里插入图片描述

结果:获取成功,用户id为1的用户共发布一篇文章

在这里插入图片描述

①回复接口

功能:发布回复

输入发布回复的帖子id:19
输入回复内容:支持好文!!!

过程:

在这里插入图片描述

结果:回复成功

在这里插入图片描述

①版块接口

功能:获取首页版块列表

过程:直接点击Execute

在这里插入图片描述

结果:操作成功

在这里插入图片描述

①站内信接口

功能:发送站内信

输入接收用户id:2
输入内容:你好

过程:

在这里插入图片描述

结果:操作成功

在这里插入图片描述

四 自动化测试


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.创建公共类

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

package org.example.common;

import org.openqa.selenium.chrome.ChromeDriver;

import java.time.Duration;
import java.util.concurrent.TimeUnit;

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来注解声明我们要运行哪些类
在这里插入图片描述

package org.example.tests;

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;

/**
 * 2023/8/21
 * 测试套件类
 */
@Suite
@SelectClasses({loginTest.class, IndexTest.class})
public class RunSuite {
}

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

①打开登陆网页

②对登陆页面上的文字进行判断

  1. 页面上的用户名,密码,登录按钮是否都正常显示
  2. 点击去注册按钮能否正常跳转页面

③测试窗口伸缩

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

④错误的登录测试

  1. 用户名为空,提示用户名不能为空
  2. 密码为空,提示密码不能为空
  3. 用户名密码不匹配,提示用户名或密码错误

⑤正确的登录测试

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

⑥运行结果

测试全部通过
在这里插入图片描述
※这里给出一个页面的详细代码,其他页面都与之类似

package org.example.tests;

import org.example.common.AutotestUtil;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.concurrent.TimeUnit;

/**
 * wangcong
 * 2023/8/21
 * 登陆页面测试
 */
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class loginTest extends AutotestUtil {
    // 获取浏览器驱动
    public static ChromeDriver driver = createDrive();

    /**
     * 打开网页
     */
    @Test
    @BeforeAll
    static void init() {
        // 跳转到登录页面
        driver.get("http://47.109.128.149:6060/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://47.109.128.149:6060/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","锦鲤呀,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://47.109.128.149:6060/sign-in.html");
        // 判断显示是否为首页
        String expect = driver.findElement(By.cssSelector("#article_list_board_title")).getText();
        // 断言
        Assertions.assertEquals(expect, "首页");
        // 返回上一个页面
        driver.navigate().back();// 这里不需要返回,并未跳转页面
    }


}

3.对注册页面进行自动化测试

①打开注册页面

在这里插入图片描述

②对注册页面上的文字进行判断

  1. 判断用户注册,用户名,昵称,密码,确认密码,同意文字是否存在
  2. 注册按钮是否存在
  3. 登陆的超链接是否存在

④错误的注册测试

  1. 用户名,昵称,密码,确认密码,同意隐私政策,其中有任何一个不填写,注册失败

⑤正确的注册测试

  1. 用户名,昵称,密码,确认密码,同意隐私政策,所有都正确填写,注册成功
  2. 注册成功后,跳转到登陆界面

3.对首页进行自动化测试

①打开注册页面


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

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

相关文章

让 exoplayer2 支持播放 ftp ( 扩展 exoplayer 支持 ftp 协议 ) 的两种方式

exoplayer 是安卓开源播放器组件库&#xff0c;由谷歌开发维护。它提供了一个可高度扩展的音视频播放框架&#xff0c;支持许多媒体格式与高级媒体功能&#xff0c;比如 adaptive streaming&#xff0c;DRM&#xff0c;以及安卓 media session 集成。 但是不支持 ftp &#xf…

罗德与施瓦茨频谱分析仪RSFSUP50

FSUP50 R&S FSUP50 信号源分析仪&#xff0c;20Hz到50GHz 壹捌叁贰零玖壹捌陆伍叁 R&S FSUP 是一款测量功能丰富、高度灵活的相位噪声测试仪&#xff0c;它兼具***信号和频谱分析仪及单纯相位噪声测试仪两者的功能。 主要特点 频率范围高达 8 GHz、26.5 GHz 或 50…

网络原理详解(图文结合)

目录 ​编辑一、应用层 1、请求和响应 2、通用的协议格式 &#xff08;1&#xff09;xml &#xff08;2&#xff09;json &#xff08;3&#xff09;protobuffer 二、传输层 1、UDP 2、TCP &#xff08;1&#xff09;TCP 协议段格式&#xff1a; &#xff08;2&am…

js中 0==‘0‘、0==[] 为 true ,‘0‘==[] 为false

文章目录 问题分析 问题 js中 0‘0’、0[] 为 true &#xff0c;为什么 ‘0’[] 为false 分析 是弱类型比较 当两者类型不同时会发生类型转换0 “0”&#xff1a;先把“0”转为number类型再比较&#xff1b;0 []&#xff1a;有对象的话&#xff0c;先获取对象的原始值&#…

WPF中的效果Effect

WPF中的效果Effect 前言 WPF提供了可应用于任何元素的可视化效果。效果的目标是提供一种简便的声明式方法&#xff0c;从而改进文本、图像、按钮以及其他控件的外观。不是编写自己的绘图代码&#xff0c;而是使用某个继承自Effect的类&#xff0c;以立即获得诸如模糊、光辉以…

问道管理:数字经济概念走势强劲,竞业达、久其软件等涨停,观想科技等大涨

信创、智慧政务等数字经济概念22日盘中走势微弱&#xff0c;截至发稿&#xff0c;观想科技、慧博云通涨超15%&#xff0c;竞业达、中远海科、久其软件等涨停&#xff0c;云赛智联、延华智能、汇纳科技涨约9%&#xff0c;天玑科技、安硕信息、思特奇、零点稀有涨逾7%。 音讯面上…

虚幻官方项目《CropOut》技术解析 之 在实战中理解Enhanced Input系统

文章目录 概要Enhanced Input系统基础回顾旧版输入系统定义物理按键和Action/Axis的映射输入事件 Enhanced Input系统统一的ActionInput Mapping Context输入事件 《Crop Out》《Crop Out》中基于Enhanced Input的输入控制系统Input Mapping Context分层管理输入修改器(Input M…

Ubuntu系统全盘备份——TimeShift的安装与使用

Timeshift&#xff0c;它使用完全备份的方式&#xff0c;直接将整个操作系统包括个人配置全部备份打包。也就是全盘备份。 操作过程 依次执行命令&#xff1a; sudo apt-add-repository -y ppa:teejee2008/ppa sudo apt update sudo apt install timeshift打开软件后&#x…

【ES6】—【必备知识】—函数的参数

一、参数的默认值 1. ES5 设置默认值 function foo (x, y) {y y || worldconsole.log(x, y) } foo(hello, xiaoxiao) foo(hello, 0) // hello xiaoxiao // hello worldPS&#xff1a; 使用 || 的方式设置默认值不严谨&#xff0c; 0、undefined、‘’ 这些参数都会被判定为f…

安装VSCA 过程中的报错

安装VSCA 过程中的报错&#xff1a;无法获取目标服务器证书的SSL指纹&#xff1a; 解决方案三点&#xff1a; 防火墙 网络IP&#xff0c;网关 使用ping命令或者telnet检查网络是否可达 网络端口没有开启 有无启用 另外最新版本有漏洞 建议换一个常用版本

NestJS 中的 gRPC 微服务通信

想象一下&#xff0c;你回家过节&#xff0c;你的家人决定聚会。而不是让一个人做所有的烹饪&#xff0c;每个人都同意带上他们擅长制作的特色菜。目标是通过组合所有这些菜肴来制作一顿完整的饭菜。你同意做鸡肉炒饭&#xff0c;你哥哥做甜点蛋糕&#xff0c;妹妹做沙拉。 每…

SV-7101T网络音频广播终端使用手册

1.1、产品简介 感谢你使用我司的SV-7101T网络音频播放终端&#xff0c;SV-7101T能处理tcp/ip网络音频流&#xff0c;提供一路线路输出。主要用于公共数字广播&#xff0c;媒体教学&#xff0c;报警等需要数字音频的领域。 SV-7101T具有10/100M以太网接口&#xff0c;支持最高4…

高忆管理:巨无霸IPO来了!年内全球最大?英伟达曾400亿美金“求亲”

当地时间8月21日&#xff0c;美股三大股指涨跌纷歧&#xff0c;纳指连跌四日之后反弹。截至收盘&#xff0c;道指跌0.11%&#xff0c;标普500指数涨0.69%&#xff0c;纳指涨1.56%。本周市场关注美联储主席鲍威尔周五在杰克逊霍尔央行年会上的说话。 周一美国国债收益率攀升。美…

Power BI 如何做页面权限控制

同一个PBI报告中有多页, 有时我们需要将其中一些页面开给一部分人, 一些页面开给另一部分人 比如A用户只允许查看报告的第1,2页&#xff0c;B用户只能查看第3页等 1 导入页面控制权限表 2 创建角色 3 设计封面页 选择筛选器视图, 将页面字段拖进去, 将筛选器设置成单选选择, …

2023年上半年,吉利汽车销量增长13.1%,同比增长38%

根据吉利汽车发布的中期业绩报告&#xff0c;2023年上半年&#xff0c;吉利汽车取得了令人瞩目的销售和收入增长。该公司在中国乘用车市场表现出色&#xff0c;销量增长了13.1%&#xff0c;达到了69.4万辆&#xff0c;超过了整体市场增长率&#xff08;8.8%&#xff09;。 这主…

ebay小夜灯亚马逊UL1786测试报告

小夜灯UL报告UL1786测试标准亚马逊美国站销售办理 UL认证&#xff0c;很多人对它熟悉却又陌生。出口美国的时候&#xff0c;很多人都听过UL认证。但是因为UL认证在美国属于非强制性的认证&#xff0c;对于清关没有影响&#xff0c;所以有很多卖家不会深入了解它。其实相关产品…

Python实现SSA智能麻雀搜索算法优化随机森林分类模型(RandomForestClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法&#xff0c;在2020年提出&a…

​LeetCode解法汇总849. 到最近的人的最大距离

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个数…

互联网医院开发|医院叫号系统提升就医效率

在这个数字化时代&#xff0c;互联网医院不仅改变了我们的生活方式&#xff0c;也深刻影响着医疗行业。医院叫号系统应运而生&#xff0c;它能够有效解决患者管理和服务方面的难题。不再浪费大量时间在排队上&#xff0c;避免患者错过重要信息。同时&#xff0c;医护工作效率得…

QT基础教程之三信号和槽机制

QT基础教程之三信号和槽机制 信号槽是 Qt 框架引以为豪的机制之一。所谓信号槽&#xff0c;实际就是观察者模式。当某个事件发生之后&#xff0c;比如&#xff0c;按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号&#xff08;signal&#xff09;。这种发出是没有目…