对个人博客系统进行web自动化测试(包含测试代码和测试的详细过程)
目录
一、总述
二、登录页面测试
一些准备工作
验证页面显示是否正确
验证正常登录的情况
该过程中出现的问题
验证登录失败的情况
关于登录界面的总代码
测试视频
三、注册界面的自动化测试
测试代码
过程中出现的bug
测试视频
四、博客列表页测试(更新中...)
五、博客详情页测试
六、个人主页测试
七、博客编辑页面测试
八、博客修改页面测试
九、总结
一、总述
还记得这个SpringBoot实战项目吗?SpringBoot实战——个人博客项目_是小鱼儿哈的博客-CSDN博客
今天我们就对这个web项目,用selenium进行自动化测试,看看这个项目有什么问题?是否达到了我们的预期效果。
博客网站如下:登陆页面
首先要对这个博客各个页面设计测试页面。
下面我们就一个页面一个页面的写代码,进行测试。
二、登录页面测试
一些准备工作
首先我们新建一个Maven项目。
在test包下面写我们的测试代码。
因为我们在自动化测试的时候要频繁获取页面中的元素,但很多时候我们页面元素的加载速度赶不上我们自动化代码的执行速度,所以就会导致找不到元素这种情况。
可以看到,报了错误——》找不到我们页面对应的元素。
那么我们加上隐式等待试试
因此,我们不如在整个项目中,创建一个公共类(进行隐式等待,让我们的程序能够等一下我们的页面加载)
【另外, 隐式等待 作用于 WebDriver 整个生命周期】
【只要没有走到 driver.quit,即没有退出浏览器,隐式等待都是一直存在的】所以我们之后要写的登录界面只要继承的隐式等待,自然也能够使得测试登录界面的代码能够稍微停顿一下,等页面渲染完成。
![]()
下面我们进行登录页面的自动化测试代码编写
我们要编写3个测试用例
- 验证页面显示是否正确
- 验证正常登录的情况
- 验证登录失败的情况
首先因为我们每个测试用例都要 创建驱动实例,进入到用户登录页面、所以我们不妨这样做:
这样再将我们的测试用例按一定的顺序来执行,就会使得我们的整个测试过程很流程、自然。
验证页面显示是否正确
/*** 检查登录页面是否正常显示* @throws InterruptedException*/@Test @Order(1)void loginPageTest() throws InterruptedException {// 隐式等待--// 隐式等待,更加丝滑——》作用于下面的整个作用领域,这个方法中的所有元素,在这3秒内不断轮询driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));// 利用断言判断登录的文本内容显示是否正确String expect = "登录";String actual = driver.findElement(By.cssSelector("body > div.login-container > div > h3")).getText(); // 检查登录页面的登录文本是否存在Assertions.assertEquals(expect, actual);driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")); // 检查博客登录页的主页超链接是否存在// 检查提交按钮是否存在driver.findElement(By.cssSelector("#submit"));}
上面中我们用到了junit和隐式等待
junit 中提供和了非常强大的注解功能
@Test说明方法 是测试方法,执行当前这个类时,会自动的执行该类下的所有带@Test注解的用例
下面我们进行测试
验证正常登录的情况
/*** 检查正常登录的情况,每写一个测试用例就测试一下*/@ParameterizedTest // 写了该注解就不用在写@Test注解了(多参数)@Order(2)@CsvSource({"admin, admin", "小鱼儿, 123"})void loginRightTest(String username, String password) throws InterruptedException, IOException {// 隐式等待是作用不了非HTML页面的元素的,所以弹窗无法等待,看下是否在切换到弹窗之前弹窗还没有出现,终端报的错误是不是noalert// 多个账号登录,在重新输入账号时,需要把之前的输入的内容清空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();// 隐式等待无法处理弹窗 && 显示等待和隐式等待无法共存(父类AutotestUtils中用了隐式等待)Thread.sleep(100); // 显示等待,等待弹窗出现Alert alert = driver.switchTo().alert();alert.accept(); // 选择确认// 上述步骤只是说明输入了账号和密码,但还不知道点击提交后是否会跳转到博客列表页String expect = "http://49.235.66.46:9000/blog_list.html";String actual = driver.getCurrentUrl();Assertions.assertEquals(expect, actual); // 查看当前的url是否在博客详情页面// 进行截图,看当前是否跳转到了登录界面// 程序执行的速度和页面渲染的速度File srcFile = driver.getScreenshotAs(OutputType.FILE);String fileName = "loginRightTest.png";FileUtils.copyFile(srcFile, new File(fileName));//因为我们要测试多个账号,所有在一个账号检测完了后,还需要回退到登录界面driver.navigate().back();}
该过程中出现的问题
在验证用户正常登录的过程中,我一开始没有用强制等待或者显示等待(我只是用了隐式等待)。结果——在处理弹窗的过程就出现了问题。
咦!不对呀,我不是用了隐式等待了吗?
难道不应该是等弹窗加载完了,程序才会继续往下执行——获取弹窗的吗?
原来:
隐式等待是作用不了非HTML页面的元素的,所以弹窗无法等待(弹窗还没有出现,页面还没加载完成,我们的程序就在尝试着获取弹窗了——》这怎么获取?自然就报错了!!!
那么我们既然用不了隐式等待,我们用显示等待好了。但你别忘了,你这个对登录界面测试的类是继承了AutoTestUtils的(里面实现了隐式等待)
并且——显示等待和隐式等待尽量不要共存(会出现一些意想不到的错误)
所以呢?这种情况下,我们只好用强制等待了。
但是——强制等待是比较消耗时间的
我们需要考虑在整个项目中,类似这样的强制等待多不多,如果太多的话——我们就要考虑重写换一种策略了。
验证登录失败的情况
/*** 检查登录失败的情况*/@Order(3)@ParameterizedTest // 多个参数@CsvSource({"admin, 123"})void loginFailTest(String username, String password) throws IOException, InterruptedException {// 把之前默认填充内容清空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();Thread.sleep(100);Alert alert = driver.switchTo().alert();System.out.println(alert.getText());}
关于登录界面的总代码
package webAutoTest.tests;import com.sun.xml.internal.stream.StaxErrorReporter; import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.*; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import webAutoTest.common.AutotestUtils; import org.openqa.selenium.OutputType;import java.io.File; import java.io.IOException; import java.time.Duration; @TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 说明当前该类下面的测试方法要按一定的顺序执行 public class loginTest extends AutotestUtils {public static ChromeDriver driver = createDriver();@Test@BeforeAll // 被@BeforeAll修饰的方法要是静态的static void init() {// 跳转到博客登录页面driver.get("http://49.235.66.46:9000/login.html");}/*** 检查登录页面是否正常显示* @throws InterruptedException*/@Test@Order(1)void loginPageTest() throws InterruptedException {// 隐式等待--// 隐式等待,更加丝滑——》作用于下面的整个作用领域,这个方法中的所有元素,在这3秒内不断轮询driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));// 利用断言判断登录的文本内容显示是否正确String expect = "登录";String actual = driver.findElement(By.cssSelector("body > div.login-container > div > h3")).getText(); // 检查登录页面的登录文本是否存在Assertions.assertEquals(expect, actual);driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")); // 检查博客登录页的主页超链接是否存在// 检查提交按钮是否存在driver.findElement(By.cssSelector("#submit"));}/*** 检查正常登录的情况,每写一个测试用例就测试一下*/@ParameterizedTest // 写了该注解就不用在写@Test注解了(多参数)@Order(2)@CsvSource({"admin, admin", "小鱼儿, 123"})void loginRightTest(String username, String password) throws InterruptedException, IOException {// 多个账号登录,在重新输入账号时,需要把之前的输入的内容清空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();Thread.sleep(100);Alert alert = driver.switchTo().alert();alert.accept(); // 选择确认// 上述步骤只是说明输入了账号和密码,但还不知道点击提交后是否会跳转到博客列表页String expect = "http://49.235.66.46:9000/blog_list.html";String actual = driver.getCurrentUrl();Assertions.assertEquals(expect, actual); // 查看当前的url是否在博客详情页面// 进行截图,看当前是否跳转到了登录界面// 程序执行的速度和页面渲染的速度File srcFile = driver.getScreenshotAs(OutputType.FILE);String fileName = "loginRightTest.png";FileUtils.copyFile(srcFile, new File(fileName));//因为我们要测试多个账号,所有在一个账号检测完了后,还需要回退到登录界面driver.navigate().back();}/*** 检查登录失败的情况*/@Order(3)@ParameterizedTest // 多个参数@CsvSource({"admin, 123"})void loginFailTest(String username, String password) throws IOException, InterruptedException {// 把之前默认填充内容清空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();Thread.sleep(100);Alert alert = driver.switchTo().alert();System.out.println(alert.getText());}@AfterAll@Teststatic void quit() {driver.quit();} }
测试视频
登录页面自动化测试
三、注册界面的自动化测试
测试代码
package webAutoTest.tests;import org.apache.commons.io.FileUtils; import org.checkerframework.checker.units.qual.A; import org.junit.jupiter.api.*; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.chrome.ChromeDriver; import webAutoTest.common.AutotestUtils;import java.io.File; import java.io.IOException;/*** 注册界面的自动化测试*/ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 说明当前该类下面的测试方法要按一定的顺序执行 public class regTest extends AutotestUtils { // 继承用于隐式等待的公共方法public static ChromeDriver driver = new ChromeDriver();@Test // @Test说明方法 是测试方法,执行当前这个类时,会自动的执行该类下的所有带@Test注解的用例@BeforeAll // 带有BeforeAll注解的方法会在当前类下的所有测试用例之前(方法)执行一次,注意只是执行一次public static void init() {// 既然是对注册界面的测试,自然要先跳转到该界面driver.get("http://49.235.66.46:9000/reg.html");}/*** 对页面内容的完整性进行测试*/@Test@Order(1)public void regPageTest() {// 利用断言验证页面显示的文本是否正确String expect = "注册";String actual = driver.findElement(By.cssSelector("body > div.login-container > div > h3")).getText();Assertions.assertEquals(expect, actual); // 如果不正确driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")); // 检查博客登录页的主页超链接是否存在// 检查提交按钮是否存在driver.findElement(By.cssSelector("#submit"));}/*** 正常注册*/@ParameterizedTest // 多参数——加了该注解就不用@Test了@Order(2)@CsvSource({"皮皮, 123456, 123456"}) // 多参数public void regRightTest(String username, String password1, String password2) throws InterruptedException, IOException {// 每次都要提前把之前输入框的内容给清除(不管有没有内容)driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password1")).clear();driver.findElement(By.cssSelector("#password2")).clear();// 将信息填入输入框driver.findElement(By.cssSelector("#username")).sendKeys(username);driver.findElement(By.cssSelector("#password1")).sendKeys(password1);driver.findElement(By.cssSelector("#password2")).sendKeys(password2);// 找到提交按钮,并点击提交driver.findElement(By.cssSelector("#submit")).click();// 强制等待,让弹窗显示出来(避免我们页面还没加载完成,我们下面的代码就尝试获取弹窗Thread.sleep(500);// 注册成功后,会出现弹窗,获取弹窗并且关闭Alert alert = driver.switchTo().alert();alert.accept(); // 点击弹窗中的确定,以便让程序继续执行下去// 注册成功后,应该会跳转到登录页面Thread.sleep(100);String expectURL = "http://49.235.66.46:9000/login.html";String actualURL = driver.getCurrentUrl(); // 获取当前页面的URLAssertions.assertEquals(expectURL, actualURL);// 获取此时的屏幕截图,此时应该以及跳转到了登录页面File srcFile = driver.getScreenshotAs(OutputType.FILE);String fileName = "regRightTest.png";FileUtils.copyFile(srcFile, new File(fileName));// 因为注册成功会跳转到登录界面,所以但接下来我们还有在注册界面测试,所以要回退到注册界面driver.navigate().back();}/*** 测试注册失败的情况* (小鱼儿这个用户名我以及注册过了再次注册,由于用户名的唯一约束,会导致注册失败)* (前后两次输入的密码不一致)*/@ParameterizedTest@Order(3)@CsvSource({"小鱼儿, 1234, 1234", "阿良, 123, 123456"})public void regFailTest(String username, String password1, String password2) throws InterruptedException {// 每次输入信息前, 先要清除输入框的原有内容driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password1")).clear();driver.findElement(By.cssSelector("#password2")).clear();// 往输入框中输入数据driver.findElement(By.cssSelector("#username")).sendKeys(username);driver.findElement(By.cssSelector("#password1")).sendKeys(password1);driver.findElement(By.cssSelector("#password2")).sendKeys(password2);driver.findElement(By.cssSelector("#submit")).click();// 等待弹窗加载完成Thread.sleep(100);Alert alert = driver.switchTo().alert(); // 获取弹窗// 利用断言判断是否注册失败if (password1.equals(password2)) {String expect = "注册失败,请检查你的输入!"; // 前后密码一致的情况下String actual = alert.getText();alert.accept(); // 获取到弹窗内容后在关闭弹窗Assertions.assertEquals(expect, actual); // 看浏览器的实际弹窗内容是否和我们预期的一样}else {String expect = "两次密码输入不一致,请先检查!";String acutal = alert.getText();alert.accept();Assertions.assertEquals(expect, acutal);}}/*** 关闭注册弹窗*/@Test@AfterAll // 带有AfterAll注解的方法会在当前类下的所有测试用例(方法)执行之后 执行一次,注意只是执行一次public static void close() {driver.quit();}}
过程中出现的bug
2、在注册页面的自动化测试的过程中,我通过多对象传入同一个测试方法来对多种注册失败的情况进行测试(该用户以及注册、前后密码输入不一致)
结果在通过断言——发现我预期的弹窗内容和实际的弹窗内容不一致,导致测试的时候出现问题
通过查看下面的报错信息,结合程序一起查看,我才发现——我的判断条件有问题
应该用password1.equals(password2)
接着我改好了,但程序又出现了问题🤔
No ParameterResolver registered for parameter [java.lang.String arg1] in method [public void webAutoTest.tests.regTest.regFailTest(java.lang.String,java.lang.String,java.lang.String) throws java.lang.InterruptedException].
中间的逗点我写成了全角的中文——》当然有问题啊
改成半角的逗点后——》又又有新的问题出现了😂
通过这行报错信息可以看出
Command: [f0ef8a1466c85d3fc87f96ebd8e83a28, findElement {using=css selector, value=#username}]
在第二个错误登录的测试用例的执行的时候——》他找不到页面中的元素#username。
不对呀!!!我明明这个cssSelector写的没有问题啊,页面中也确实存在这个元素啊,为什么会找不到呢?
后来我把 ——driver.findElement(By.cssSelector("#username")).clear(); 这行代码给注释掉了
结果
看来不是页面元素selector的问题,难道是页面加载还没完成???
不会的——我们整个类继承了AutotestUtil(里面实现了隐式等待了啊,这里又不是弹窗,隐式等待应该能够发挥作用的呀!!!)
弹窗——于是我检查了代码中有关弹窗的部分。
结果:
没错,我是获取弹窗了
但是我没关闭弹窗啊!!!
这就导致在执行第二个测试用例的时候,上一个测试用例的弹窗还没有关闭——当然获取不到第二个测试用例的输入了呀!
终于可以了,不容易啊!
测试视频
注册页面自动化测试
四、博客列表页测试(更新中...)
五、博客详情页测试
六、个人主页测试
七、博客编辑页面测试
八、博客修改页面测试
九、总结
相关文章:

对个人博客系统进行web自动化测试(包含测试代码和测试的详细过程)
目录 一、总述 二、登录页面测试 一些准备工作 验证页面显示是否正确 验证正常登录的情况 该过程中出现的问题 验证登录失败的情况 关于登录界面的总代码 测试视频 三、注册界面的自动化测试 测试代码 过程中出现的bug 测试视频 四、博客列表页测试(…...

[ 2204听力 ] 五
[ 第五次课 对话1 ] Narrator Listen to a conversation between a student and her Ecology professor (woman) Hi, professor, did you want to talk about my paper? I didn’t get a grade. (man) Ah, yes, I think you might have done the wrong assignment. assign…...

嵌入式常问问题和知识
12、并发和并行的区别? 最本质的区别就是:并发是轮流处理多个任务,并行是同时处理多个任务。 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。 你吃饭吃到一半&…...

【数据结构】空间复杂度
🚀write in front🚀 📜所属专栏:初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对…...

湖南中创教育提醒校外培训留意这几点,避免维权
校外教育培训机构是市场经济发展的必然产物,有需求就有市场,这个无可厚非。而校外教育培训机构的火热,正是反映出人民群众对教育发展的需求在不断增强。 培训机构分类中有面对大学生参加公务员招考、教师考编等考证考试的培训机构࿱…...

docker 配置私有/本地镜像仓库
docker 配置私有/本地镜像仓库docker pull registry mkdir -p /usr/local/docker/registry-data docker tag registry 192.168.28.132:5000/registry docker run -di -p 5000:5000 --namelocal_registry --restartalways --privilegedtrue --log-drivernone -v /usr/local/d…...

每日学术速递2.23
Subjects: Robotics 1.On discrete symmetries of robotics systems: A group-theoretic and data-driven analysis 标题:关于机器人系统的离散对称性:群论和数据驱动分析 作者:Daniel Ordonez-Apraez, Mario Martin, Antonio Agudo, F…...

LeetCode 232. 用栈实现队列
LeetCode 232. 用栈实现队列 难度:easy\color{Green}{easy}easy 题目描述 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpushpush、poppoppop、peekpeekpeek、emptyemptyempty): 实现 MyQueueM…...

AI算法创新赛-人车目标检测竞赛总结04
队伍:AI000038 小组成员:杨志强,林松 1. 算法介绍 1.1 相关工作 当前流行的目标检测算法主要分为三种,一阶段算法:SSD,FCOS,Scaled,YOLO系列等;二阶段算法:…...

【C语言进阶】动态内存管理详解与常见动态内存错误以及柔性数组使用与介绍
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C语言进阶 🎯长路漫漫浩浩,万事皆有期待 文章目录1.动态内存1.1 概述…...

【C++】string的模拟实现
文章目录1. string的模拟实现1.构造函数使用new开辟空间优化成全缺省的构造函数2. C_str3. operator[]4.拷贝构造浅拷贝深拷贝5. 赋值三种情况6. 迭代器7.比较(ASCII值)大小8. reserve(扩容)9. push_back(尾插字符)10. append(尾插字符串)11. (字符/字符串)12. insert在pos位置…...

前端借助Canvas实现压缩base64图片两种方法
一、具体代码 1、利用canvas压缩图片方法一 // 第一种压缩图片方法(图片base64,图片类型,压缩比例,回调函数)// 图片类型是指 image/png、image/jpeg、image/webp(仅Chrome支持)// 该方法对以上三种图片类型都适用 压缩结果的图片base64与原类型相同// …...

用ChatGPT生成Excel公式,太方便了
ChatGPT 自去年 11 月 30 日 OpenAI 重磅推出以来,这款 AI 聊天机器人迅速成为 AI 界的「当红炸子鸡」。一经发布,不少网友更是痴迷到通宵熬夜和它对话聊天,就为了探究 ChatGPT 的应用天花板在哪里,经过试探不少人发现,…...

【Kubernetes 企业项目实战】09、Rancher 2.6 管理 k8s-v1.23 及以上版本高可用集群
目录 一、Rancher 介绍 1.1Rancher简介 1.2 Rancher 和 k8s 的区别 1.3 Rancher 企业使用案例 二、安装 Rancher 2.1 初始化环境 2.2 安装 Rancher 2.3 登录 Rancher 平台 三、通过 Rancher 管理已存在的 k8s 集群 3.1 配置 rancher 3.2 导入 k8s 四、通过 Ranc…...

在Excel中按条件筛选数据并存入新的表
案例 老板想要看去年每月领料数量大于1000的数据。手动筛选并复制粘贴出来,需要重复操作12次,实在太麻烦了,还是让Python来做吧。磨刀不误砍柴工,先整理一下思路: 1读取原表,将数量大于1000的数据所对应的行整行提取(如同在excel表中按数字筛选大于1000的) 2将提取的数…...

【面试题】MySQL索引相关知识点
1.什么是索引 索引是存储引擎快速查找记录的一种数据结构,就类似书的目录,通过目录可以快速的查找到想要查找的内容 2.索引的特点 特点:索引是基于数据引擎的,不同的数据引擎实现索引的方式不一定相同 好处:通过索引…...

MySQL索引类型及原理?一文读懂
一、什么是MySQL索引? MySQL索引是一种数据结构,用于提高数据库查询的性能。它类似于一本书的目录,通过在表中存储指向数据行的引用,使得查询数据的速度更快。 在MySQL中,索引通常是在表上定义的,它们可以…...

【C语言】字符分类函数+内存函数
目录 1.字符函数 1.1字符分类函数 1.2.字符转换函数 //统一字符串中的大小写 2.内存处理函数 2.1内存拷贝函数memcpy //模拟实现memcpy 2.2内存移动函数memmove //模拟实现memmove 2.3内存比较函数memcmp 2.4内存设置函数memset 1.字符函数 1.1字符分类函数 头文…...

高通平台开发系列讲解(SIM卡篇)SIM卡基础概念
文章目录 一、SIM卡基本定义二、卡的类型三、SIM卡的作用三、SIM卡基本硬件结构四、SIM卡的内部物理单元五、卡文件系统沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍SIM的相关组件。 一、SIM卡基本定义 SIM卡是一种智能卡(ICC Card/UICC Card) SIM…...

记录一次ubuntu下配置ssh登录出现的问题
现象描述: 1. 配置完服务器端公钥和本地的私钥之后,ssh登录始终会让输入密码,用ssh -vvv rootip 查看发现发送密钥之后就没反应了。 本机debug info: debug1: Trying private key: C:\Users\wangc/.ssh/id_xxxx (私钥文件) debug3…...

深度剖析数据在内存中的存储(下)(适合初学者)
上篇讲解了整形在内存中的存储方式,这篇文章就来继续讲解浮点数在内存中的存储方式。 上篇地址: (5条消息) 深度剖析数据在内存中的存储(上)_陈大大陈的博客-CSDN博客 目录: 3.浮点型在内存中的存储 3.1.浮点数的…...

智慧物联网系统源码:一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台
项目简介: 一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台,通过平台将所有设备连接起来,为上层应用提供设备的管理、数据收集、远程控制等核心物联网功能。 支持支持远程对设备进行实时监控、故障排查、远程控制&#…...

2023年,拥有软考证书在这些地区可以领取福利补贴
众所周知,软考的含金量很高,比如可以入户、领取技能补贴、抵扣个税、以考代评、招投标加分,入专家库… 今天小编给大家收集了拥有软考证书可以领取软考福利的地区,希望对大家有所帮助! 【深圳】 入户 ①核准类入户:…...

使用Unity在材质球上实现绘画:详细解释每一行Shader代码!
在Unity中实现在材质球上绘画可以使用下面这个步骤:创建一个基础的材质球:在Unity的项目面板中创建一个新材质球,然后将其分配给您要绘画的对象。创建一个Shader:为了实现在材质球上绘画,您需要使用一种特殊的Shader。…...

Tesseract 4.0训练字库并且识别训练后的图片
各个工具下载链接在文章底部! 重要!!自己先创建一个空文件夹(名字随意),用来保存训练后的模型 ,还需要在里面创建一个 名称为tessdata 的文件夹 ,必须叫这个名 可以先使用下载后的进行测试训练(只需要把ja…...

ChatGPT热潮背后,金融行业大模型应用路在何方?——金融行业大模型应用探索
ChatGPT近两个月以来不断引爆热点,对人工智能应用发展的热潮前所未有地高涨,ChatGPT所代表的大模型在语义理解、多轮交互、内容生成中所展现的突出能力令人惊喜。而人工智能技术在金融行业的落地应用仍然面临挑战,虽然已经让大量宝贵的人力从…...

【怎么预防sql注入,以及还有预防其他的什么网络攻击】
SQL注入是一种常见的Web攻击,通过在Web应用程序中注入恶意SQL语句来获取或修改数据库中的数据。为了防止SQL注入,开发者可以采取以下措施: 1、使用参数化查询(Prepared Statement)或存储过程(Stored Proce…...

2023年全国最新机动车签字授权人精选真题及答案4
百分百题库提供机动车签字授权人考试试题、机动车签字授权人考试预测题、机动车签字授权人考试真题、机动车签字授权人证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 11.使用转化炉原理测量氮氧化物的排气分析仪进行排气污…...

【Java】用记事本实现“HelloWorld”输出
【在进行以下操作前需要下载好JDK并配置好对应的环境变量】 一、在任意文件夹中创建一个新的文本文档文件并写入以下代码 public class Hello{public static void main (String[] args){System.out.print("Hello,World!");} } 二、修改文件名称及文件类型为 Hello.j…...

我希望早点知道的关于成长的建议
人上了年纪,往往在诸如更加闭塞,更加固执这些缺点之外,再多出来一个缺点:那就是动不动就爱给别人建议。我当然也未能免俗。有时候会听到同样悲观且固执的过来人告诉我,这些建议说了和没说效果都一样,人们在…...