一、项目概述
1、项目背景
本项目是一个轻量级Java文档搜索引擎 ,基于正倒排索引实现。我从Oracle官网收集了10228份Java官方文档,通过分词和索引构建,提供关键词搜索功能,并展示标题、描述、原文链接,方便开发者离线或怀素查阅Java API文档。
2、需求分析
2.1功能需求
(1)支持单个关键词搜索,返回匹配的文档标题、描述、官方URL
(2)点击标题可跳转到https://docs.oracle.com/en/java/javase/21/docs/api对应页面
(3)结果按相关性倒序排列
2.2非功能需求
(1)1000篇文档以内,搜索响应时间<500ms
(2)界面简洁,搜索框和结果清晰展示
二、测试环境与范围
1、测试环境
|-------|-----------------------------|
| 配置项 | 详情 |
| 操作系统 | Windows 11 |
| JDK版本 | 17 |
| 浏览器 | Microsoft Edge148.0.3967.83 |
| 文档规模 | 10228份Oracle Java官方文档 |
| 开发工具 | IntelliJ IDEA2026.1 |
2、测试范围
2.1已测功能
(1)关键词搜索(中英文、数字、常见Java类名如ArrayList,含空格的关键词)
(2)搜索结果正确显示标题、描述、URL
(3)点击标题能否正确跳转到Oracle官网
(4)空关键词、特殊字符、无匹配结果等异常输入
2.2未测功能
(1)高并发场景
(2)分布式部署
(3)安全性(防SQL注入等)
三、设计测试用例与执行
测试用例设计方案:
(1)分层设计:按功能测试、界面测试、性能测试、兼容性测试四个方面拆分
(2)场景化描述:每个用例包含前置条件、操作步骤、预期结果三要素
(3)正反向结合:正常流程+异常场景双重验证

3.1、功能测试
测试用例全部通过

3.2、界面测试
测试用例全部通过

3.3、性能测试
测试用例全部通过

3.4、兼容性测试
测试用例全部通过

四、自动化测试
1、自动化技术架构
本项目的自动化测试采用 JUnit 5 框架,在 IntelliJ IDEA 中编写并执行。
测试范围:针对 DocSearcher 类的核心搜索方法 search(String query) 进行单元测试。
依赖管理:使用 Maven 管理 junit-jupiter 依赖,版本 5.9.3。
java
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>
测试方式:通过 @BeforeEach 在每个测试前重新加载索引,确保测试隔离;使用 @Test 标记测试用例,利用 Assertions 类提供断言。
运行方式:在 IDEA 中直接运行测试类。
2、核心能力测试
使用 JUnit 5 编写了 6 个自动化测试用例,覆盖了正常搜索、空输入、超长关键词、特殊字符等场景。
java
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import searcher.DocSearcher;
import searcher.Result;
import java.util.List;
import static junit.framework.Assert.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class DocSearcherTest {
private DocSearcher docSearcher;
@BeforeEach
void setUp() {
docSearcher = new DocSearcher();
}
// 1. 正常搜索:有结果
@Test
void testSearchWithValidKeyword() {
List<Result> results = docSearcher.search("list");
assertNotNull(results);
assertTrue(results.size() > 0, "搜索 'list' 应该返回至少一条结果");
}
// 2. 搜索不存在的词:方法正常执行,不崩溃,且返回 List 对象
@Test
void testSearchWithNonExistentWord() {
List<Result> results = docSearcher.search("zzznotexist999");
assertNotNull(results);
}
// 3. 空字符串输入:返回空列表
@Test
void testSearchWithEmptyString() {
List<Result> results = docSearcher.search("");
assertNotNull(results);
assertEquals(0, results.size());
}
// 4. 只含空格的输入:返回空列表
@Test
void testSearchWithBlankSpaces() {
List<Result> results = docSearcher.search(" ");
assertNotNull(results);
assertEquals(0, results.size());
}
// 5. 超长关键词:确保不崩溃,返回空列表
@Test
void testSearchWithLongKeyword() {
StringBuilder longWord = new StringBuilder();
for (int i = 0; i < 300; i++) {
longWord.append("a");
}
List<Result> results = docSearcher.search(longWord.toString());
assertNotNull(results);
assertEquals(0, results.size());
}
// 6. 特殊字符:不会导致异常,返回空列表
@Test
void testSearchWithSpecialCharacters() {
List<Result> results = docSearcher.search("#@$%^&*");
assertNotNull(results);
}
}
五、测试结果分析
1、自动化测试结果
所有用例均通过,验证了搜索核心逻辑的稳定性。

2、测试过程中发现并修复的问题
测试过程中发现部分异常输入(中文、特殊字符、空值、超长关键词)处理不够完善,已通过增加参数校验、长度限制和友好提示等方式修复。修复后全部测试用例通过。
(1)特殊/空白输入导致404错误
问题描述 :输入为空、空格或特殊字符(如 #@$%)时,后端返回 404,未做友好提示。
原因分析:接口未对参数进行有效性校验。
修复措施:在搜索接口入口增加参数校验,无效输入返回空结果和提示信息。
(2)超长关键词未提示
问题描述:输入连续 300 个字符时,程序仍正常搜索,未提示"关键词过长"。
修复措施:增加长度判断,超过 100 字符时返回空结果并给出提示。
六、测试结论与后续优化
1、测试结论
本次测试共执行 20 条手工测试用例 和 6 条自动化测试用例,覆盖功能、界面、性能、兼容性四大模块。测试结果如下:
功能测试:11条用例全部通过,搜索准确性、结果展示、异常处理均符合预期。
界面测试:5条用例全部通过,布局合理、交互反馈正常、响应式良好。
性能测试:在 10228 份文档下,平均响应时间 < 1500ms,满足预期。
兼容性测试:Chrome 和 Edge 浏览器下功能正常,布局无错乱。
总体评估:项目核心功能完整,异常处理完善,性能达标,已达到小型文档搜索引擎的交付标准。
2、后续优化
虽然当前版本已满足基本需求,但后续可继续完善以下方向:
中文搜索支持:当前分词器已支持中文,但文档集为英文,后续可切换中文文档集以充分利用该能力。
自动化测试增强:补充 API 层的 MockMvc 集成测试和前端 Selenium 回归测试。
部署上线:将项目部署到云服务器,提供公网访问链接,并补充网络延迟等环境下的性能测试。