当前位置: 首页 > news >正文

文档搜索引擎项目测试

目录

设计测试用例

功能测试

文档搜索功能

具体的逻辑

文档显示搜索结果功能

自动化测试

功能类介绍

最终测试套件的测试结果

性能测试

查看聚合报告

每秒处理事务数/吞吐量(TPS)

响应时间

生成测试报告

界面测试

初始页面

搜索页面

总结

后续改进:


设计测试用例

因为测试内容过多, 我只展示功能测试, 性能测试, 界面测试,自动化测试

功能测试

文档搜索功能

搜索一个词

1> 该词是有效查询词

返回满足的所有内容: 搜索结果个数, 内容的标题, 内容截取部分, url

2> 该词不是有效查询词

结果显示框为空

搜索多个词

1> 这些词都是有效查询词

结果显示框会显示所有满足的并集内容: 搜索结果个数, 内容的标题, 内容截取部分, url

2> 有一些是有效查询词有一些不是

结果显示框只会显示有效查询词的内容: 搜索结果个数, 内容的标题, 内容截取部分, url

3> 全都是无效查询词

结果显示框不会显示任何内容

搜索暂停词

显示框不会显示任何结果

具体的逻辑

前端通过输入框输入搜索内容, 并进行点击操作,向后端发送ajax请求

后端接收请求, 然后进行查询, 最后返回给前端查询结果

最后前端接收后端的响应结果, 把结果拼接到搜索框里面

文档显示搜索结果功能

搜索的词是有效查询词

搜索的词不是有效查询词

        

自动化测试

测试用例设计

我们使用selenium4自动化测试工具和junit4单元测试框架结合来对文档搜索引擎的搜索功能和文档显示搜索结果功能进行自动化测试.

引入依赖

<!--        屏幕截图--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>
<!--        驱动管理--><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.9.0</version></dependency>
<!--        selenium--><!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java --><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency>

功能类介绍

Utils

放置公共处理的内容: 创建驱动, 截图功能, 处理弹窗

package com.xioabai.doc_searcher.common;import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.SessionId;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;public class Utils {public static WebDriver driver = null;private static SessionId sessionId;//创建驱动对象public static WebDriver createDriver() {if (driver == null || sessionId == null) {//增加浏览器配置对象,创建驱动对象的时候要强制运行访问所有的链接ChromeOptions options = new ChromeOptions();//表示运行所有的链接options.addArguments("--remote-allow-origins=*");//设置无头模式options.addArguments("-headless");//添加浏览器策略
//        options.setPageLoadStrategy(PageLoadStrategy.NONE);//等待所有页面加载完成//创建浏览器驱动对象,把配置放进驱动对象driver = new ChromeDriver(options);//添加隐式等待,全局元素等待2sdriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));}return driver;}//统一创建驱动对象public Utils() throws InterruptedException {//调用driver对象driver = createDriver();//访问urldriver.get("http://120.26.236.46:9090/index.html");}//屏幕截图public void getScreenShot(String str) throws InterruptedException, IOException {//保存的图片路径: ./src/test/image///                              /2024-08-17///                                          /test01-1743211.png//                                          /test02-1743222.png//                                          /test03-1743245.png//                              /2024-08-18///                                          /test01-1743222.png//                                          /test02-1743442.png//                                          /test03-1743332.png//
//          createDriver();//屏幕截图//设计文件日期格式SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");//参数是年月日SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");//参数时分秒毫秒//生成当前的时间String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());//拼接文件路径//./src/test/image/2024-08-17/test01-17432.pngString filename = "./src/test/image/" + dirTime + "/" + str + "-" + fileTime + ".png";//方法名-时间.pngFile srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);//把srcFile放到指定位置FileUtils.copyFile(srcFile, new File(filename));}//统一处理弹窗public static void handleAlert() {WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(1));wait.until(ExpectedConditions.alertIsPresent());//处理弹窗Alert alert = driver.switchTo().alert();alert.accept();}
}

TestSearchFunction

测试搜索功能

package com.xioabai.doc_searcher.test;import com.xioabai.doc_searcher.common.Utils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;import java.io.IOException;public class TestSearchFunction extends Utils {public TestSearchFunction() throws InterruptedException {super();}public void searchInvalidity() throws InterruptedException, IOException {//把页面设置最大driver.manage().window().maximize();//TODO 一个无效查询词//定位搜索框WebElement element = driver.findElement(By.cssSelector("body > div > div.header > input[type=text]"));//输入一个无效查询词element.sendKeys("hi");//定位搜索按钮element = driver.findElement(By.xpath("//*[@id=\"search-btn\"]"));//点击搜索按钮element.click();//处理弹窗handleAlert();//通过类名来进行截图路径创建getScreenShot(getClass().getName());//方便看结果
//        Thread.sleep(2000);//断言搜索框为空//定位结果显示框element = driver.findElement(By.cssSelector("body > div > div.result > div"));assert element.getText().equals("当前找到 0个结果!");//TODO 有无效查询词,有有效查询词element = driver.findElement(By.cssSelector("body > div > div.header > input[type=text]"));//清除文本框的值element.clear();//输入查询词element.sendKeys("list hello");//定位搜索按钮element = driver.findElement(By.xpath("//*[@id=\"search-btn\"]"));//点击搜索按钮element.click();//通过类名来进行截图路径创建getScreenShot(getClass().getName());//方便看结果
//        Thread.sleep(1000);//断言有结果//定位结果显示框element = driver.findElement(By.cssSelector("body > div > div.result > div:nth-child(2) > a"));assert element.isDisplayed();//清空文本框element = driver.findElement(By.cssSelector("body > div > div.header > input[type=text]"));//清除文本框的值element.clear();}public void searchValidity() throws InterruptedException, IOException {//定位搜索框WebElement element = driver.findElement(By.cssSelector("body > div > div.header > input[type=text]"));//输入单个搜索词element.sendKeys("array");//定位搜索按钮element = driver.findElement(By.cssSelector("#search-btn"));//点击搜索按钮element.click();//定位结果显示框element = driver.findElement(By.cssSelector("body > div > div.result > div:nth-child(2) > a"));//断言有结果assert element.isDisplayed();//清空文本框element = driver.findElement(By.cssSelector("body > div > div.header > input[type=text]"));//清除文本框的值element.clear();//定位搜索框element = driver.findElement(By.cssSelector("body > div > div.header > input[type=text]"));//输入多个搜索词element.sendKeys("array queue");//定位结果显示框element = driver.findElement(By.cssSelector("body > div > div.result > div:nth-child(2) > a"));//断言有结果assert element.isDisplayed();//通过类名来进行截图路径创建getScreenShot(getClass().getName());driver.quit();}
}

TestDisplayFunction

测试显示结果功能 

当测试显示功能的时候,我们先测试有效词查询,然后测试无效词查询,发现测试无效词查询的时候出现了报错: 它显示的查询结果数目还是之前查询有效词的结果数目

说明第二次点击搜索按钮后,搜索结果并没有渲染完成,然后我们断言利用的对象就是之前的结果数目结果框里面的值,那么我们可以在第二次点击搜索后面加上等待,让渲染结果显示出来

最终修改代码

package com.xioabai.doc_searcher.test;import com.xioabai.doc_searcher.common.Utils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;import java.io.IOException;public class TestDisplayFunction extends Utils {public TestDisplayFunction() throws InterruptedException {super();//直接通过父类创建驱动对象,进入访问页面}void testDisplay() throws InterruptedException, IOException {//页面最大化driver.manage().window().maximize();//TODO 当搜索的词是有效词//定位搜索框WebElement element = driver.findElement(By.cssSelector("body > div > div.header > input[type=text]"));//输入内容element.sendKeys("array");//定位搜索按钮element = driver.findElement(By.cssSelector("#search-btn"));//点击搜索框element.click();
//        Thread.sleep(1000);//通过断言url是否显示来判断是否显示内容element = driver.findElement(By.cssSelector("body > div > div.result > div:nth-child(2) > div.url"));assert element.isDisplayed();//通过类名来进行截图路径创建getScreenShot(getClass().getName());//清空文本框element = driver.findElement(By.cssSelector("body > div > div.header > input[type=text]"));//清除文本框的值element.clear();//TODO 当搜索的词是无效词element = driver.findElement(By.cssSelector("body > div > div.header > input[type=text]"));//输入一个无效查询词element.sendKeys("hello");//定位搜索按钮element = driver.findElement(By.xpath("//*[@id=\"search-btn\"]"));//点击搜索按钮element.click();//处理弹窗handleAlert();//加上强制等待,等待页面渲染Thread.sleep(1000);//方便看结果
//        Thread.sleep(2000);//断言搜索框为空//定位结果显示框element = driver.findElement(By.cssSelector("body > div > div.result > div"));// 获取元素的文本内容String actualText = element.getText();// 断言文本是否与预期一致String expectedText = "当前找到 0个结果!";assert actualText.equals(expectedText) : "Expected text '" + expectedText + "', but got '" + actualText + "'";//通过类名来进行截图路径创建getScreenShot(getClass().getName());driver.quit();}}

我们再使用截图方法来获取结果图

最终测试套件的测试结果

全部通过, 但是测试的消耗时间有优化的空间.

性能测试

使用JMeter对文档搜索引擎进行性能测试,我们测试并发条件下搜索有效查询词的响应时间

创建梯度压测线程组 :jp@gc - Stepping Thread Group

创建http取样器

然后我们进行性能测试

查看聚合报告

我们可以看出95%的请求在3秒左右完成,最大响应时间为为21秒,说明在高并发的条件下,系统的处理请求的速度明显下降.

测试过程中发生了较少的异常情况,我们通过查看结果树来看单个接口的响应信息.

发现响应码为500,我们推测是线程数太多导致导致服务器没有处理过来

每秒处理事务数/吞吐量(TPS)

事务在测试的时候逐渐增加,吞吐量也逐渐增加,直到8秒的时候达到最大值:每秒可处理213个请求.

然后随着线程的增加吞吐量呈下降趋势,最后保持稳定状态.

响应时间

响应时间不是很稳定,随着请求数目上升,在所有线程都启动,持续运行60秒的区间达到了99%的响应时间为: 7秒左右,这个和聚合报告上面的数据是差不多的. 这说明了我们系统的性能不是很稳定, 有优化空间

生成测试报告

输入命令

生成报告

界面测试

我们此时把项目放在线上环境进行测试: Java 文档搜索

我们对搜索页面进行界面测试

初始页面

进入页面,什么都不输入

显示背景图, 输入框, 搜索按钮, 当前页面搜索结果数目, 搜索结果框为空, 我们所期待的是展示搜索框, 并且显示搜索条数最多的前十条数据.

搜索页面

搜索有效词

显示: 搜索框(里面包含搜索词),搜索按钮,显示搜索结果总数.

搜索结果框里面有搜索内容: 标蓝的标题,标红的搜索词,内容截取部分,标绿的url

搜索无效词

我们发现搜索无效词确实是不会有搜索结果,但是此时的用户体验其实不是很好,应该给个弹窗提醒用户,用户输入的词不是有效词, 应该输入正确的搜索词.

此时我们打开postman,看返回的数据,发现返回的是一个空的数组

此时我们就可以在前端加个判断条件, 判断返回的是不是一个空数组,如果是的话就弹出弹窗, 提醒用户输入有效的搜索词

把修改后的代码重新打包,部署到服务器上

最终修改结果: 成功显示输入框

总结

功能测试:

1. 搜索引擎的基本功能正常运行, 正常流程可以正确执行

自动化测试:

1. 测试用例50+全部通过.

2. 使用了强制等待, 显示等待, 设置元素等待时间, 保证页面渲染完成, 找到正确的元素.

性能测试:

1. 测试过程中, 出现了较少的异常情况, 主要达到TPS最大处理量的时候,系统不能处理更多的请求,因此返回500响应码.

2. 响应时间不稳定,应该99%的响应时间在3s之内,系统性能有待提升.

界面测试:

1. 搜索框, 按钮, 显示框,使用后都能够在一定时间内响应, 页面显示良好

2. 异常搜索的时候, 并没有弹窗进行提醒(已解决)

3. 没有搜索的时候, 主搜索框下面没有数据显示, 需求期待的是显示搜索框+显示条数最多的前十条数据.(未解决)

后续改进:

1> 对搜索结果页面进行分页处理

2> 扩大业务,能够动态对其他文档也进行处理.

相关文章:

文档搜索引擎项目测试

目录 设计测试用例 功能测试 文档搜索功能 具体的逻辑 文档显示搜索结果功能 自动化测试 功能类介绍 最终测试套件的测试结果 性能测试 查看聚合报告 每秒处理事务数/吞吐量(TPS) 响应时间 生成测试报告 界面测试 初始页面 搜索页面 总结 后续改进: 设计测试…...

Vue3项目技术点记录

vue3项目技术点笔记 1 环境变量 - 不同环境用不同的配置 环境变量命名:.env.produciton .env.development Vite.config.ts 配置 envDir:‘’ 链接: VUE3+Vite 环境变量配置 2 axios的封装 http请求拦截,响应拦截。 src下建立公共文件夹Utils下建立request.ts import axios…...

一和零 (leetcode 474

leetcode系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 本题是一个01背包问题&#xff0c;只是背包是一个二维数组的背包&#xff0c;分别为0的个数不能超过m&#xff0c;1的个数不能超过n&#xff0c;而物品就是题目中的字符串&#xff0c;其容量为0和1的…...

Linux vim mode | raw / cooked

注&#xff1a;机翻&#xff0c;未校。 vim terminal “raw” mode Vim 终端 “raw” 模式 1. 原始模式与已处理模式的区别 We know vim puts the terminal in “raw” mode where it receives keystrokes as they are typed, opposed to “cooked” mode where the command…...

利用Linux的I2C子系统和i2c-tools工具集写出的对I2C设备AP3216C读写的应用程序

前言 由于NXP官方提供的BSP里已经包含了其片上I2C控制器的驱动并接入到了Linux的I2C子系统&#xff0c;所以我们可以直接去写与I2C有关的应用程序了。 在本篇博文中我们用两种方式对I2C设备AP3216C进行读写操作。 第一种&#xff1a;直接利用Linux的I2C子系统对I2C设备AP3216…...

springCloud集成tdengine(原生和mapper方式) 其二 原生篇

mapper篇请看另一篇文章 一、引入pom文件 <!-- TDengine 连接器--><dependency><groupId>com.taosdata.jdbc</groupId><artifactId>taos-jdbcdriver</artifactId><version>3.5.3</version></dependency>二、在nacos中填…...

gralloc usage flags

下面这些示例主要说明了 gralloc usage flags 在图像处理和多媒体应用中如何影响性能和正确性。让我们逐个详细分析每个问题的 根因 和 修复方案&#xff0c;并深入解析 gralloc 标志对 缓存管理 和 数据流 的影响。 ✅ Example 1: 长曝光快照耗时异常 &#x1f4cc; 问题描述…...

RIP路由欺骗攻击与防御实验详解

一、基础网络配置 1. 路由器R1配置 interface GigabitEthernet0/0/0ip address 192.1.2.254 255.255.255.0 ! interface GigabitEthernet0/0/1ip address 192.1.3.254 255.255.255.0 ! router rip 1version 2network 192.1.2.0network 192.1.3.0 2. 路由器R2配置 interface…...

在 Linux下使用 Python 3.11 和 FastAPI 搭建带免费证书的 HTTPS 服务器

在当今数字化时代&#xff0c;保障网站数据传输的安全性至关重要。HTTPS 协议通过使用 SSL/TLS 加密技术&#xff0c;能够有效防止数据在传输过程中被窃取或篡改。本教程将详细介绍如何在 Ubuntu 22.04 系统上&#xff0c;使用 Python 3.11 和 FastAPI 框架搭建一个带有免费 SS…...

[QMT量化交易小白入门]-三十五、如何将聚宽策略信号转为QMT实盘交易

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读一、聚宽模拟运行:构建交易策略的基础在聚宽…...

国思RDIF低代码快速开发框架 v6.2版本发布

1、平台介绍 国思RDIF企业级低代码开发平台&#xff0c;给用户和开发者最佳的框架平台方案&#xff0c;为企业快速构建跨平台、企业级的应用提供强大支持。致力于解决企业信息化项目交付难、实施效率低、开发成本高的问题。能帮助企业快速构建美观易用、架构专业、安全可控的企…...

学习笔记 ASP.NET Core Web API 8.0部署到iis

一.修改配置文件 修改Program.cs配置文件将 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改为 app.UseSwagger(); app.UseSwaggerUI(); 二.安装ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…...

【Linux】信号:产生信号

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.信号信号处理简单理解信号的发送和保存由软件产生的信号由硬件&#xff08;异常&#xff09;产生的信号 01.信号 进程信号是操作系统提供的一种异步通知机制&#xff0c;用于…...

单片机自学总结

自从工作以来&#xff0c;一直努力耕耘单片机&#xff0c;至今&#xff0c;颇有收获。从51单片机&#xff0c;PIC单片机&#xff0c;直到STM32&#xff0c;以及RTOS和Linux&#xff0c;几乎天天在搞:51单片机&#xff0c;STM8S207单片机&#xff0c;PY32F003单片机&#xff0c;…...

Idea集成docker通过ca加密实现镜像打包

​ Idea集成docker实现镜像打包_ideadocker镜像打包-CSDN博客 ​ 之前通过这种方式虽然可以实现idea通过maven打jar包的同时把docker镜像也进行打包&#xff0c;但是这种方式存在很大漏洞&#xff0c;就是服务器的2375端口大开&#xff0c;任何人拿着idea通过这种方式都可以连…...

【Prometheus】prometheus标签替换label_replace,动态修改生成标签,增强查询的灵活性和表达能力

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

蓝桥杯 之 暴力回溯

文章目录 数字接龙小u的最大连续移动次数问题 在蓝桥杯中&#xff0c;十分喜欢考察对于网格的回溯的问题&#xff0c;对于这类的问题&#xff0c;常常会使用到这个DFS和BFS进行考察&#xff0c;不过无论怎么考察&#xff0c;都只是会在最基础的模本的基础上&#xff0c;根据这个…...

在K8S中挂载 Secret 到 Pod

在 Kubernetes 里&#xff0c;把 Secret 挂载到 Pod 中有两种主要方式&#xff1a;作为卷挂载和作为环境变量挂载。下面为你提供相应的代码示例。 作为卷挂载 Secret 将 Secret 作为卷挂载到 Pod 时&#xff0c;Secret 的每个键会成为挂载目录下的一个文件&#xff0c;文件内…...

LINUX网络编程API原型详细解析

1. 网络体系 1.1. 简介 网络采用分而治之的方法设计&#xff0c;将网络的功能划分为不同的模块&#xff0c;以分层的形式有机组合在一起。 每层实现不同的功能&#xff0c;其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务&#xff0c;同时使用下层提供…...

Android 13 Launcher3最近任务列表“全部清除“按钮位置优化实战

一、问题背景与实现难点 在Android 13横屏设备开发中&#xff0c;系统默认将最近任务列表的"全部清除"按钮布局在屏幕左侧&#xff0c;这与用户习惯的底部布局存在明显差异。相较于Android 8.1时代SystemUI模块的实现&#xff0c;Android 13将相关逻辑迁移至Launche…...

docker最新源,及遇到问题+处理

目前国内可用Docker镜像源汇总&#xff08;截至2025年3月&#xff09; - CoderJia 遇到问题&#xff1a; Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on [::1]:53: read udp [::1]:13287->[:…...

Python简单爬虫实践案例

学习目标 能够知道Web开发流程 能够掌握FastAPI实现访问多个指定网页 知道通过requests模块爬取图片 知道通过requests模块爬取GDP数据 能够用pyecharts实现饼图 能够知道logging日志的使用 一、基于FastAPI之Web站点开发 1、基于FastAPI搭建Web服务器 # 导入FastAPI模…...

统信UOS中使用Vscode编程

写在前面&#xff1a;统信UOS其实就是套壳的Linux系统&#xff0c;所以有问题如果搜不到解决方法&#xff0c;可以参考Linux下的解决方法。 1.环境配置 Vscode : 1.85.0 Vscode就直接下载安装就行&#xff0c;然后安装插件&#xff1a;Volar、中文汉化包 node&#xff1a;18…...

C#从入门到精通(1)

目录 第一章 C#与VS介绍 第二章 第一个C#程序 &#xff08;1&#xff09;C#程序基本组成 1.命名空间 2.类 3.Main方法 4.注释 5.语句 6.标识符及关键字 &#xff08;2&#xff09;程序编写规范 1.代码编写规则 2.程序命名方法 3.元素命名规范 第三章 变量 &…...

openharmony中hilog实证记录说明(3.1和5.0版本)

每次用这个工具hilog都有一些小用法记不清&#xff0c;需要花一些时间去查去分析使用方法&#xff0c;为了给丰富多彩的生活留出更多的时间&#xff0c;所以汇总整理共享来了&#xff0c;它来了它来了~~~~~~~~~ 开始是想通过3.1来汇总的&#xff0c;但实际测试发现openharmony…...

飞书 设计智能字段:通过“字段类型”添加AI功能列

在飞书多维表格中&#xff0c;通过“字段类型”添加AI功能列的核心逻辑是将AI模型能力与结构化数据结合&#xff0c;实现自动化内容生成与信息处理。以下是具体操作步骤及关键要点&#xff0c;结合实际应用场景说明&#xff1a; 一、基础操作步骤 创建多维表格 登录飞书&#x…...

Cannot find module @rollup/rollup-win32-x64-msvc

方法1 在package.json中添加postinstall: "scripts": {"postinstall": "node -e \"const { platform } process; if (platform win32) { require(child_process).execSync(npm install rollup/rollup-win32-x64-msvc, { stdio: inherit });…...

Docker和Dify学习笔记

文章目录 1 docker学习1.1 基本命令使用1.1.1 docker ps查看当前正在运行的镜像1.1.2 docker stop停止容器1.1.3 docker compose容器编排1.1.4 docker网络[1] 进入到容器里面敲命令[2] docker network ls[3] brige网络模式下容器访问宿主机的方式 2 Dify的安装和基础使用2.1 下…...

【AIGC】Win10系统极速部署Docker+Ragflow+Dify

【AIGC】WIN10仅3步部署DockerRagflowDify 一、 Docker快速部署1.F2进入bios界面&#xff0c;按F7设置开启VMX虚拟化技术。保存并退出。2.打开控制面板配置开启服务3.到官网下载docker安装包&#xff0c;一键安装&#xff08;全部默认勾选&#xff09; 二、 RagFlow快速部署1.确…...

Oracle ASM 磁盘组冗余策略

Oracle ASM 磁盘组冗余策略 1. 外部冗余&#xff08;External Redundancy&#xff09;2. 普通冗余&#xff08;Normal Redundancy&#xff09;3. 高冗余&#xff08;High Redundancy&#xff09;关键注意事项如何选择合适的策略&#xff1f; Oracle ASM&#xff08;Automatic S…...

C++ 数据结构

C++ 数据结构 概述 C++作为一种强大的编程语言,在软件开发领域有着广泛的应用。数据结构作为C++编程中不可或缺的一部分,它决定了程序的性能和效率。本文将详细介绍C++中的常见数据结构,包括其定义、特点以及在实际应用中的使用方法。 常见数据结构 1. 数组 数组是一种…...

Unity NodeCanvas AI使用笔记

扩展: 1. 输入输出参数限制&#xff0c;增加描述&#xff0c;根据接口判断类型限制 2.选择节点&#xff0c;遍历节点&#xff0c;行为节点 3.行为节点 行为执行的时候有互斥关系&#xff0c;加入一个queue&#xff0c;最后执行 4.NodeCanvas的参数传参可以由上个节点传到下个节…...

(* IOB = “FORCE“ *) 的使用分享

在Xilinx FPGA设计中&#xff0c;IOBFORCE是一个与输入输出块&#xff08;IOB&#xff09;相关的属性设置。这个设置主要用于控制逻辑是否被推入到IOB&#xff08;Input/Output Block&#xff09;中&#xff0c;即FPGA芯片边缘的I/O引脚附近的专用硬件资源。使用IOB属性可以帮助…...

【大语言模型_7】利用ragas框架评测rag系统指标

一、介绍 ragas是一个用来评估RAG系统的框架&#xff0c;允许不在依赖人工注释的情况下&#xff0c;通过一套指标评估检索模块和生成模块的性能及其质量。 二、准备 数据准备&#xff1a;需要准备评估数据集&#xff0c;数据集格式如下 [{"question": "安全智…...

adb常用的命令

1. 查看adb版本 adb version 2. 将apk安装包安装到手机/模拟器上 adb install apk路径 3. 获取apk包名和界面名 包名&#xff08;package&#xff09;&#xff1a;决定程序的唯一性 界面名&#xff08;activity&#xff09;&#xff1a;一个界面界面名&#xff0c;对应一个界面…...

手动集成sqlite的方法

注意到sqlite有backup方法&#xff08;https://www.sqlite.org/backup.html&#xff09;。 也注意到android中sysroot下&#xff0c;没有sqlite3的库&#xff0c;也没有相关头文件。 如果要使用 sqlite 的backup&#xff0c;那么就需要手动集成sqlite代码到项目中。可以如下操…...

自然语言处理(NLP)技术

人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是一种模拟人类智能思维过程的技术&#xff0c;它在现代科技中的应用非常广泛&#xff0c;涉及诸多领域&#xff0c;如自然语言处理、计算机视觉、机器学习、数据分析等。以下是人工智能在现代科技中的应…...

【GPT入门】第25课 掌握 LangChain:链式调用的奥秘、特性与使用示例

【GPT入门】第25课 掌握 LangChain&#xff1a;链式调用的奥秘、特性与使用示例 语法解释各部分性质链式调用的性质调用方式注意事项 语法解释 你给出的代码 is_duplicated_chain (check_duplicated | model | parser) 运用了 LangChain 里的链式调用语法。在 LangChain 中&a…...

机器学习之DBSCAN算法详解

文章目录 引言1. DBSCAN算法概述2.DBSCAN算法的基本概念2.1 ε-邻域2.2 核心点&#xff08;Core Point&#xff09;2.3 边界点&#xff08;Border Point&#xff09;2.4 噪声点&#xff08;Noise Point&#xff09;2.5 直接密度可达&#xff08;Directly Density-Reachable&…...

借助vite来优化前端性能

Vite 是一个现代化的前端构建工具&#xff0c;凭借其基于原生 ES 模块的开发服务器和高效的构建能力&#xff0c;可以显著优化前端性能。 一、开发环境优化 1.快速启动与热更新 Vite 利用浏览器对 ES 模块的原生支持&#xff0c;在开发环境中无需打包&#xff0c;直接按需加载…...

[工控机安全] 使用DriverView快速排查不可信第三方驱动(附详细图文教程)

导语&#xff1a; 在工业控制领域&#xff0c;设备驱动程序的安全性至关重要。第三方驱动可能存在兼容性问题、安全漏洞甚至恶意代码&#xff0c;威胁设备稳定运行。本文将手把手教你使用 DriverView工具&#xff0c;高效完成工控机驱动安全检查&#xff0c;精准识别可疑驱动&a…...

Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac‘.

What went wrong: Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac’. Could not resolve all files for configuration ‘:path_provider_android:androidJdkImage’. Failed to transform core-for-system-modules.jar to match attributes {…...

基于SpringBoot的社区/物业管理系统

项目介绍 平台采用B/S结构&#xff0c;后端采用主流的SpringBoot语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。是一个综合的社区/物业管理系统。 整个平台包括前台和后台两个部分。 - 前台功能包括&#xff1a;小区信息、社区论坛、社区公告、社区留言板、个人中心。…...

vmware下linux无法上网解决方法

首先&#xff0c;打开打开"编辑" “虚拟网络编辑器”,并将"桥接"方式的网卡选择为主机上网的网卡。 虚拟机中&#xff0c;设置IP地址为主机网卡同样子网下的ip地址&#xff1a; 并且要选择桥接模式&#xff01;注意如下图&#xff0c;"复制物理连接状…...

【数据库备份】docker中数据库备份脚本——MySql备份脚本

docker中数据库备份脚本——MySql备份脚本 #!/bin/bash# MySQL数据库信息 DB_USER"root" DB_PASSWORD"你的密码"# 备份保存主目录 BACKUP_ROOT"/data/data_backup/mysql"# 最多保留的备份日期文件夹数 MAX_DATE_FOLDERS15# 数组包含要备份的数据…...

SpringBoot 第二课(Ⅰ) 整合springmvc(详解)

目录 一、SpringBoot对静态资源的映射规则 1. WebJars 资源访问 2. 静态资源访问 3. 欢迎页配置 二、SpringBoot整合springmvc 概述 Spring MVC组件的自动配置 中央转发器&#xff08;DispatcherServlet&#xff09; 控制器&#xff08;Controller&#xff09; 视图解…...

centos家用笔记

改用阿里云yum源 因CentOS7已经停止维护&#xff0c;原有的yum源也无法使用&#xff0c;在国内&#xff0c;改用阿里云yum源是个方便的选择。 cd /etc/yum.repos.d/ mkdir backup mv Cent* backup wget http://mirrors.aliyun.com/repo/Centos-7.repo mv Centos-7.repo Cen…...

数据可视化(matplotlib)-------辅助图标的设置

目录 一、认识图表常用的辅助元素 坐标轴 二、设置坐标轴的标签、刻度范围和刻度标签 &#xff08;一&#xff09;、设置坐标轴的标签 1、xlabel()------设置x轴标签 2、ylabel()------设置y轴标签 &#xff08;二) 、设置刻度范围和刻度标签 1、xlim()和ylim()函数分别可…...

15-双链表-双链表基本操作

题目 来源 827. 双链表 - AcWing题库 思路 此题我只想说&#xff0c;千万千万别漏了头结点和尾结点&#xff0c;不然根本查不出来是哪里出了问题&#xff0c;因为传入的k会有问题&#xff1b;最左边插入&#xff0c;相当于是在头结点的右边插入&#xff08;也就是0号节点的右…...

HTTP和RPC的区别

RPC和 HTTP是两种常见的通信方式&#xff0c;它们在设计目标、使用场景和技术实现上有显著区别。以下是它们的详细对比&#xff1a; 1. 定义与核心思想 特性RPCHTTPRemote Procedure Call远程过程调用HyperText Transfer Protocol超文本传输协议定义一种协议或框架&#xff0…...