鸟语林-论坛系统自动化测试

文章目录

  • 一、自动化实施步骤
    • 1.1编写Web测试用例
    • 1.2 编写自动化代码
      • 1.2.1 LoginPageTest
        • 1) 能否正确打开登录页面
        • 2) 点击去注册能否跳转注册页面
        • 3) 模拟用户登录,输入多组登录测试用例
      • 1.2.2 RegisterPageTest
        • 1) 能否成功打开注册页面
        • 2) 注册测试用例
        • 3) 点击去登录按钮 测试注册成功的用例
      • 1.2.3 IndexPageTest
        • 1) 首页不同帖子简要内容能否正常显示
        • 2) 其他板块下不同帖子简要内容能否正常显示
        • 3) 搜索功能
        • 4) 进入帖子详情页
      • 1.2.4 MyPostPageTest
        • 1) 登录状态下个人帖子列表能否正常显示
      • 1.2.5 DoPostPageTest
        • 1) 登录状态下发布帖子

一、自动化实施步骤

对论坛Web系统开展自动化测试,以不同页面为维度来编写测试用例,根据测试用例,结合Selenium来设计自动化代码。同时采用junit进行单元测试,避免不同测试方法之间造成干扰,影响测试结果。

论坛系统在线访问链接:http://82.156.186.83:8080/index.html

1.1编写Web测试用例

在这里插入图片描述

1.2 编写自动化代码

在pom.xml文件中导入所需的依赖

<dependencies><!--WebDriverManager是⼀个开源Java库,--><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.8.0</version><scope>test</scope></dependency><!--selenium-java--><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency><!--单元测试--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.10.3</version><scope>test</scope></dependency></dependencies>

提取一些所有页面测试都需要初始化的属性到父类ObjTest中

public abstract class ObjTest {public EdgeOptions options;public WebDriver driver;public void init() {//使用驱动管理器-自动初始化对应版本的浏览器驱动WebDriverManager.edgedriver().setup();//配置一下选项-允许访问所有链接options = new EdgeOptions();options.addArguments("--remote-allow-origins=*");}}

1.2.1 LoginPageTest

1) 能否正确打开登录页面

判断能否正确打开登录页面,以登录页面特有的元素是否成功获取到作为判断打开登录页面的标志

public Boolean openLoginPage() {//1.打开浏览器页面driver.get(loginPageUrl);//2.定位到登录页面 - 某些只有登录页面特有的元素// 如果能找到这些元素那么就判定成功打开登录页面WebElement element = driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2"));return element != null && "用户登录".equals(element.getText());}
 	@Testvoid openLoginPage() {System.out.println("能否成功打开登录页面" + loginTest.openLoginPage());loginTest.close();}

在这里插入图片描述

2) 点击去注册能否跳转注册页面

判断点击"去注册"按钮能否正确打开登录页面,以注册页面特有的元素是否存在到作为判断标志

 /**** 1.打开登录页面* 2.选中"去注册"按钮* 3.成功跳转注册页面* 4.选中注册页面特有的元素来判断是否成功跳转到注册页面* @return*/public Boolean clickRegisterButon() {driver.get(loginPageUrl);WebElement element = driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a"));if (element == null) return false;element.click();WebElement registerHeader = driver.findElement(By.cssSelector("#signUpForm > div > h2"));if (registerHeader == null) return false;return "用户注册".equals(registerHeader.getText());}
@Test
void clickRegisterButon() {System.out.println("点击去注册按钮能否成功跳转注册页面:"+ loginTest.clickRegisterButon());loginTest.close();
}

在这里插入图片描述

3) 模拟用户登录,输入多组登录测试用例

成功打开登录页面以后,在登录页面,模拟用户登录,输入用户名和密码,模拟输入设计好的测试,以登录成功跳转到首页为标志例判断能否登录成功。

/*** 1.打开登录页面* 2.找到用户名和密码输入框* 3.sendKeys 输入登录测试用例* 4.找到登录按钮并点击* 5.判断结果是否与测试用例一致** @param password* @param username* @return*/public Boolean login(String username, String password) throws InterruptedException {driver.get(loginPageUrl);WebElement inputName = driver.findElement(By.cssSelector("#username"));WebElement inputPasw = driver.findElement(By.cssSelector("#password"));if (inputName == null || inputPasw == null) return false;//输入数据之前清空一下输入框中的数据,避免之前输入框中原有的数据对测试造成干扰inputName.clear();inputPasw.clear();inputName.sendKeys(username);inputPasw.sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(2000);WebElement element = null;try {element = driver.findElement(By.cssSelector("#nav_board_index > a > span"));} catch (Exception e) {e.printStackTrace();}if (element == null) return false;return "首页".equals(element.getText());}
 	@Testvoid login() throws InterruptedException {System.out.println("能否成功登录{testUser,h123,true}:" +loginTest.login("testUser", "h123"));loginTest.driver.navigate().back();System.out.println("能否成功登录{测试用户,h123,true}:" +loginTest.login("测试用户", "h123"));loginTest.driver.navigate().back();System.out.println("能否成功登录{测试,h123,false}:" +loginTest.login("测试", "h123"));loginTest.driver.navigate().back();System.out.println("能否成功登录{testUser,123,false}:" +loginTest.login("测试", "h123"));loginTest.close();}

在这里插入图片描述

测试结果与预期一致

1.2.2 RegisterPageTest

1) 能否成功打开注册页面
/*** 1.打开注册页面* 2.查找注册页面特有元素** @return*/public boolean openRegisterPage() {driver.get(registerPageUrl);WebElement registerHeader = driver.findElement(By.cssSelector("#signUpForm > div > h2"));if (registerHeader == null) return false;return "用户注册".equals(registerHeader.getText());}
   @Testvoid openRegisterPage() {System.out.println("能否成功打开注册页面:" + registerPageTest.openRegisterPage());}

在这里插入图片描述

2) 注册测试用例
 /*** 1.打开注册页面* 2.找到四个输入框* 3.输入测试用例* ***  1) 对输入框先调用一下clear方法,防止之前的参数造成测试不准确* 4,点击注册按钮能否成功跳转到登录** @param user* @return*/public boolean register(User user) {driver.get(registerPageUrl);WebElement inputUserName = driver.findElement(By.cssSelector("#username"));WebElement inputNickName = driver.findElement(By.cssSelector("#nickname"));WebElement inputPas = driver.findElement(By.cssSelector("#password"));WebElement inputReptedPas = driver.findElement(By.cssSelector("#passwordRepeat"));if (inputUserName == null || inputNickName == null|| inputPas == null || inputReptedPas == null) {return false;}inputUserName.clear();inputNickName.clear();inputPas.clear();inputReptedPas.clear();inputUserName.sendKeys(user.getUsername());inputNickName.sendKeys(user.getNickname());inputPas.sendKeys(user.getPassword());inputReptedPas.sendKeys(user.getRepeatedPas());WebElement registerButton = driver.findElement(By.cssSelector("#submit"));registerButton.click();driver.manage().timeouts().implicitlyWait(Duration.ofMillis(2000));WebElement loginHeader = null;try {loginHeader = driver.findElement(By.cssSelector("body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2"));} catch (Exception e) {return false;}if (loginHeader == null) {return false;}return "用户登录".equals(loginHeader.getText());}

User

public class User {private String username = "";private String password = "";private String nickname = "";private String repeatedPas = "";public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public String getRepeatedPas() {return repeatedPas;}public void setRepeatedPas(String repeatedPas) {this.repeatedPas = repeatedPas;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", nickname='" + nickname + '\'' +", repeatedPas='" + repeatedPas + '\'' +'}';}
}
 @Testvoid register() throws InterruptedException {User u1Success = new User();u1Success.setUsername("testRegister11");u1Success.setNickname("煜");u1Success.setPassword("123456h");u1Success.setRepeatedPas("123456h");System.out.println(u1Success.toString()+ registerPageTest.register(u1Success));User u2 = new User();System.out.println(u2.toString()+ registerPageTest.register(u2));User u3 = new User();u3.setNickname("昵称");u3.setPassword("123");u3.setRepeatedPas("123");System.out.println(u3.toString()+ registerPageTest.register(u3));User u4 = new User();u4.setUsername("testRegister");u4.setNickname("煜");u4.setPassword("123456h");u4.setRepeatedPas("123");System.out.println(u4.toString()+ registerPageTest.register(u4));registerPageTest.close();}

在这里插入图片描述

3) 点击去登录按钮 测试注册成功的用例
 /*** 1.打开注册页面* 2.点击去登陆按钮* 3.找到输入框,清空之后在输入* 4.点击登录按钮,能否成功跳转到首页** @param user* @return*/public boolean clickLoginButton(User user) {driver.get(registerPageUrl);WebElement toLoginButton = driver.findElement(By.cssSelector("body > div > div > div > a"));if (toLoginButton == null) return false;toLoginButton.click();WebElement inputName = driver.findElement(By.cssSelector("#username"));WebElement inputPasw = driver.findElement(By.cssSelector("#password"));if (inputName == null || inputPasw == null) return false;inputName.clear();inputPasw.clear();inputName.sendKeys(user.getUsername());inputPasw.sendKeys(user.getPassword());driver.findElement(By.cssSelector("#submit")).click();driver.manage().timeouts().implicitlyWait(Duration.ofMillis(2000));WebElement element = null;try {element = driver.findElement(By.cssSelector("#nav_board_index > a > span"));} catch (Exception e) {}if (element == null) return false;return "首页".equals(element.getText());}
 @Testvoid clickLoginButton() {User user = new User();user.setUsername("testRegister11");user.setPassword("123456h");System.out.println("点击去登录:"+registerPageTest.clickLoginButton(user));registerPageTest.close();}

在这里插入图片描述

1.2.3 IndexPageTest

1) 首页不同帖子简要内容能否正常显示
 /*** 1.登录状态下访问首页* 2.查找 不同帖子是否存在=== elements 多个class为row的div标签是否存在多个** @param user* @return*/public boolean displayDiffPosts(User user) throws InterruptedException {Boolean login = login(user.getUsername(), user.getPassword());if (!login) return false;List<WebElement> elements = driver.findElements(By.cssSelector("#artical-items-body > div"));Thread.sleep(2000);return elements.size() >= 1;}
 @Testvoid displayDiffPosts() throws InterruptedException {User user = new User();user.setUsername("testUser");user.setPassword("h123");System.out.println("登录状态下首页不同帖子能否正常显示:" +indexPageTest.displayDiffPosts(user));}
2) 其他板块下不同帖子简要内容能否正常显示
 /*** 1.登录状态下点击不同板块* 2.查看该板块下的 不同帖子能否正常显示** @param user* @return* @throws InterruptedException*/public boolean clickDiffBoard(User user) throws InterruptedException {Boolean login = login(user.getUsername(), user.getPassword());if (!login) return false;//隐式等待5秒driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));WebElement boardTitle = driver.findElement(By.cssSelector("#topBoardList > li:nth-child(2) > a > span"));if (boardTitle == null) return false;boardTitle.click();WebElement element = driver.findElement(By.cssSelector("#article_list_board_title"));System.out.println(element.getText());return element != null && element.getText().length() > 0;}
@Testvoid clickDiffBoard() throws InterruptedException {User user = new User();user.setUsername("testUser");user.setPassword("h123");System.out.println("登录状态下不同板块不同帖子能否正常显示:" +indexPageTest.clickDiffBoard(user));}
3) 搜索功能
 /*** 1.登录* 2.找到输入框* 3.输入关键词* 4.搜索下拉框 能否找到多个结果元素** @param user* @return* @throws InterruptedException*/public boolean search(User user) throws InterruptedException {Boolean login = login(user.getUsername(), user.getPassword());if (!login) return false;//隐式等待5秒driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));WebElement inputSearch = driver.findElement(By.cssSelector("#input-search"));if (inputSearch == null) return false;inputSearch.sendKeys("java");List<WebElement> sarchElements = driver.findElements(By.cssSelector("#search-down>a"));return sarchElements.size() > 1;}
 @Testvoid seachr() throws InterruptedException {User user = new User();user.setUsername("testUser");user.setPassword("h123");System.out.println("登录状态下搜索功能能否正常使用:" +indexPageTest.search(user));}
4) 进入帖子详情页
 /*** 1.登录之后点击帖子正文* 2.跳转到详情页* 3.以详情页正文内容 能否查找到 并且正文长度大于0** @param user* @return* @throws InterruptedException*/public boolean intoDetailsPage(User user) throws InterruptedException {Boolean login = login(user.getUsername(), user.getPassword());if (!login) return false;//隐式等待5秒driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));WebElement postContent = driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-muted.mt-2 > div > div.content"));postContent.click();WebElement detailContent = driver.findElement(By.cssSelector("#details_article_content > p"));return detailContent != null && detailContent.getText().length() > 0;}
  @Testvoid intoDetailsPage() throws InterruptedException {User user = new User();user.setUsername("testUser");user.setPassword("h123");System.out.println("登录状态下点击帖子正文进入帖子详情页:" +indexPageTest.intoDetailsPage(user));}

在这里插入图片描述

1.2.4 MyPostPageTest

1) 登录状态下个人帖子列表能否正常显示
package forum;import forum.model.User;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;import java.time.Duration;public class MyPostPageTest extends ObjTest {private final String loginPageUrl = "http://82.156.186.83:8080/sign-in.html";public MyPostPageTest() {init();}private Boolean login(String username, String password) throws InterruptedException {driver.get(loginPageUrl);WebElement inputName = driver.findElement(By.cssSelector("#username"));WebElement inputPasw = driver.findElement(By.cssSelector("#password"));if (inputName == null || inputPasw == null) return false;inputName.clear();inputPasw.clear();inputName.sendKeys(username);inputPasw.sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(2000);WebElement element = null;try {element = driver.findElement(By.cssSelector("#nav_board_index > a > span"));} catch (Exception e) {}if (element == null) return false;return "首页".equals(element.getText());}/*** 1.登录状态下进入个人帖子页面* 2.检查个人帖子页面元素是否正常显示** @param user* @return* @throws InterruptedException*/public boolean displayMyPostPage(User user) throws InterruptedException {Boolean login = login(user.getUsername(), user.getPassword());if (!login) return false;driver.findElement(By.cssSelector("#index_nav_avatar")).click();WebElement element = driver.findElement(By.cssSelector("#index_user_profile"));if (element == null) return false;element.click();//隐式等待5秒driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));WebElement registerTime = driver.findElement(By.cssSelector("#profile_createTime"));if (registerTime == null) return false;return registerTime.getText().length() > 0;}
}
 @Testvoid displayMyPostPage() throws InterruptedException {User user = new User();user.setUsername("testUser");user.setPassword("h123");myPostPageTest.displayMyPostPage(user);}

在这里插入图片描述

1.2.5 DoPostPageTest

1) 登录状态下发布帖子
public boolean doPost(User user, Article article) throws InterruptedException {login(user.getUsername(), user.getPassword());//隐式等待5秒driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > div")).click();WebElement inputTitle = driver.findElement(By.cssSelector("#article_post_title"));inputTitle.sendKeys(article.getTitle());Thread.sleep(3000);WebElement inputContent = driver.findElement(By.cssSelector("#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre > span > span"));Actions action = new Actions(driver);action.doubleClick(inputContent).sendKeys(Keys.DELETE).perform();action.sendKeys(article.getContent()).perform();Thread.sleep(5000);driver.findElement(By.cssSelector("#article_post_submit")).click();return true;}
 @Testvoid doPost() throws InterruptedException {User user = new User();user.setUsername("testUser");user.setPassword("h123");Article article = new Article();article.setTitle("ceshititle");article.setContent("secshiContent");doPostPageTest.doPost(user,article);}

发布帖子符合预期

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

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

相关文章

DeepSeek模型量化

技术背景 大语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;&#xff0c;可以通过量化&#xff08;Quantization&#xff09;操作来节约内存/显存的使用&#xff0c;并且降低了通讯开销&#xff0c;进而达到加速模型推理的效果。常见的就是把Float16的浮…

本周行情——250222

本周A股行情展望与策略 结合近期盘面特征及市场主线演化&#xff0c;本周A股预计延续结构性分化行情&#xff0c;科技成长与政策催化板块仍是资金主战场&#xff0c;但需警惕高标股分歧带来的波动。以下是具体分析与策略建议&#xff1a; 1. 行情核心驱动因素 主线延续性&…

【JT/T 808协议】808 协议开发笔记 ② ( 终端注册 | 终端注册应答 | 字符编码转换网站 )

文章目录 一、消息头 数据1、消息头拼接2、消息 ID 字段3、消息体属性 字段4、终端手机号 字段5、终端流水号 字段 二、消息体 数据三、校验码计算四、最终计算结果五、终端注册应答1、分解终端应答数据2、终端应答 消息体 数据 六、字符编码转换网站 一、消息头 数据 1、消息头…

使用ezuikit-js封装一个对接摄像头的组件

ezuikit-js 是一个基于 JavaScript 的视频播放库&#xff0c;主要用于在网页中嵌入实时视频流播放功能。它通常用于与支持 RTSP、RTMP、HLS 等协议的摄像头或视频流服务器进行交互&#xff0c;提供流畅的视频播放体验。 主要功能 多协议支持&#xff1a;支持 RTSP、RTMP、HLS …

一周学会Flask3 Python Web开发-flask3模块化blueprint配置

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们在项目开发的时候&#xff0c;多多少少会划分几个或者几十个业务模块&#xff0c;如果把这些模块的视图方法都写在app.py…

DSC数字选择性呼叫

GMDSS Digital Selective Calling WAVECOM Decoder Online Help 12.0.0 VHF Marine GMDSS/DSC Decode & Scicos Simulation Black Cat Systems &#xff08;一&#xff09;DSC调制方式 DSC&#xff08;Digital Selective Calling&#xff0c;数字选择性呼叫&#xff0…

科普:你的笔记本电脑中有三个IP:127.0.0.1、无线网 IP 和局域网 IP;两个域名:localhost和host.docker.internal

三个IP 你的笔记本电脑中有三个IP&#xff1a;127.0.0.1、无线网 IP 和局域网 IP。 在不同的场景下&#xff0c;需要选用不同的 IP 地址&#xff0c;如下为各自的特点及适用场景&#xff1a; 127.0.0.1&#xff08;回环地址&#xff09; 特点 127.0.0.1 是一个特殊的 IP 地…

《AI与NLP:开启元宇宙社交互动新纪元》

在科技飞速发展的当下&#xff0c;元宇宙正从概念逐步走向现实&#xff0c;成为人们关注的焦点。而在元宇宙诸多令人瞩目的特性中&#xff0c;社交互动体验是其核心魅力之一。人工智能&#xff08;AI&#xff09;与自然语言处理&#xff08;NLP&#xff09;技术的迅猛发展&…

量化方法bitsandbytes hqq eetq区别

量化方法bitsandbytes、HQQ&#xff08;Half-Quadratic Quantization&#xff09;和EETQ&#xff08;Efficient and Effective Ternary Quantization&#xff09;在深度学习模型压缩和加速中各有特点&#xff0c;以下是它们的区别&#xff1a; 1. bitsandbytes 概述: bitsand…

Hutool - Log:自动识别日志实现的日志门面

一、简介 在 Java 开发中&#xff0c;日志记录是一项非常重要的功能&#xff0c;它可以帮助开发者在开发和生产环境中监控程序的运行状态、排查问题。然而&#xff0c;Java 生态系统中有多种日志实现框架&#xff0c;如 Log4j、Logback、JDK 自带的日志框架等。为了在不同的项…

伪404兼容huawei生效显示404

根据上述思考&#xff0c;以下是详细的中文分步说明&#xff1a; --- **步骤 1&#xff1a;获取目标设备的User-Agent信息** 首先&#xff0c;我们需要收集目标设备的User-Agent字符串&#xff0c;包括&#xff1a; 1. **iPhone设备的User-Agent**&#xff1a; Mozi…

github配置sshkey

使用命令生成sshkey ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 依此会要求输入以下信息&#xff0c;可以使用默认值 设置保存密钥的路径 设置SSH密钥密码&#xff08;备注&#xff1a;空内容表示不设置SSH密钥密码&#xff09; 再次确认SSH密钥密…

深入理解WebSocket接口:如何使用C++实现行情接口

在现代网络应用中&#xff0c;实时数据传输变得越来越重要。通过WebSocket&#xff0c;我们可以建立一个持久连接&#xff0c;让服务器和客户端之间进行双向通信。这种技术不仅可以提供更快的响应速度&#xff0c;还可以减少不必要的网络流量。本文将详细介绍如何使用C来实现We…

FFMPEG编码容错处理解决办法之途径----升级库文件

在qt开发环境下接收网络数据&#xff0c;调用ffmpeg解码播放视频&#xff0c;出现闪屏现象&#xff0c;具体现象可以使用操作系统自带的ffplay播放器播放原始视频流可复现&#xff1b;而使用操作系统自带的mpv播放器播放视频则不会出现闪屏&#xff1b;闪屏时会报Could not fin…

什么是超越编程(逾编程)(元编程?)

超越编程(逾编程)(元编程&#xff1f;)(meta-programming) 目录 1. meta- 的词源 2. 逾编程(meta-programming) 的直实含义 2.1 定义 2.2 说明 3. 翻译成“元编程”应该是一种错误 1. meta- 的词源 这是一个源自希腊语的构词元素&#xff0c;其有三种含义&#xff…

基于Martin的全国基础底图实现

概述 前面有文章基于Martin实现MapboxGL自定义底图分享了Martin的使用&#xff0c;本文使用网络收集的数据实现了全国基础数据的收集和基础底图。 实现后效果 实现 1. 数据准备 实例中包含如下数据&#xff1a; 边界线和九段线数据省边界面数据省会城市点数据市边界面数据…

新版Tomcat MySQL IDEA 安装配置过程遇到的问题

一、IDEA闪退 打不开了 IDEA环境变量路径不对 二、Tomcat 一闪而过 主要是JDK环境变量不对 三、MySQL 重新安装、是否备份以及默认盘问题 看清楚教程基本没问题&#xff1a;Windows 安装配置及卸载MySQL8超详细保姆级教程_mysql8卸载-CSDN博客

链表_两两交换链表中的节点

链表_两两交换链表中的节点 一、leetcode-24二、题解1.引库2.代码 一、leetcode-24 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能…

DAY08 List接口、Collections接口、Set接口

学习目标 能够说出List集合特点1.有序2.允许存储重复的元素3.有带索引的方法(练习 add,remove,set,get) 能够使用集合工具类Collections类:static void sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。static <T> void sort(List<T> lis…

Zookeeper(58)如何在Zookeeper中实现分布式锁?

在 Zookeeper 中实现分布式锁是一种常见的用例。Zookeeper 提供了强一致性、高可用性的分布式协调服务&#xff0c;使得它非常适合用来实现分布式锁。以下是详细的步骤和代码示例&#xff0c;展示如何在 Zookeeper 中实现分布式锁。 1. Zookeeper 分布式锁的基本原理 Zookeep…