学海记录项目测试报告
⭐️前言⭐️
本篇文章是博主基于学海记录的个人项目所做的测试报告,用于总结运用自动化测试技术,应用于自己的项目。
🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁
🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言
🍉博客中涉及源码及博主日常练习代码均已上传GitHub
📍内容导读📍
- 🍅1.UI自动化测试用例
- 🍅2.selenium4+JUnit5实现Web自动化测试
- 2.1 测试工具类
- 2.2 博客登录页测试
- 2.3 博客列表页测试
- 2.4 博客详情页测试
- 2.5 博客编辑页测试
- 2.6 驱动释放
- 2.7 测试套件
- 2.8 测试结果展示
🍅1.UI自动化测试用例
🍅2.selenium4+JUnit5实现Web自动化测试
针对上图中的UI自动化测试用例,挑选部分用例通过selenium4+JUnit5实现Web自动化测试,如下是具体实现:
2.1 测试工具类
因为每一步的测试都需要获取驱动对象,所以将获取驱动对象的方法抽象出来单独成类,用于其他类的使用;
便于检查测试结果,还需要在公共类中实现屏幕截图的方法,以下是测试工具类的具体代码:
public class Utils {public static ChromeDriver driver;// 创建驱动对象public static ChromeDriver createDriver() {// 设置无头模式ChromeOptions options=new ChromeOptions();options.addArguments("-headless");// 驱动对象已经创建好了/没有创建if(driver==null) {driver=new ChromeDriver(options);// 创建隐式等待(防止因页面加载过慢而导致错误)driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));}return driver;}public static List<String> getTime() {// 文件按照天的维度按文件夹进行保存SimpleDateFormat sim1=new SimpleDateFormat("yyyyMMdd-HHmmssSS");SimpleDateFormat sim2=new SimpleDateFormat("yyyyMMdd");String fileName=sim1.format(System.currentTimeMillis());String dirName=sim2.format(System.currentTimeMillis());List<String> list=new ArrayList<>();list.add(dirName);list.add(fileName);return list;}/*** 获取屏幕截图,把所有的用例执行结果保存下来*/public static void getScreenShot(String str) throws IOException {List<String> list=getTime();String fileName="./src/test/java/screenshot/"+list.get(0)+"/"+str+"_"+list.get(1)+".png";File srcFile=driver.getScreenshotAs(OutputType.FILE);// 把屏幕截图生成的文件放到指定的路径FileUtils.copyFile(srcFile,new File(fileName));}
}
2.2 博客登录页测试
首先先获取到驱动对象,然后通过@Before
注解方法,访问到登录页面的URL。
public static ChromeDriver driver= Utils.createDriver();// 如果要测试登录页面,以下所有的用例都有一个共同的步骤// 1、要有浏览器对象 2、访问登录页面的URL@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/login.html");}
通过检查跳转后的博客列表页的元素是否存在,检查登录页面打开是否正确。
/*检查登录页面打开是否正确检查点:公共主页 注册元素是否存在*/@Test@Order(1)void loginLoad() throws IOException {driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));Utils.getScreenShot(getClass().getName());}
多参数实现正常登录的测试
/*检查正常登录情况*/@ParameterizedTest@CsvSource({"admin,admin","zhangsan,123"})@Order(2)void loginSuccess(String name,String password) throws IOException, InterruptedException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(500);// 对登陆结果进行检测,Alert alert=driver.switchTo().alert();String expect="登录成功!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());driver.navigate().back();}
检验异常登录的情况
/*检查异常登录情况*/@ParameterizedTest@CsvSource({"admin,123"})@Order(3)void loginFail(String name,String password) throws InterruptedException, IOException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(500);// 对异常登录结果进行检测Alert alert=driver.switchTo().alert();String expect="抱歉:用户名或密码错误,请重新输入!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());}
注意以上的测试用例需要按指定顺序来执行,必须得先检验完成登录页面能正常打开,才能进行下一步正常登录、异常登录的测试。
以下是登录页面自动化测试用例的总代码。
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogLoginTest {public static ChromeDriver driver= Utils.createDriver();// 如果要测试登录页面,以下所有的用例都有一个共同的步骤// 1、要有浏览器对象 2、访问登录页面的URL@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/login.html");}/*检查登录页面打开是否正确检查点:公共主页 注册元素是否存在*/@Test@Order(1)void loginLoad() throws IOException {driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));Utils.getScreenShot(getClass().getName());}/*检查正常登录情况*/@ParameterizedTest@CsvSource({"admin,admin","zhangsan,123"})@Order(2)void loginSuccess(String name,String password) throws IOException, InterruptedException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(500);// 对登陆结果进行检测,Alert alert=driver.switchTo().alert();String expect="登录成功!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());driver.navigate().back();}/*检查异常登录情况*/@ParameterizedTest@CsvSource({"admin,123"})@Order(3)void loginFail(String name,String password) throws InterruptedException, IOException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(500);// 对异常登录结果进行检测Alert alert=driver.switchTo().alert();String expect="抱歉:用户名或密码错误,请重新输入!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());}
}
2.3 博客列表页测试
首先先访问到博客列表页,对博客列表页中的元素检查是否存在来检验博客列表页的加载。
public class BlogListTest {public static ChromeDriver driver= Utils.createDriver();@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/myblog_list.html");}/*** 博客列表页可以正常显示*/@Testvoid listPageLoadTest() throws IOException {driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)"));Utils.getScreenShot(getClass().getName());}
}
2.4 博客详情页测试
首先先访问到博客详情页,对博客详情页中的元素检查是否存在来检验博客详情页的加载。
public class BlogDetailTest {public static ChromeDriver driver= Utils.createDriver();@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/blog_content.html?blogId=1");}@Testvoid blogDetailLoadTest() throws IOException {driver.findElement(By.xpath("//*[@id=\"title\"]"));Utils.getScreenShot(getClass().getName());}
}
2.5 博客编辑页测试
首先先访问到博客编辑页,对博客编辑页中的元素检查是否存在来检验博客编辑页的加载。
public static ChromeDriver driver= Utils.createDriver();@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/blog_edit.html");}/*检查博客编辑页是否可以正常打开*/@Test@Order(1)void editPageLoadTest() throws IOException {driver.findElement(By.cssSelector("#title"));driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button"));Utils.getScreenShot(getClass().getName());}
在博客编辑页的测试中,还需要对是否能够正常编辑并发布文章进行测试。
/*检查能不能正常编辑并发布文章*/@Test@Order(2)void editAndSubmitBlogTest() throws IOException, InterruptedException {String title="测试文章";driver.findElement(By.cssSelector("#title")).sendKeys(title);// 因博客系统使用到的编辑器是第三方库,所以不能直接使用sendKeys向编辑模块发送文本driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(20) > a > i")).click();driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(21) > a > i")).click();driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();Thread.sleep(500);// 对异常登录结果进行检测Alert alert=driver.switchTo().alert();String expect="恭喜:发布成功!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());}
总代码:
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogEditTest {public static ChromeDriver driver= Utils.createDriver();@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/blog_edit.html");}/*检查博客编辑页是否可以正常打开*/@Test@Order(1)void editPageLoadTest() throws IOException {driver.findElement(By.cssSelector("#title"));driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button"));Utils.getScreenShot(getClass().getName());}/*检查能不能正常编辑并发布文章*/@Test@Order(2)void editAndSubmitBlogTest() throws IOException, InterruptedException {String title="测试文章";driver.findElement(By.cssSelector("#title")).sendKeys(title);// 因博客系统使用到的编辑器是第三方库,所以不能直接使用sendKeys向编辑模块发送文本driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(20) > a > i")).click();driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(21) > a > i")).click();driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();Thread.sleep(500);// 对异常登录结果进行检测Alert alert=driver.switchTo().alert();String expect="恭喜:发布成功!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());}
}
2.6 驱动释放
当完成上述所有的测试后,需要对驱动进行释放:
public class DriverQuitTest {public static ChromeDriver driver= Utils.createDriver();// 最后需要关闭driver@Testvoid driverQuit() {driver.quit();}
}
2.7 测试套件
通过测试套件,指定按顺序的类中的所有测试用例开始执行:
@Suite
@SelectClasses({BlogLoginTest.class,BlogListTest.class,BlogDetailTest.class,BlogEditTest.class,DriverQuitTest.class})
public class RunSuite {
}
2.8 测试结果展示
测试结果如下图:
⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁
相关文章:
![](https://img-blog.csdnimg.cn/505bfdad61e746389519a7d39b6bf99f.gif#pic_center)
学海记录项目测试报告
⭐️前言⭐️ 本篇文章是博主基于学海记录的个人项目所做的测试报告,用于总结运用自动化测试技术,应用于自己的项目。 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主将持续更新学习记录…...
![](https://img-blog.csdnimg.cn/9eb661455602407886e00e0eb7465049.png)
【1792. 最大平均通过率】
来源:力扣(LeetCode) 描述: 一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组 classes ,其中 classes[i] [passi, totali] ,表示你…...
![](https://img-blog.csdnimg.cn/afe1a03db90b4af7b4b4a791c5ea765d.png)
言简意赅+图解 函数传参问题(传值、传地址 500字解决战斗)
1、传值 2、传地址 不论是传值,还是传地址,形参都是对于实参的一份拷贝 下图为按值传递进行交换: 形参left拷贝一块新空间,形参right拷贝一块新空间 下图为按指针传递进行交换 形参left拷贝一块新的空间,形参right…...
![](https://img-blog.csdnimg.cn/9e9f0b65a57440379fb6c96af9d4b90a.png)
UML-时序图以及PlantUML绘制
介绍 时序图(Sequence Diagram),又名序列图、循序图,是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序,当执行一个用例行为时,其中的每条消息…...
![](https://img-blog.csdnimg.cn/60e0a2a45e5d43b7bc7253a7f945c2b5.png)
【Redis】Redis 有序集合 Zset 操作 ( 简介 | 查询操作 | 增加操作 | 删除操作 | 修改操作 )
文章目录一、有序集合 Zset二、查询操作1、查询 Zset 所有数据2、查询 Zset 所有数据和评分3、查询指定评分范围的 Zset 数据4、查询指定评分范围的 Zset 数据并从大到小排序5、统计指定评分范围的 Zset 数据个数6、查询指定元素在 Zset 有序集合中的排名三、增加操作1、向 Red…...
![](https://img-blog.csdnimg.cn/55a3dd1bb4324fcd921f392b5236dd5f.png#pic_center)
Java特性之设计模式【策略模式】
一、策略模式 概述 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略…...
![](https://www.ngui.cc/images/no-images.jpg)
IR-CUT 保证摄像机成像效果的滤镜
IR-CUT双滤镜是指在摄像头镜头组里内置了一组滤镜,当镜头外的红外感应点侦测到光线的强弱变化后,内置的IR-CUT自动切换滤镜能够根据外部光线的强弱随之自动切换,使图像达到最 佳效果。也就是说,在白天或黑夜下,双滤光片…...
![](https://img-blog.csdnimg.cn/abb37a674d974308837aab46ae72cc41.png)
openpnp - 普通航空插头和PCB的连接要使用线对板连接器
文章目录openpnp - 普通航空插头和PCB的连接要使用线对板连接器概述改进实际效果总结ENDopenpnp - 普通航空插头和PCB的连接要使用线对板连接器 概述 和同学讨论问题, 准备将航空插头连接到PCB上. 航空插头选用GX12-4公头, 拧到开孔的铁板上. 然后航空插头公头再与PCB连接. 铁…...
![](https://img-blog.csdnimg.cn/cdd8ff457875409da9db8b6b1983a0af.png)
Python3 错误和异常实例及演示
作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍。 Python 有2种错误很容易辨认:语法错误和异常。 Python assert(断言)用于判断…...
![](https://www.ngui.cc/images/no-images.jpg)
Android 9.0第三方app根据包名设置为横屏显示
1.概述 在android9.0的系统rom定制化开发中,在某些横屏的设备比如平板电脑,tv智能电视,广告机等等设备中,通常系统是默认横批显示的,但是在安装一些竖屏app的时候, 就会旋转为竖屏,这个时候操作app也不方便,所以产品需求要求竖屏也需要根据包名横屏显示出来,这就需要在…...
![](https://www.ngui.cc/images/no-images.jpg)
MySQL会导致索引失效的情况与解决索引失效的方法
什么情况会导致索引失效 索引失效也是慢查询的主要原因之一,常见的导致索引失效的情况有下面这些: 1.使用 SELECT * 进行查询;2.创建了组合索引,但查询条件未准守最左匹配原则;3.在索引列上进行计算、函数、类型转换等操作;4.以 % 开头的 L…...
![](https://img-blog.csdnimg.cn/9cb4f23c776f4a8e9c6519850a5fa010.png)
使用nginx单独部署Vben应用
前言 本文主要介绍Vben使用nginx单独部署的方式,其实前端发展到现在已经不是当年的jsp,asp必须要和后端一起部署了。单独部署调试的工具也很多,比如vue-cli-service 和 Vben中用到的vite ,当然这些我们一般用在开发的工程中。正式…...
![](https://img-blog.csdnimg.cn/c5b652eba8904ae7a98d606937d112ad.png)
ES6新特性详解
文章目录1. let和const1.1 let声明变量1.2 const声明常量2. 模板字符串3. 解构赋值3.1 数组的解构赋值3.2 对象的解构赋值4. 函数扩展4.1 参数默认值4.2 剩余参数4.3 箭头函数5. 对象扩展5.1 对象简写5.2 属性名表达式5.3 扩展运算符6. Symbol7. Iterator和Generator7.1 Iterat…...
![](https://img-blog.csdnimg.cn/e9d44d73c7dc43388dec36cf4f6567d9.png)
Ubuntu下安装 ntfs-3g
目录1.FAT32、NTFS和exFAT2.ubuntu 安装 ntfs-3g2.1 直接安装2.2 源码安装1.FAT32、NTFS和exFAT U盘在格式化的时候都会有三种格式分别是FAT32、NTFS和exFAT。 FAT32格式 FAT32格式硬盘分区的最大容量为2TB,虽然U盘做不到,但是现在1xTB硬盘都有了&…...
![](https://www.ngui.cc/images/no-images.jpg)
【专业认知】抖音就业 / 保研北大教育学 / 留学南加州EE / 微软就业
2023.2.18 一. 周金辉学长分享——本科经验分享 0 简介 计算机农大本硕 硕士毕业后在抖音公司工作 1 行业前景:计算机专业能做什么? 1.1 计算机行业发展路线 远古时代: 二战开始,计算机技术发展,出现互联网 包…...
![](https://www.ngui.cc/images/no-images.jpg)
【算法题】2 的 n 次幂的背后
前言: 说实话,真的不爱写算法题相关的文章了,觉得没啥意义,但是对这种比较好玩并且简单,学会了就能很好提高算法效率的文章,还是要写一写,不哭不哭,你不会不是你的错,只是…...
![](https://www.ngui.cc/images/no-images.jpg)
【人工智能AI】一、NoSQL 企业级基础入门《NoSQL 企业级基础入门与进阶实战》
写一篇介绍什么是NoSQL的技术文章,分5个章节,每个章节细分到3级目录,重点介绍一下优缺点,适用场景,未来发展趋势等。 一、NoSQL简介 1.1 什么是NoSQL NoSQL(Not only SQL),意思是“…...
![](https://img-blog.csdnimg.cn/0f5595f6cb1e4be197a2fb8940185c0b.png)
Ubuntu安装opencv库3.4.10,并在cmake工程中引入opencv库
Windows下安装不同,Ubuntu安装OpenCV库时,需要事先安装依赖,而且不同OpenCV库所需的依赖可能会有所不同,下面的依赖亲测 3.4.10 和 4.5.5版本的有效,但是4.6以上版本安装可能会报错。 参考链接:https://bl…...
![](https://img-blog.csdnimg.cn/38cfe37407924b50ac66331b4d797796.png)
实现8086虚拟机(四)——mov 和 jmp 指令解码
文章目录mov 指令解码jmp 指令解码这篇文章举例来讲讲 mov 指令和 jmp 指令解码函数的实现,其他的指令解码函数都与这些类似。mov 指令解码 以 mov 指令中的一类:寄存器/内存 到/从 寄存器,来详细说明解码函数的实现。 机器指令格式如下&am…...
![](https://img-blog.csdnimg.cn/dec3b75aa19a476999b835fb4cc4b360.png)
数据库技术-函数依赖、键与约束、范式
一、函数依赖 给定一个x,能唯一确定一个Y,就称x确定Y,或者说Y依赖于x,例如YX*X函数。 函数依赖又可扩展以下两种规则: 部分函数依赖:A可确定C,(A,B)也可确定C,(A,B)中的一部分(即A)可以确定C&a…...
![](https://img-blog.csdnimg.cn/81e31e8ecb5e45b382b21d835d7ef587.png)
shiro CVE-2020-1957
0x00 前言 在之前只是单纯的复现了漏洞,没有记笔记,所以补充了这篇分析笔记。 影响版本:shiro < 1.5.2 0x01 环境搭建 环境用的是:https://github.com/lenve/javaboy-code-samples/tree/master/shiro/shiro-basic 0x02 漏…...
![](https://img-blog.csdnimg.cn/c5614108e1704c60a03591a4e9f870e6.png#pic_center)
RabbitMQ 入门到应用 ( 五 ) 基本应用
6.更多应用 6.1.AmqpAdmin 工具类 可以通过Spring的Autowired 注入 AmqpAdmin 工具类 , 通过这个工具类创建 队列, 交换机及绑定 import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.Di…...
![](https://img-blog.csdnimg.cn/img_convert/a4015666ba468e8465fe7882f22308e2.jpeg)
部署dapr的辛酸历程
前言dapr大概的了解,个人理解他就是一个分布式服务的管理,把微服务常用的组件(缓存,消息中间件、分布式锁、安全id4等)和监控以及服务注册、发现等等一系列功能以一个很抽象的方式管理起来。可能我们部署微服务用consul、ocelot、polly套件、…...
![](https://img-blog.csdnimg.cn/beaa3a7242224e82b48635f257c3386c.png)
golang入门笔记——内存管理
文章目录自动内存管理概念自动内存管理-相关概念:追踪垃圾回收:分代GC(Generational GC)引用计数内存分配Go内存分配-分块Go内存分配——多级缓存Go内存管理优化Balanced GC自动内存管理 概念 1.动态内存 程序在运行时根据需求…...
![](https://www.ngui.cc/images/no-images.jpg)
97. 约数之和
Powered by:NEFU AB-IN Link 文章目录97. 约数之和题意思路代码97. 约数之和 题意 假设现在有两个自然数 A和 B,S是 A^B的所有约数之和。 请你求出 S mod 9901的值是多少。 思路 ABA^BAB的约数之和为:sumAB(1p1p12...p1Ba1)(1p2p22...p2Ba2)...sum_{A^B…...
![](https://www.ngui.cc/images/no-images.jpg)
想和20岁的自己说
男生床头千万不要放卫生纸不要叫自己的女朋友早睡,更不能叫她早起,否则有你好受的。成年人的默契:和异性单独出去旅游,如果没有明确拒绝开一间房,那基本上默认后面会发生的事情不要去考验人性,世上99%的人经…...
![](https://img-blog.csdnimg.cn/456fbaa295e14dfeb024b7a3ba897db7.png)
Unit Test and Integration Test
Unit Test and Integration Test Background It is the first time that I try to write an article in English. In the past, I didn’t write test code. Just thinking QA is responsible for testing. As a developer, I don’t need to care about tests. Although I …...
![](https://img-blog.csdnimg.cn/548f2e576c52434fb738812a0406fb99.png)
2022年全国职业院校技能大赛(中职组)网络安全竞赛试题(3)
目录 模块A 基础设施设置与安全加固 (本模块20分) 一、项目和任务描述: 假定你是某企业的网络安全工程师,对于企业的服务器系统,根据任务要求确保各服务正常运行,并通过综合运用用户安全管理与密码策略、…...
![](https://img-blog.csdnimg.cn/img_convert/49690a20f3de0bf376a465c8b392f85a.jpeg)
智慧城市应急指挥中心数字化及城市驾驶舱建设方案
目 录 第一章 项目概述 1.1 项目背景 1.2 项目范围 第二章 建设内容 2.1 三维可视化平台 2.1.1 多源数据接入 2.1.2 可视化编排 2.1.3 三维可视化编辑 2.1.4 空间数据可视化 2.1.5 集成框架支持 2.2 可视化场景定制开发 2.2.1 城市驾驶总舱 2.2.2 城市安全分舱 2.…...
![](https://img-blog.csdnimg.cn/img_convert/506773c22b5cecfa33f72f4d4097840e.png)
HSCSEC 2023 个人练习
😋 大家好,我是YAy_17,是一枚爱好网安的小白。本人水平有限,欢迎各位大佬指点,欢迎关注😁,一起学习 💗 ,一起进步 ⭐ 。⭐ 此后如竟没有炬火,我便是唯一的光。…...
![](http://hi.csdn.net/attachment/201112/1/0_1322708778u3rs.gif)
贵阳免费网站建设/企业营销策划
转载地址:http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html java中的多线程 在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。 对于直接继承Thread的类来说,代…...
网站建设服务哪家好/免费入驻的跨境电商平台
Play on Words UVA - 10129 题意:给出一些单词,问能否让首尾字母相同的字符串相连,最后形成一个串。 思路:不难看出,这是一个欧拉道路问题。 简单介绍一下欧拉道路: 在欧拉道路中,除了起点和终…...
![](https://img-blog.csdnimg.cn/img_convert/3e97c6dfe3e10f8c0fa0d5abccce67bb.png)
专业的移动网站建设公司价格/南宁seo结算
描述lcd1602显示程序代码前些天弄了最小系统板后就想着学习1602的显示程序,可惜坛子里的或网上的,都没有简单的1602显示程序,无柰在网上下载了一段经过反复修改测试,终于有了下面一段代码:// - - - - - - - - - - - - …...
![](/images/no-images.jpg)
可以做mv 的视频网站/重庆seo霸屏
需求 每个文件需要一个loggerlog同时输出到控制台和文件log名为脚本名_日期.log 实现代码如下 from pathlib import Path import time, sys import loggingdef get_logger(log_folder: str "logs"):"""获取指定格式的logger,实现在控制…...
![](/images/no-images.jpg)
外贸操作流程/云seo关键词排名优化软件
这篇文章主要介绍了PHP统计数值数组中出现频率最多的10个数字的方法,涉及php中array_count_values与arsort等方法的相关使用技巧,非常具有实用价值,需要的朋友可以参考下本文实例讲述了PHP统计数值数组中出现频率最多的10个数字的方法。分享给大家供大家参考。具体分析如下&…...
![](/images/no-images.jpg)
直接在wordpress官网写博客/江苏seo技术教程
题目描述 输入一个整数n(n>1),判断其是否为素数。素数的定义为:一个大于1的整数,如果除了1和其自身以外没有其他正因子,则称此数为素数或质数。输入要求 输入一个整数n(n>1)。输出要求 如果该数是…...