线上论坛自动化测试

news2024/11/20 12:23:55

文章目录

    • 前言
    • 一、测试用例设计
    • 二、自动化测试
      • 1.登录功能
      • 2.注册功能
      • 3.发布帖子
      • 4.删除帖子
      • 5.修改帖子
      • 6.帖子详情
      • 7.个人中心
      • 8.通过suite套件总测试

前言

对论坛项目进行测试用例编写,通过 Selenium + JUnit 单元测试框架对项目的功能进行自动化测试。

论坛项目的部分功能:用户注册登录、帖子详情查看、帖子发布、修改、删除、用户个人信息展示和修改。

一、测试用例设计

在这里插入图片描述

二、自动化测试

1.登录功能

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class LoginTest {
    private static ChromeDriver driver;

    @BeforeAll
    static void setUp() throws InterruptedException {
        driver = new ChromeDriver();
        driver.get("http://127.0.0.1:58080/sign-in.html");
        driver.manage().window().maximize();
        Thread.sleep(200);
    }
    @AfterAll
    static void tearDown(){
        driver.quit();
    }


    //正确登录
    @Order(1)
    @ParameterizedTest
    @CsvSource({"test,123","test5,123"})
    void rightLogin(String username,String password){
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.id("submit")).click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        String user  = driver.findElement(By.id("article_list_board_title")).getText();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        Assertions.assertEquals(user,"首页");
        driver.navigate().back();
    }

    //错误登录
    @Order(2)
    @ParameterizedTest
    @CsvSource(value = {"t,123", "te,123", "tes,123"})
    void falseLogin(String username,String password){
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.id("submit")).click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        String currentUrl = driver.getCurrentUrl();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        Assertions.assertNotEquals("http://127.0.0.1:58080/index.html",currentUrl);
    }

    @Test
    @Order(3)
    void notUnLogin() throws InterruptedException {
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#submit")).click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
    }
    @Test
    @Order(4)
    void notPwLogin() throws InterruptedException {
        driver.findElement(By.cssSelector("#username")).sendKeys("test");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#submit")).click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
    }
}

2.注册功能

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class RegistTest {
    private static ChromeDriver driver;

    @BeforeAll
    static void setUp(){
        driver = new ChromeDriver();
    }
    @AfterAll
    static void tearDown(){
        driver.quit();
    }

    @BeforeEach
    void start(){
        driver.get("http://127.0.0.1:58080/sign-up.html");
    }
    //注册功能测试
    //正确注册
    @ParameterizedTest
    @CsvSource(value = {"test10,测试10,123,123","test11,测试11,123,123","test12,测试12,123,123"})
    @Order(1)
    void rightRegist(String username,String nickname,String password,String passwordRepeat) throws InterruptedException {
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(passwordRepeat);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#policy")).click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#submit")).click();
        Thread.sleep(1000);
        driver.switchTo().alert().accept();
        Thread.sleep(1000);
    }

    //错误注册
    //不输入用户名
    //不输入密码
    //密码与错误密码不一样
    //用户名已存在
    @ParameterizedTest
    @CsvSource(value = {"'',测试13,123,123", "test14,'',123,123","test15,测试15,123,1234","test10,测试10,123,123"})
    @Order(2)
    void failRegist(String username,String nickname,String password,String passwordRepeat) throws InterruptedException {
        driver.findElement(By.cssSelector("#username")).sendKeys(username);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#nickname")).sendKeys(nickname);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#password")).sendKeys(password);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#passwordRepeat")).sendKeys(passwordRepeat);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#policy")).click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#submit")).click();
    }
}

3.发布帖子

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class PublishTest {
    private static ChromeDriver driver;

    @BeforeAll
    static void setUp() throws InterruptedException {
        driver = new ChromeDriver();
        driver.get("http://127.0.0.1:58080/sign-in.html");
        driver.manage().window().maximize();
        driver.findElement(By.cssSelector("#username")).sendKeys("test");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.id("submit")).click();
        Thread.sleep(200);
    }
    @AfterAll
    static void tearDown(){
        driver.quit();
    }

    //发布帖子测试
    @Test
    @Order(1)
    void post() throws InterruptedException {
        driver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[1]/div/div/div[2]/div/a[1]")).click();
        sleep(3000);
        String title = driver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[1]/div/div/div/h2")).getText();
        Assertions.assertEquals(title,"发新贴");
        driver.switchTo().activeElement().sendKeys("自动化测试正文");
        driver.findElement(By.id("article_post_title")).sendKeys("自动化测试标题");
        driver.executeScript("window.scrollTo(0,1000)");
        sleep(2000);
        driver.findElement(By.id("article_post_submit")).click();
    }
}

4.删除帖子

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class DeleteTest {

    private static ChromeDriver driver;

    @BeforeAll
    static void setUp() throws InterruptedException {
        driver = new ChromeDriver();
        driver.get("http://127.0.0.1:58080/sign-in.html");
        driver.manage().window().maximize();
        driver.findElement(By.cssSelector("#username")).sendKeys("test");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.id("submit")).click();
        sleep(200);
    }
    @AfterAll
    static void tearDown(){
        driver.quit();
    }

    //帖子删除测试
    @Test
    @Order(1)
    void delete() throws InterruptedException {
        //获取第一篇文章时间
        sleep(2000);
        String articleCreatTime = driver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[2]/div/div[1]/ul/li[2]")).getText();
        //点击文章
        driver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[1]/a")).click();
        sleep(1000);
        //点击文章删除按钮
        driver.findElement(By.xpath("//*[@id=\"bit-forum-content\"]/div[2]/div/div/div[1]/div[2]/div[2]/div/div[3]/div/a")).click();
        sleep(1000);
        //点击确定删除
        driver.findElement(By.id("details_artile_delete")).click();
        sleep(1000);
        //再此获取第一篇文章的时间,(第一篇文章删除了,这里获取的是第二篇文章)
        //时间不一样就是删除成功,时间一样就是删除不成功
        String cact = driver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[2]/div/div[1]/ul/li[2]")).getText();
        Assertions.assertNotEquals(articleCreatTime,cact);
    }

}

5.修改帖子

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class UpdateTest {
    private static ChromeDriver driver;

    @BeforeAll
    static void setUp() throws InterruptedException {
        driver = new ChromeDriver();
        driver.get("http://127.0.0.1:58080/sign-in.html");
        driver.manage().window().maximize();
        driver.findElement(By.cssSelector("#username")).sendKeys("test");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.id("submit")).click();
        sleep(200);
    }
    @AfterAll
    static void tearDown(){
        driver.quit();
    }

    @Order(1)
    @Test
    void update() throws InterruptedException {
        driver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[1]/a")).click();
        driver.findElement(By.id("details_artile_edit")).click();
        driver.findElement(By.id("edit_article_title")).clear();
        driver.findElement(By.id("edit_article_title")).sendKeys("自动化修改测试标题");
        driver.findElement(By.id("edit_article_title")).sendKeys(Keys.TAB,Keys.CONTROL,"x");
        driver.switchTo().activeElement().sendKeys("自动化修改测试正文");
        driver.executeScript("window.scrollTo(0,1000)");
        Thread.sleep(300);
        driver.findElement(By.id("edit_article_submit")).click();
        String title = driver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[1]/a/strong")).getText();
        Assertions.assertEquals(title,"自动化修改测试标题");
    }
}

6.帖子详情

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class DetailsTest {
    private static ChromeDriver driver;

    @BeforeAll
    static void setUp() throws InterruptedException {
        driver = new ChromeDriver();
        driver.get("http://127.0.0.1:58080/sign-in.html");
        driver.manage().window().maximize();
        driver.findElement(By.cssSelector("#username")).sendKeys("test");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.id("submit")).click();
        sleep(200);
    }
    @AfterAll
    static void tearDown(){
        driver.quit();
    }

    @Test
    void details() throws InterruptedException {
        //文章主页显示标题
        String title = driver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[1]/a/strong")).getText();
        //文章作者
        String author = driver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[2]/div/div[1]/ul/li[1]")).getText();
        //文章时间
        String time = driver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[2]/div/div[1]/ul/li[2]")).getText();
        //文章访问量
        Integer numOfVisit = Integer.valueOf(driver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[2]/div/div[2]/ul/li[1]")).getText());
        Thread.sleep(200);
        driver.findElement(By.xpath("//*[@id=\"artical-items-body\"]/div[1]/div/div[2]/div[1]/a/strong")).click();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        //文章详情页的标题
        String checkTitle = driver.findElement(By.cssSelector("#details_article_title")).getText();
        //作者
        String checkAuthor = driver.findElement(By.cssSelector("#article_details_author_name")).getText();
        //时间
        String checkTime = driver.findElement(By.cssSelector("#details_article_createTime")).getText();
        //访问量
        Integer checkNumOfVisit = Integer.valueOf(driver.findElement(By.cssSelector("#details_article_visitCount")).getText());
        //检查
        Assertions.assertEquals(title,checkTitle);
        Assertions.assertEquals(author,checkAuthor);
        Assertions.assertEquals(time,checkTime);
        //因为点击进入文章,文章的访问量就会加一
        Assertions.assertEquals(numOfVisit+1,checkNumOfVisit);
        //获取文章点赞数
        Integer thumbsUpNum = Integer.valueOf(driver.findElement(By.cssSelector("#details_article_likeCount")).getText());
        Thread.sleep(200);
        //点赞
        driver.findElement(By.cssSelector("#details_btn_like_count")).click();
        //点赞后文章的点赞数
        Integer checkThumbsUpNum = Integer.valueOf(driver.findElement(By.cssSelector("#details_article_likeCount")).getText());
        
        Assertions.assertEquals(thumbsUpNum+1,checkThumbsUpNum);
    }
}

7.个人中心

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class CenterTest {
    private static ChromeDriver driver;
    @BeforeAll
    static void setUp() throws InterruptedException {
        driver = new ChromeDriver();
        driver.get("http://127.0.0.1:58080/sign-in.html");
        driver.manage().window().maximize();
        driver.findElement(By.cssSelector("#username")).sendKeys("test");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        driver.findElement(By.id("submit")).click();
        sleep(200);
        driver.findElement(By.cssSelector("#index_nav_nickname")).click();
        driver.findElement(By.cssSelector("#index_user_settings")).click();
    }
    @AfterAll
    static void tearDown(){
        driver.quit();
    }
    @Order(1)
    @Test
    void center() throws InterruptedException {
        driver.findElement(By.cssSelector("#setting_input_nickname")).clear();
        driver.findElement(By.cssSelector("#setting_input_nickname")).sendKeys("101");
        driver.findElement(By.cssSelector("#setting_submit_nickname")).click();

        driver.findElement(By.cssSelector("#setting_input_email")).clear();
        driver.findElement(By.cssSelector("#setting_input_email")).sendKeys("111");
        driver.findElement(By.cssSelector("#setting_submit_email")).click();

        driver.executeScript("window.scrollTo(0,1000)");
        driver.findElement(By.id("setting_input_phoneNum")).clear();
        driver.findElement(By.id("setting_input_phoneNum")).sendKeys("188");
        driver.findElement(By.id("setting_submit_phoneNum")).click();

        Thread.sleep(1500);
        driver.findElement(By.id("settings_textarea_remark")).clear();
        driver.findElement(By.id("settings_textarea_remark")).sendKeys("自动化测试1");
        Thread.sleep(1000);
        driver.findElement(By.id("settings_submit_remark")).click();
    }

    @ParameterizedTest
    @CsvSource(value = {"'',1234,1234","123,'',1234","123,1234,''"})
    @Order(2)
    void falseUpdatePassword(String oldPassword,String newPassword,String passwordRepeat) throws InterruptedException {
        driver.executeScript("window.scrollTo(0,1000)");
        sleep(1500);
        // 原密码、新原密码、确认密码都为空
        driver.findElement(By.id("settings_input_oldPassword")).clear();
        driver.findElement(By.id("settings_input_oldPassword")).sendKeys(oldPassword);
        driver.findElement(By.id("settings_input_newPassword")).clear();
        driver.findElement(By.id("settings_input_newPassword")).sendKeys(newPassword);
        driver.findElement(By.id("settings_input_passwordRepeat")).clear();
        driver.findElement(By.id("settings_input_passwordRepeat")).sendKeys(passwordRepeat);
        driver.findElement(By.id("settings_submit_password")).click();
    }
    @ParameterizedTest
    @CsvSource(value = {"123,1234,1234"})
    @Order(3)
    void rightUpdatePassword(String oldPassword,String newPassword,String passwordRepeat) throws InterruptedException {
        sleep(1000);
        driver.findElement(By.id("settings_input_oldPassword")).clear();
        driver.findElement(By.id("settings_input_oldPassword")).sendKeys(oldPassword);
        driver.findElement(By.id("settings_input_newPassword")).clear();
        driver.findElement(By.id("settings_input_newPassword")).sendKeys(newPassword);
        driver.findElement(By.id("settings_input_passwordRepeat")).clear();
        driver.findElement(By.id("settings_input_passwordRepeat")).sendKeys(passwordRepeat);
        sleep(1500);
        driver.findElement(By.id("settings_submit_password")).click();
    }
}

8.通过suite套件总测试

@Suite
@SelectClasses(value = {LoginTest.class,RegistTest.class,PublishTest.class,DeleteTest.class,UpdateTest.class,DetailsTest.class,CenterTest.class})
public class RunAllSuite {
}

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

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

相关文章

Hive主要介绍

Hive介绍 hive是基于 Hadoop平台操作 HDFS 文件的插件工具 可以将结构化的数据文件映射为一张数据库表 可以将 HQL 语句转换为 MapReduce 程序 1.hive 是由驱动器组成,驱动器主要由4个组件组成(解析器、编译器、优化器、执行器) 2.hive本身不…

CHARLS轻松发二区,只用了COX回归模型 | CHARLS CLHLS CFPS 公共数据库周报(4.3)...

零基础CHARLS发论文,不容错过! 长期回放更新指导!适合零基础,毕业论文,赠送2011-2020年CHARLS清洗后的数据全套代码! CHARLS公共数据库 CHARLS数据库简介中国健康与养老追踪调查(China Health and Retireme…

揭秘神器:智能私信破局获客难!

在数字营销的海洋中,每个企业都如同一艘努力航行的船,希望能在广阔的客户蓝海中获得丰收。然而,现实却往往充满挑战,尤其是当面对如何吸引并维系客户这一核心难题时。传统的获客手段逐渐显得力不从心,而智能科技的介入…

项目十一:爬取热搜榜(小白实战级)

首先,恭喜各位也恭喜自已学习爬虫基础到达圆满级,今后的自已python爬虫之旅会随着网络发展而不断进步。回想起来,我学过请求库requests模块、解析库re模块、lmxl模块到数据保存的基本应用方法,这一次的学习python爬虫之旅收获很多…

三 SpringMVC返回数据以及RESTFul设计标准

SpringMVC返回数据 一 控制页面跳转 1.1 快速使用 开发模式回顾在 Web 开发中,有两种主要的开发模式:前后端分离和混合开发。前后端分离模式:[重点]指将前端的界面和后端的业务逻辑通过接口分离开发的一种方式。开发人员使用不同的技术栈和…

OAuth2、JWT

文章目录 OAuth2JWT OAuth2 官网: https://oauth.net/2/ 在 RFC 6749 中说明 1、资源所有者 resource owner, 如 github 用户 2、客户端/第三方应用 client, 如 支持github 登录的 csdn 3、资源服务器 resource server, 如 4、授…

高级美肤解决方案,精细的磨皮处理效果

在数字化时代,高清视频和精致图片已成为企业展示形象、推广产品的重要媒介。然而,面对镜头时,肌肤的微小瑕疵往往成为影响整体美观的“绊脚石”。美摄科技针对这一问题,推出了一系列基于人脸识别技术的高级美肤解决方案&#xff0…

基于昇腾AI 使用AscendCL实现垃圾分类和视频物体分类应用

现如今,人工智能迅猛发展,AI赋能产业发展的速度正在加快,“AI”的需求蜂拥而来,但AI应用快速落地的过程中仍存在很大的挑战:向下需要适配的硬件,向上需要完善的技术支持,两者缺一不可。 基于此&…

Python中ArcPy按照分幅条带与成像日期拼接每个8天间隔内的遥感影像

本文介绍基于Python中的ArcPy模块,将大量遥感影像文件按照分幅条带编号与成像时间加以分组,并将同一分幅的遥感影像加以每个8天时间间隔内的镶嵌拼接的方法。 首先,来看一下本文具体的需求。我们现有一个文件夹,其中含有大量的.ti…

网工交换基础——Qinq技术

一、Qinq的概述 QinQ(802.1Q-in-802.1Q),也叫做VLAN Stacking或Double VLAN,由IEEE 802.1ad标准定义,是一项扩展VLAN空间的技术,通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的目…

面试:JVM垃圾回收

一、三种垃圾回收算法 1、标记清除(已废弃) 找到根对象(局部变量正在引用的对象、静态变量正在引用的对象);沿着根对象的引用链,查看当前的对象是否被根对象所引用,若被引用,则加上…

Oracle数据库的AI能力分析,释放企业数据价值

解锁Oracle数据库的AI潜力 Oracle数据库提供了一系列的AI能力,旨在帮助企业和开发者更高效地利用人工智能技术。以下是Oracle数据库AI能力的一些关键点:1. AI向量相似性搜索:Oracle Database 23c引入了AI Vector Search功能,该功…

2024/4/25 C++day3

#include <iostream> using namespace std; class Person //Person类 {string name; //两个私有属性变量name&#xff0c;ageint age;public: //一个公有属性指针变量&#xff0c;一个无参构造函数&#xff0c;一个有参构造函数&#xff0c;一个sho…

树莓派学习笔记--串口通信(配置硬件串口进行通信)

树莓派串口知识点 树莓派4b的外设一共包含两个串口&#xff1a;硬件串口&#xff08;/dev/ttyAMA0&#xff09;,mini串口&#xff08;/dev/ttyS0&#xff09; 硬件串口由硬件实现&#xff0c;有单独的波特率时钟源&#xff0c;性能高&#xff0c;可靠&#xff1b;而mini串口性能…

msf抓取hashdump的思考

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 2. 我们通过hashdump 抓取出 所有用户的密文&#xff0c;分为两个模块&#xff0c;为什么&#xff1f; 这两个模块分别都代表…

架构师系列-消息中间件(九)- RocketMQ 进阶(三)-消费端消息保障

5.2 消费端保障 5.2.1 注意幂等性 应用程序在使用RocketMQ进行消息消费时必须支持幂等消费&#xff0c;即同一个消息被消费多次和消费一次的结果一样&#xff0c;这一点在使用RoketMQ或者分析RocketMQ源代码之前再怎么强调也不为过。 “至少一次送达”的消息交付策略&#xff…

不墨迹,向媒体投稿不讲攻略,直接上方法

作为一名单位信息宣传员,我曾深陷于向媒体投稿的泥沼之中,饱尝了费时费力、审核严苛、出稿缓慢的苦涩,承受着领导急切期盼与自我压力交织的煎熬。然而,当我有幸接触到智慧软文发布系统,这一切困境如同阴霾散去,取而代之的是便捷流畅的投稿流程,以及领导满意、团队轻松的工作氛围…

详解Qt中的鼠标事件

在Qt中&#xff0c;处理鼠标事件是构建交互式界面的关键。Qt提供了一系列与鼠标相关的事件处理函数&#xff0c;允许开发者捕获鼠标的各种动作&#xff0c;如按下、释放、移动、双击等。以下是鼠标事件的使用方法、技巧以及注意事项&#xff0c;并附带C代码示例。 基础使用方法…

Node.js 22 发布,原生支持 WebSocket 客户端

昨日&#xff0c;Node.js 官方博客正式宣布 Node.js 22 的发布&#xff01;新版本亮点包括 require() ES 模块、WebSocket 客户端、V8 JavaScript 引擎的更新等&#xff01; Node.js 22 将在 10 月进入长期支持 (LTS)&#xff0c;但在此之前&#xff0c;它将是接下来六个月的 …

问题-MySQL将较大的SQL文件导入MySQL

迁移数据的时候&#xff0c;我们有时候会用sqlyog等数据库工具导入到新数据库。可能插入的SQL语句太大&#xff0c;出现导入一半失败的情况。明明代码没错&#xff0c;这让人摸不着头脑。 对于大文件导入&#xff0c;有几种方法&#xff1a; 方法1&#xff1a;使用命令行&…