鸟语林-论坛系统自动化测试
文章目录
- 一、自动化实施步骤
- 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);}
发布帖子符合预期
相关文章:
鸟语林-论坛系统自动化测试
文章目录 一、自动化实施步骤1.1编写Web测试用例1.2 编写自动化代码1.2.1 LoginPageTest1) 能否正确打开登录页面2) 点击去注册能否跳转注册页面3) 模拟用户登录,输入多组登录测试用例 1.2.2 RegisterPageTest1) 能否成功打开注册页面2) 注册测试用例3) 点击去登录按…...
图解循环神经网络(RNN)
目录 1.循环神经网络介绍 2.网络结构 3.结构分类 4.模型工作原理 5.模型工作示例 6.总结 1.循环神经网络介绍 RNN(Recurrent Neural Network,循环神经网络)是一种专门用于处理序列数据的神经网络结构。与传统的神经网络不同,…...
c语言左值和右值的区别
在C语言中,左值(lvalue)和右值(rvalue)是互斥的概念,左值不能是右值。以下是详细的解释和总结: 1. 左值(lvalue) 定义:左值是一个表达式,表示一个…...
Scrapy:Downloader下载器设计详解
Scrapy下载器设计详解 1. 整体架构 Scrapy的下载器(Downloader)是整个爬虫框架的核心组件之一,负责处理所有网络请求的下载工作。它的主要职责是: 管理并发请求实现请求调度处理下载延迟维护下载槽(Slot) 官方文档:Settings中的Downloader配…...
细说STM32F407单片机2个ADC使用DMA同步采集各自的1个输入通道的方法
目录 一、示例说明 二、工程配置 1、RCC、DEBUG、CodeGenerator 2、USART6 3、TIM3 (1)Mode (2)参数设置 (3) TRGO (4)ADC1_IN0 1)ADCs_Common_Settings 2&a…...
【分治法】线性时间选择问题
问题描述 给定线性序列中n个元素和一个整数k,1≤k≤n,要求在线性时间中找出这n个元素中第k小的元素 常规思路 常规思路是对序列先排序,落在第k个位置的元素就是第k小的元素。 这种方法的时间复杂度不是线性的,是O(nlogn)的时间…...
redis中的Lua脚本,redis的事务机制
lua脚本的特点 lua脚本可以操作redis数据库,并且脚本中的代码满足原子性,要么全部被执行,要么全部不执行 lua脚本的语法 脚本示例 lua脚本的草稿: 最终的lua脚本 lua脚本在java里调用的方法 RedisTemplete类里有一个方法&…...
ASUS/华硕 ROG Strix GL503VM 原厂Win10系统 工厂文件 带ASUS Recovery恢复
华硕工厂文件恢复系统 ,安装结束后带隐藏分区,带一键恢复,以及机器所有的驱动和软件。 支持型号:GL503VM 系统版本:Windows 10 文件下载:点击下载 文件格式:工厂文件 安装教程:…...
Oracle 深入理解Lock和Latch ,解析访问数据块全流程
Oracle 锁机制介绍 根据保护对象的不同,单实例Oracle数据库锁可以分为以下几大类: DML lock(data locks,数据锁):用于保护数据的完整性; DDL lock(dictionary locks,字典…...
Django Admin: 动态合并数据库和预定义选项的高级过滤器实现
在 Django 管理界面中,我们经常需要为某些字段提供过滤选项。通常情况下,这些选项要么是预定义的,要么是从数据库中动态获取的。但是,有时我们需要更灵活的解决方案:当数据库为空时使用预定义选项,而当数据库有数据时,则合并预定义选项和数据库中的值。本文将详细介绍如…...
Linux文件系统
理解硬件 磁盘、服务器、机柜、机房 机械磁盘是计算机中唯一的一个机械设备 磁盘--- 外设,慢,容量大,价格便宜 磁盘物理结构 扇区是从磁盘读出和写入信息的最小单位,通常大小为 512 字节。磁头(head)数&a…...
C++标准库——时间
文章目录 chrono库durationtime_pointclocks C 风格日期和时间库参考 C 支持两种类型的时间操作: Chrono库,在chrono头文件中提供C 风格日期和时间库,std::time这种,在ctime头文件中提供 chrono库 在<chrono>中࿰…...
AutoGen 技术博客系列 八:深入剖析 Swarm—— 智能体协作的新范式
本系列博文在掘金同步发布, 更多优质文章,请关注本人掘金账号: 人肉推土机的掘金账号 AutoGen系列一:基础介绍与入门教程 AutoGen系列二:深入自定义智能体 AutoGen系列三:内置智能体的应用与实战 AutoGen系列四&am…...
【系统架构设计师】操作系统的分类
目录 1. 说明2. 批处理操作系统3. 分时操作系统4. 实时操作系统5. 网络操作系统6. 分布式操作系统7. 微型计算机操作系统8.嵌入式操作系统9.例题9.1 例题1 1. 说明 1.通常,操作系统可分为批处理操作系统、分时操作系统、实时操作系统、网络操作系统、分布式操作系统…...
25林业研究生复试面试问题汇总 林业专业知识问题很全! 林业复试全流程攻略 林业考研复试真题汇总
25 林业考研复试,专业面试咋准备?学姐来支招! 宝子们,一提到林业考研复试面试,是不是就慌得不行,感觉老师会扔出一堆超难的问题?别怕别怕,其实林业考研复试就那么些套路,…...
基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘 要 《计算机网络》题库管理系统是一种新颖的考试管理模式,因为系统是用Java技术进行开发。系统分为三个用户进行登录并操作,分别是管理员、教师和学生。教师在系统后台新增试题和试卷,学生进行在线考试,还能对考生记录、错题…...
常用高压缩率的视频容器格式,并进行大比例压缩
常用的高压缩率视频容器格式,包括*.mp4 、*.mkv、*.webM等。 容器格式本身并不直接决定压缩率,而是取决于容器中所使用的视频编码格式等因素。不过,在常见的视频容器格式中,一些容器在搭配特定编码格式时,通常能表现出较高的压缩效率,以下是相关介绍: 1 MKV格式 …...
请说明C#中的List是如何扩容的?
在 C# 中,List<T>是一个动态数组,它会根据需要自动调整其容量以容纳更多的元素。 目录 1 扩容条件与扩容算法规则 2 总结 1 扩容条件与扩容算法规则 当你创建一个新的List<T>实例时,如果没有指定初始容量,它会使…...
《微软量子芯片:开启量子计算新纪元》:此文为AI自动生成
量子计算的神秘面纱 在科技飞速发展的今天,量子计算作为前沿领域,正逐渐走进大众的视野。它宛如一把神秘的钥匙,有望开启未来科技变革的大门,而微软量子芯片则是这把钥匙上一颗璀璨的明珠。 量子计算,简单来说,是一种遵循量子力学规律调控量子信息单元进行计算的新型计算…...
使用AI创建流程图和图表的 3 种简单方法
你可能已经尝试过使用 LLMs 生成图像,但你有没有想过用它们来创建 流程图和图表?这些可视化工具对于展示流程、工作流和系统架构至关重要。 通常,在在线工具上手动绘制图表可能会耗费大量时间。但你知道吗?你可以使用 LLMs 通过简…...
数字后端实现之Innovus中open net原因解析及解决方案
数字IC后端设计实现Innovus中我们经常会碰到如下的WARNING警告信息。这个log是在route或ECO Route阶段报的。这个WARNING必须要看,因为这里是报告当前设计存在open的net,即某些pin只有逻辑连接,而没有实际的物理连接。 这里正常工具应该报ERR…...
【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字
⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、初识协议2、UDP、TCP3、Mac、IP地址4、端口号5、网络字节序6、socket 1、初识协议 协议就是一种约定。如何让不同厂商生产的计…...
vue 学习-vite api.js
/** 整机管理 * */ // 整机分类 列表 export const wholeMachineServersType params > ajaxGet({url: wholeMachine/serverstype/,params}) // 整机分类 新增 export const wholeMachineServersTypeAdd params > ajaxPost({url: wholeMachine/serverstype/,params}) /…...
Unity贴图与模型相关知识
一、贴图 1.贴图的类型与形状 贴图类型 贴图形状 2.在Unity中可使用一张普通贴图来生成对应的法线贴图(但并不规范) 复制一张该贴图将复制后的贴图类型改为Normal Map 3.贴图的sRGB与Alpha sRGB:勾选此选项代表此贴图存储于Gamma空间中…...
Elasticsearch实战应用:从“搜索小白”到“数据侦探”的进阶之路
引言:Elasticsearch——数据世界的“福尔摩斯” 大家好,今天我们要聊的是一个在数据世界中扮演“福尔摩斯”角色的工具——Elasticsearch。如果你曾经为海量数据的搜索和分析头疼不已,那Elasticsearch就是你的救星!它不仅能帮你快…...
更改visual studio 2022 默认NuGet包路径
本文章仅提供更改用户级别的NuGet包默认路径的更改,电脑级别的更改需要更改%ProgramData%\NuGet\Config\machine.config, 而且需要管理员权限,但是更改内容类似用户级别的NuGet更改。 1. 关闭VS 2. 打开NuGet配置文件路径 可通过以下两种方…...
什么是超越编程(逾编程)(元编程?)
超越编程(逾编程)(元编程?)(meta-programming) 目录 1. meta- 的词源 2. 逾编程(meta-programming) 的直实含义 2.1 定义 2.2 说明 3. 翻译成“元编程”应该是一种错误 1. meta- 的词源 这是一个源自希腊语的构词元素,其有三种含义ÿ…...
深入理解设计模式之解释器模式
深入理解设计模式之解释器模式 在软件开发的复杂世界中,我们常常会遇到需要处理特定领域语言的情况。比如在开发一个计算器程序时,需要解析和计算数学表达式;在实现正则表达式功能时,要解析用户输入的正则表达式来匹配文本。这些场景都涉及到对特定语言的解释和执行,而解…...
用户体验测试
引言 在数字化时代,用户体验(UX)是衡量产品成功与否的关键指标之一。它不仅关乎产品的功能和性能,更涉及用户在使用过程中的情感反应和信任建立。作为软件测试专家,深入理解并实践用户体验测试是确保产品竞争力的关键。…...
51单片机-串口通信编程
串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制盒中断控制。具体步骤如下: 确定T1的工作方式(编程TMOD寄存器)计算T1的初值,装载TH1\TL1启动T1(编程TCON中的TR1位…...
论文略读:Uncovering Hidden Representations in Language Models
202502 arxiv 说一下主要结论吧 对于下游任务,语言模型的中间层在所有架构和任务中始终优于最后一层 这挑战了使用最后一层表示的传统观点。 不同的架构表现出不同的信息压缩模式。自回归模型在中间层存在瓶颈,而双向模型则保持更均匀的趋势 BERT通过双…...
正确清理C盘空间
一.系统清理 正确清理C盘空间主要是删除不需要的文件和应用程序,以释放磁盘空间。以下是一些常用的方法: 删除临时文件:在Windows搜索框中输入“%temp%”,打开临时文件夹,将其中的文件全部删除。 清理回收站…...
数据表的存储过程和函数介绍
文章目录 一、概述二、创建存储过程三、在创建过程中使用变量四、光标的使用五、流程控制的使用六、查看和删除存储过程 一、概述 存储过程和函数是在数据库中定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可…...
IntelliJ IDEA 控制台输出中文出现乱码
IntelliJ IDEA 控制台输出中文出现乱码通常是由于编码设置不一致导致的。以下是常见原因及解决方法 1. 项目编码设置 检查路径:File → Settings → Editor → File Encodings 确保 Project Encoding、Global Encoding 和 Default Encoding for Properties Files 均…...
ARMS 助力假面科技研发运维提效,保障极致游戏体验
客户介绍与项目背景 假面科技成立于 2014 年,致力于打造创新的数字产品,火爆一时的“狼人杀”、“谁是卧底”、“足记相机”都是假面科技旗下产品,公司产品总数超过 40 款,覆盖用户数超过 2 亿人。 随着业务的持续发展ÿ…...
go json处理 encoding/json 查询和修改gjson/sjson
推荐 标准库encoding/json import ("encoding/json""log" )// Student1 注意点: // 1. 注意alain别名的写法: json:"name1" 而非 "json:name1" // 2. 注意json.Marshal的时候只输出首字母大写的属性 // 3. jso…...
Web Worker终极优化指南:4秒卡顿→0延迟的实战蜕变
💡 导读:从4秒卡顿到丝滑响应 真实痛点场景:当斐波那契数列计算量达10亿次时,页面完全冻结4.2秒!通过Web Worker优化后,UI响应时间降至16ms以内。本文手把手带您实现性能蜕变! 一、Web Worker核…...
python读取pdf文档
import io import pdfplumber from opencc import OpenCC import fitz # pymupdf import osfile_path /document/pdf/xxx.pdf output_dir /classification/pdf/images #获取图片 demo def extract_images_from_pdf(pdf_path, output_dir):# 确保输出目录存在if not os.path.…...
CSS垂直居中终极方案:告别复杂计算,拥抱现代布局
CSS垂直居中终极方案:告别复杂计算,拥抱现代布局 📌 前言:为什么垂直居中如此重要?一、2024年最推荐的3种方案1. Flexbox布局(首推方案)2. Grid布局(未来趋势)3. Transfo…...
ROS2 应用:按键控制 MoveIt2 中 Panda 机械臂关节位置
视频讲解 ROS2 应用:按键控制 MoveIt2 中 Panda 机械臂关节位置 创建 ROS 2 包 进入工作空间的 src 目录,然后创建一个新的 Python 包: ros2 pkg create --build-type ament_python panda_joint_control --dependencies rclpy control_msgs…...
SHELL32!Shell_MergeMenus函数分析
SHELL32!Shell_MergeMenus函数分析 UINT Shell_MergeMenus( [in] HMENU hmDst, [in] HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags ); 参数 [in] hmDst 类型: HMENU 要向其添加 hmSrc…...
python: SQLAlchemy (ORM) Simple example using SQLite
领域层(Domain Laye):定义了 School 实体类和 SchoolRepository 抽象基类,明确了业务实体和数据访问的契约。 基础设施层(Infrastructure Laye):通过 SQLAlchemy 实现了 SchoolRepository 类&am…...
MySQL 视图入门
一、什么是 MySQL 视图 1.1 视图的基本概念 在 MySQL 中,视图是一种虚拟表,它本身并不存储实际的数据,而是基于一个或多个真实表(基表)的查询结果集。可以把视图想象成是一个预定义好的查询语句的快捷方式。当你查询…...
【洛谷排序算法】P1012拼数-详细讲解
这道题本质上是通过确定数字的拼接顺序来得到最大拼接数,虽然主要思路是利用字符串及其比较规则来实现,但也可以基于数组结合一些转换操作来解决,以下是大致思路和代码示例: 【算法思路】 首先将输入的数字存储在数组中。然后自…...
在WPS中设置word的页码不从第一页开始,从指定页开始插入页码
大家好,我是小鱼。 在日常的办公中为Word文档页面插入页码是经常要做的。如果一个文档有几十页,插入页码不仅可以快速定位到文章的内容,如果需要制作目录也方便制作。正确情况下插入页码都是从第一页开始的,但是有些文档比如说标…...
鸿蒙app 开发中 对于数组方法 filter 的理解
这段代码是 TypeScript 中数组 filter 方法的类型定义,下面将详细解释其各个部分的含义、作用及使用场景。 整体功能概述 filter 方法是 JavaScript 和 TypeScript 中数组对象的一个内置方法,它的主要功能是创建一个新数组,新数组中的元素是…...
【废物研究生刷算法】字符串
文章目录 1. 反转字符串2. 替换数字3. 反转字符串中的单词4. 右旋字符串总结1、字符串处理函数2、字符串切片 如果使用python处理字符串,有很多py内置的函数可以使用,主要还是记住这些处理方法。 1. 反转字符串 class Solution:def reverseStr(self, s, …...
深入理解 SQL 注入漏洞及解决方案
一、引言 在当今数字化时代,数据库作为存储和管理数据的核心组件,其安全性至关重要。SQL 注入是一种常见且极具威胁性的数据库安全漏洞,它可能导致数据泄露、篡改甚至系统被完全控制。本文将深入探讨 SQL 注入漏洞的产生原因、表现形式以及如…...
Next.js 学习-1
Next.js学习 引用:https://www.nextjs.cn/learn/basics/create-nextjs-app 先试试水吧,正好dify用的这个构建的前端项目。 使用 如果您尚未安装 Node.js,请 从此处安装。要求 Node.js 10.13 或更高版本。 好吧得用新的了,记得…...
[ComfyUI]Recraft贴图开源方案,实现服装印花自由
一、介绍 今天发现了一个简单又好用的插件,可以实现类似Recraft的贴图功能,这是一个作者开发的ComfyUI插件,叫做Comfyui-Transform 这个插件比我们简单的图像覆盖多了一些可控参数,形状、透明度、倾斜、拉升和混合模式等诸多可控…...