【文星索引】搜索引擎项目测试报告
目录
- 一、项目背景
- 二、 项目功能
- 2.1 数据收集与索引
- 2.2 API搜索功能
- 2.3 用户体验与界面设计
- 2.4 性能优化与维护
- 三、测试报告
- 3.1 功能测试
- 3.2 界面测试
- 3.3 性能测试
- 3.4 兼容性测试
- 3.5 自动化测试
- 四、测试总结
- 4.1 功能测试方面
- 4.2 性能测试方面
- 4.3 用户界面测试方面
一、项目背景
搜索引擎的项目背景有以下几个方面:
-
随着互联网的发展,网页、文档等各种信息呈指数级增长。在海量的信息中,用户难以快速准确地找到自己需要的相关代码函数内容。例如,每天有大量的技术文章等发布到网上,人们如果没有有效的搜索工具,就会在信息海洋中迷失。
-
无论是个人用户查找Java中的信息资讯,还是用户寻找代码信息,都迫切需要一种能够高效筛选和定位信息的工具。
-
对于互联网公司来说,搜索引擎是一个重要的流量入口。通过提供高质量的搜索服务,吸引大量用户访问,例如,百度的搜索页面上会展示各种与用户搜索关键词相关的技术文章,根据点击量或展示量呈现给搜索引擎公司。
二、 项目功能
搜索引擎的项目功能可以从多个方面进行分析,以下是一些常见的功能:
2.1 数据收集与索引
数据收集:搜索引擎需要从各种数据源收集数据,如网页、文档、图片、视频等。这些数据可以通过爬虫程序自动抓取,也可以通过手动提交或其他方式获取。
- 数据清洗与预处理:在索引之前,需要对收集到的数据进行清洗和预处理,如去除噪声、标签、格式化等,以便提高搜索的准确性和效率。
- 索引构建:搜索引擎使用索引技术将数据进行结构化处理,以便快速检索。常见的索引结构包括倒排索引、正排索引等。
2.2 API搜索功能
关键词搜索:用户输入关键词后,搜索引擎能够快速返回与关键词相关的搜索结果。搜索结果通常包括网页标题、摘要、链接等信息。
- 模糊搜索与纠错:搜索引擎能够处理用户输入的模糊关键词,并提供纠错建议,以提高搜索的准确性和用户体验。
2.3 用户体验与界面设计
简洁的搜索界面:搜索界面设计简洁明了,方便用户输入关键词和查看搜索结果。搜索框通常放置在页面的显眼位置,并提供输入提示和自动补全功能。
- 搜索结果展示:搜索结果以清晰、易读的方式展示给用户,通常包括标题、摘要、链接等信息。搜索结果可以按照相关性、时间、热度等进行排序。
2.4 性能优化与维护
性能优化:搜索引擎需要不断优化其性能,以提高搜索速度和响应时间。这可以通过优化索引结构、查询算法等方式实现。
三、测试报告
3.1 功能测试

输入测试
因为该项目不支持模糊匹配,查找结果是根据查询词是否包含在文档内容中来筛选的,因此等价类的划分如下:
| 有效等价类 | 无效等价类 |
|---|---|
| 英文字符 | 中文字符 |
| 数字字符 | 停用词字符 |
| 英文和数字混杂字符 | 其他特殊字符 |
测试输入数据:
| 测试用例 | 期望结果 |
|---|---|
| String(有效) | 能被查找到并正确显示 |
| ArrayList(有效) | 能被查找到并正确显示 |
| 12(有效) | 能被查找到并正确显示 |
| a123b(有效) | 能被查找到并正确显示 |
| 数组(无效) | 查找不到结果 |
| ,X,S,z(无效) | 查找不到结果 |
| 1=1,&&&%$23(无效) | 查找不到结果 |
| 空格(无效) | 查找不到结果 |
附上部分测试截图:
有效等价类:
- 输入字母

预期结果:搜索成功,显示与字母相关的结果.
实际结果:搜索成功,显示带有字母的结果.
- 输入数字

预期结果:搜索成功,显示与数字相关的结果.
实际结果:搜索成功,显示带有数字的结果.
无效等价类:
- 输入汉字

预期结果:搜索失败,查找不到结果
实际结果:搜索失败,查找不到结果
- 输入空格

预期结果:搜索失败,查找不到结果
实际结果:搜索失败,查找不到结果
3.2 界面测试

显示搜索结果总数是否和实际展示保持一致
这里搜索一个条目比较少的方便展示:如图可以看到确实保持一致

数量大之后就需要定位页面元素编写代码来统计具体实际展示出的结果总数,这里贴上部分代码:
private String parseHtmlContentByRegex(File file ){String content=readFile(file);//通过正则表达式去掉正文中的<script>标签content=content.replaceAll("<script.*?>(.*?)</script>"," ");//通过正则表达式去掉正文中的其它标签content=content.replaceAll("<.*?>"," ");通过正则表达式合并多个空格content = content.replaceAll("\\s+", " ");content.replaceAll(" "," ");content.replaceAll(" "," ");return content;}
标题、描述、URL是否正确显示
如图,可以看到三者正确显示:

3.3 性能测试

单线程构建正排和倒排索引
代码如下:
public void run(){List<File> fileList=new ArrayList<>();//枚举所有以.html结尾的文件enumFile(INPUT_FILE,fileList);long start=System.currentTimeMillis();//解析每一个html文件for(File file:fileList){//解析每一个html文件parseHtml(file);System.out.println(file.getName());if(file.getName().equals("ArrayList")){System.out.println("===============================================================");}}index.save();long end=System.currentTimeMillis();log.info("单线程所消耗的时间:"+(end-start)+"ms");}
单线程消耗时间如下图所示:

多线程构建正排和倒排索引
代码如下:
public void runByThread() throws InterruptedException {List<File> fileList=new ArrayList<>();//枚举所有以.html结尾的文件enumFile(INPUT_FILE,fileList);long start=System.currentTimeMillis();//创建一个包含10个线程的线程池ExecutorService executorService= Executors.newFixedThreadPool(10);//创建一个计数器来表示文件的数量CountDownLatch countDownLatch=new CountDownLatch(fileList.size());for(File file:fileList){executorService.submit(new Runnable() {@Overridepublic void run() {parseHtml(file);log.info("文件名:"+file.getName()+"文件路径:"+file.getAbsolutePath());countDownLatch.countDown();}});}countDownLatch.await();executorService.shutdown();index.save();long end=System.currentTimeMillis();log.info("多线程所消耗的时间:"+(end-start)+"ms");}
多线程消耗时间如下图所示:

这里可以看到多线程的处理速度比单线程快了许多,时间也大概快了一倍
下面是10个线程的处理性能:


10个线程短时间内的吞吐量:

多线程下单短时间响应时间折线图:


下图是界面的响应速度:

3.4 兼容性测试

![在Windows11环境下:
联想浏览器:正常运行]


![在Windows11环境下:
Edge浏览器:正常运行]

小米手机环境:
手机QQ浏览器:正常运行

3.5 自动化测试
自动化测试代码如下:
void searchResult() throws InterruptedException {//找到搜索框,输入查询词driver.findElement(By.cssSelector("body > div > div.header > input[type=text]")).sendKeys("static");//点击搜索按钮driver.findElement(By.cssSelector("#search-btn")).click();Thread.sleep(3000);//找到搜索结果的标题并进行点击driver.findElement(By.cssSelector("body > div > div.result > div:nth-child(2) > a")).click();//获取当前页面的句柄String curHandle=driver.getWindowHandle();Set<String> handles=driver.getWindowHandles();for (String handle:handles){if (handle!=curHandle){driver.switchTo().window(handle);}}Thread.sleep(3000);//查找在线文档页面的元素验证跳转成功driver.findElement(By.cssSelector("#allclasses_navbar_top > li > a"));}
如下效果图展示:
自动化视频 2025-01-26 145252
四、测试总结
以下是搜索引擎测试总结的结构化内容:
4.1 功能测试方面
- 搜索准确性
- 测试了不同类型的关键词,包括常见词汇、专业术语、模糊表述等。发现大部分常见词汇能准确找到相关结果,但对于一些非常模糊或者具有多义性的表述,搜索引擎的结果准确性会有所下降。例如,搜索“苹果”,除了水果类结果,还会出现苹果公司相关结果,在某些特定需求下可能不够精准。
- 搜索结果多样性
- 检查搜索结果是否涵盖了多种来源,如网页、新闻、学术论文、图片、视频等。总体上,现代搜索引擎在这方面表现较好,能提供较为丰富的结果类型。但在一些特定领域,如小众的学术研究方向,结果多样性可能会受到数据源数量的限制。
- 搜索排序合理性
- 评估搜索结果的排序是否符合相关性原则。一般来说,搜索引擎会根据关键词匹配度、网页权重等因素进行排序。然而,有时会发现商业推广内容的排序可能会影响到自然搜索结果的展示顺序,对用户体验有一定的干扰。
4.2 性能测试方面
- 响应速度
- 在不同网络环境下(如高速宽带、移动网络)测试搜索请求的响应时间。在良好网络环境下,响应速度较快,能在1 - 2秒内给出结果。但在网络信号较差的移动网络环境中,响应时间可能会延长到5 - 10秒甚至更久。
- 资源占用
- 监控搜索引擎在运行过程中对设备资源(如CPU、内存)的占用情况。在长时间使用或者进行大量搜索时,搜索引擎的客户端可能会占用较多内存,导致设备运行速度变慢,尤其是在配置较低的设备上。
4.3 用户界面测试方面
- 界面布局
- 检查搜索引擎界面的布局是否简洁、直观。良好的界面布局应该能够让用户快速找到搜索框、筛选工具等重要元素。部分搜索引擎在界面上存在广告位过多,影响用户对搜索结果的查看体验的问题。
- 易用性
- 测试用户操作的便捷性,如输入关键词、选择搜索结果、使用高级搜索功能等。一些搜索引擎的高级搜索功能隐藏较深,普通用户很难发现和使用,降低了搜索的精准性和效率。
相关文章:
【文星索引】搜索引擎项目测试报告
目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…...
【PostgreSQL内核学习 —— (WindowAgg(一))】
WindowAgg 窗口函数介绍WindowAgg理论层面源码层面WindowObjectData 结构体WindowStatePerFuncData 结构体WindowStatePerAggData 结构体eval_windowaggregates 函数update_frameheadpos 函数 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊…...
Maya快捷键
旋转 ALT鼠标左键 平移 ALT鼠标中键 缩放 ALT鼠标右键 / 滑动鼠标滚轮 切换视图 空格键 [Q] 选择状态 [W] 移动状态 [E] 旋转状态 [R] 绽放状态 1正常显示 2正常也圆滑同时显示 3圆滑显示 4线框显示 5材质显示 6贴图显示 7灯光显示 CTRLZ 撤销命令…...
Go反射指南
概念: 官方对此有个非常简明的介绍,两句话耐人寻味: 反射提供一种让程序检查自身结构的能力反射是困惑的源泉 第1条,再精确点的描述是“反射是一种检查interface变量的底层类型和值的机制”。 第2条,很有喜感的自嘲…...
深入理解 C 语言函数指针的高级用法:(void (*) (void *)) _IO_funlockfile
深入理解 C 语言函数指针的高级用法 函数指针是 C 语言中极具威力的特性,广泛用于实现回调、动态函数调用以及灵活的程序设计。然而,复杂的函数指针声明常常让即使是有经验的开发者也感到困惑。本文将从函数指针的基本概念出发,逐步解析复杂…...
【观察】甲骨文:以AI为中心,开启企业级平台架构“新革命”
知名科技杂志《连线》创始主编凯文凯利曾预测:“在未来的 100 年里,人工智能将超越任何一种人工力量,将人类引领到一个前所未有的时代。” 可以看到,随着近两年AIGC与大模型的快速爆发,AI在千万行业中的重要性愈发突出…...
react native在windows环境搭建并使用脚手架新建工程
截止到2024-1-11,使用的主要软件的版本如下: 软件实体版本react-native0.77.0react18.3.1react-native-community/cli15.0.1Android Studio2022.3.1 Patch3Android SDKAndroid SDK Platform 34 35Android SDKAndroid SDK Tools 34 35Android SDKIntel x…...
C语言从入门到进阶
视频:https://www.bilibili.com/video/BV1Vm4y1r7jY?spm_id_from333.788.player.switch&vd_sourcec988f28ad9af37435316731758625407&p23 //枚举常量 enum Sex{MALE,FEMALE,SECRET };printf("%d\n", MALE);//0 printf("%d\n", FEMALE…...
Python案例--养兔子
兔子繁殖问题是一个经典的数学问题,最早由意大利数学家斐波那契在13世纪提出。这个问题不仅在数学领域具有重要意义,还广泛应用于计算机科学、生物学和经济学等领域。本文将通过一个具体的Python程序,深入探讨兔子繁殖问题的建模和实现&#…...
Mybatis——sql映射文件中的增删查改
映射文件内的增删查改 准备工作 准备一张数据表,用于进行数据库的相关操作。新建maven工程, 导入mysql-connector-java和mybatis依赖。新建一个实体类,类的字段要和数据表的数据对应编写接口编写mybatis主配置文件 public class User {priva…...
goframe 博客分类文章模型文档 主要解决关联
goframe 博客文章模型文档 模型结构 (BlogArticleInfoRes) BlogArticleInfoRes 结构体代表系统中的一篇博客文章,包含完整的元数据和内容管理功能。 type BlogArticleInfoRes struct {Id uint orm:"id,primary" json:"id" …...
人工智能在医疗领域的应用有哪些?
人工智能在医疗领域的应用十分广泛,涵盖了诊断、治疗、药物研发等多个环节,以下是一些主要的应用: 医疗影像诊断 疾病识别:通过分析 X 光、CT、MRI 等影像,人工智能算法能够识别出肿瘤、结节、骨折等病变,…...
学习第七十六行
提高github下载速度方法 1.github转码云 2.https://github.com.cnpmjs.org com后面加东西 对于面试笔试,最好方法刷力扣,1000题包进大厂的...
C#System.Threading.Timer定时器意外回收注意事项
System.Threading.Timer定时器使用时会出现意外回收的情况。具体解释如下: 只要在使用 Timer,就必须保留对它的引用。对于任何托管对象,如果没有对 Timer 的引用,计时器会被垃圾回收。即使 Timer 仍处在活动状态,也会被回收。 实例对比测试 实例 定义两个类,其中一个…...
若依基本使用及改造记录
若依框架想必大家都了解得不少,不可否认这是一款及其简便易用的框架。 在某种情况下(比如私活)使用起来可谓是快得一匹。 在这里小兵结合自身实际使用情况,记录一下我对若依框架的使用和改造情况。 一、源码下载 前往码云进行…...
Java基础教程(007):方法的重载与方法的练习
文章目录 6.5 方法的重载6.6 方法练习数组遍历数组最大值 6.5 方法的重载 在 Java 中,方法的重载是指在同一个类中定义多个方法,这些方法具有相同的名称,但参数列表不同。方法的重载是一种实现多态的方式,允许一个方法名以不同的…...
Day27-【13003】短文,线性表两种基本实现方式空间效率、时间效率比较?兼顾优点的静态链表是什么?如何融入空闲单元链表来解决问题?
文章目录 本次内容总览第四节,两种基本实现方式概览两种基本实现方式的比较元素个数n大于多少时,使用顺序表存储的空间效率才会更高?时间效率比较?*、访问操作,也就是读运算,读操作1、插入,2、删…...
Linux 小火车
1.添加epel软件源 2.安装sl 3. 安装完成后输入: sl...
论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(四)
Understanding Diffusion Models: A Unified Perspective(四) 文章概括学习扩散噪声参数(Learning Diffusion Noise Parameters)三种等效的解释(Three Equivalent Interpretations) 文章概括 引用…...
python 统计相同像素值个数
目录 python 统计相同像素值个数 最大值附近的值 python 统计相同像素值个数 import cv2 import numpy as np import time from collections import Counter# 读取图像 image cv2.imread(mask16.jpg)# 将图像转换为灰度图像 gray_image cv2.cvtColor(image, cv2.COLOR_BGR2…...
YOLOv8:目标检测与实时应用的前沿探索
随着深度学习和计算机视觉技术的迅速发展,目标检测(Object Detection)一直是研究热点。YOLO(You Only Look Once)系列模型作为业界广受关注的目标检测框架,凭借其高效、实时的特点,一直迭代更新…...
docker配置mysql并使用mysql connector cpp编程
mysql 配置mysql使用docker 这里使用docker安装了,比较简洁,不想使用了直接就可以把容器删掉,首先获取下镜像,如下命令 docker pull container-registry.oracle.com/mysql/community-server这里直接默认使用最新版本的mysql了 …...
go理论知识——Go Channel 笔记 [特殊字符]
go理论知识——Go Channel 笔记 📝 1. 基本概念 🧠 1.1 Channel 是什么? Channel 是 Go 语言中用于在不同 Goroutine 之间进行通信的机制。Channel 是类型安全的,意味着你只能发送和接收特定类型的数据。 1.2 Channel 的创建 …...
论文阅读笔记:MambaOut: Do We Really Need Mamba for Vision?
论文阅读笔记:MambaOut: Do We Really Need Mamba for Vision? 1 背景2 创新点3 方法4 模块4.1 Mamba适合什么任务4.2 视觉识别任务是否有很长的序列4.3 视觉任务是否需要因果token混合模式4.4 关于Mamba对于视觉的必要性假设 5 效果 论文:https://arxi…...
games101-(3/4)变换
缩放: 对称 切变 旋转 考虑(1.0)这个点 同理考虑(0,1)点即可 齐次方程 考虑在二维的坐标点后面增加一个维度 所有的仿射变换都可以写成齐次坐标的形式 a b c d 是线性变换 tx ty 是平移; …...
【Linux】磁盘
没有被打开的文件 文件在磁盘中的存储 认识磁盘 磁盘的存储构成 磁盘的效率 与磁头运动频率有关。 磁盘的逻辑结构 把一面展开成线性。 通过扇区的下标编号可以推算出在磁盘的位置。 磁盘的寄存器 控制寄存器:负责告诉磁盘是读还是写。 数据寄存器:给…...
ElasticSearch-文档元数据乐观并发控制
文章目录 什么是文档?文档元数据文档的部分更新Update 乐观并发控制 最近日常工作开发过程中使用到了 ES,最近在检索资料的时候翻阅到了 ES 的官方文档,里面对 ES 的基础与案例进行了通俗易懂的解释,读下来也有不少收获࿰…...
海浪波高预测(背景调研)
#新星杯14天创作挑战营第7期# ps:图片由通义千问生成 历史工作: 针对更高细粒度、更高精度的波浪高度预测任务: Mumtaz Ali 等人提出了一种多元线性回归模型(MLR-CWLS),该模型利用协方差加权最小二乘法&a…...
景联文科技加入AIIA联盟数据标注分委会
2025年1月16日,中国人工智能产业发展联盟(简称AIIA)数据委员会数据标注分委会(以下简称“分委会”)正式成立。景联文科技成为第一批AIIA联盟数据标注分委会委员单位。 数据标注分委会的成立旨在搭建数据标注领域产学研…...
【Healpix】python一种用于将球面划分为均匀区域的技术
Healpix 1、简介2、Healpix的基本原理3、Healpix的优点4、安装及使用4.1 安装healpy4.2 创建Healpix地图4.3 读取和写入Healpix数据4.4 数据插值 5、案例5.1 案例一:宇宙微波背景辐射(CMB)分析5.2 案例二:星系分布分析5.3 案例三&…...
