一、项目概述
1.项目背景
基于Spring Boot开发的在线API文档搜索引擎,可通过输入一个关键词,得到若干搜索结果,每个搜索结果包含标题、描述、展示URL并且点击标题可跳转至对应页面。
2.项目结构
索引模块:扫描本地API文档,分析内容并构建正排和倒排索引。
搜索模块:根据输入的关键词,基于倒排索引进行检索,合并文档、设置权重,返回搜索结果。
3.测试环境
操作系统:Windows 11
浏览器:Chrome
测试工具:Selenium、JMeter、postman
二、测试用例

三、功能测试
1.手动测试
测试场景1:输入框不输入任何词汇,点击搜索按钮
预期结果:页面不做响应

测试场景2:输入框输入停止词汇,点击搜索按钮
预期结果:页面不做响应

测试场景3:输入框输入词汇,点击搜索按钮
预期结果:根据输入的词汇,返回搜索得到的结果

测试场景4:点击页面标签
预期结果:跳转至对应页面


2.自动化测试
2.1工具类
java
package com.springboot;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.PageLoadStrategy;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
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;
public WebDriverWait driverWait = null;
public Utils(String url){
createDriver();
driver.get(url);
driverWait = new WebDriverWait(driver, Duration.ofSeconds(3));
}
public static WebDriver createDriver() {
if (driver == null) {
String proxyHost = "127.0.0.1";
int proxyPort = 7897;
//创建谷歌驱动
WebDriverManager.chromedriver()
.proxy(proxyHost + ":" + proxyPort) // 设置代理
.setup();
ChromeOptions options = new ChromeOptions();
//允许访问所有的链接
options.addArguments("--remote-allow-origins=*");
//设置加载模式 EAGER为等待部分元素加载完成
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
driver = new ChromeDriver(options);
//2s隐式等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
}
return driver;
}
public void getShot(String str) throws IOException {
// ./src/test/img/
// /2026-04-12/
// /test01-152420.png
SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");
String dirTime = sim1.format(System.currentTimeMillis());
String fileTime = sim2.format(System.currentTimeMillis());
String filename ="./src/main/java/img/test-"+dirTime+"/"+str+"-"+fileTime+".png";
File file = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file,new File(filename));
}
public static void main(String[] args) throws IOException {
Utils utils = new Utils("https://www.baidu.com");
utils.getShot("test");
driver.quit();
}
}
2.2页面测试类
java
package com.springboot.tests;
import com.springboot.Utils;
import org.openqa.selenium.By;
import java.io.IOException;
public class SeacherPage extends Utils {
public static String url = "http://127.0.0.1:8080/index.html";
public SeacherPage() {
super(url);
}
public void checkPage() throws IOException {
driver.findElement(By.cssSelector("body > div > div.header > input[type=text]"));
driver.findElement(By.cssSelector("#search-btn"));
driver.findElement(By.cssSelector("body > div > div.result"));
getShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
public void searchFail1() throws IOException {
//不输入任何词进行搜索
driver.findElement(By.cssSelector("body > div > div.header > input[type=text]")).clear();
driver.findElement(By.cssSelector("#search-btn")).click();
getShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
public void searchFail2() throws IOException {
driver.findElement(By.cssSelector("body > div > div.header > input[type=text]")).clear();
//输入停止词进行搜索
driver.findElement(By.cssSelector("body > div > div.header > input[type=text]")).sendKeys("a");
driver.findElement(By.cssSelector("body > div > div.result")).click();
getShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
public void searchSuccess() throws IOException {
driver.findElement(By.cssSelector("body > div > div.header > input[type=text]")).clear();
driver.findElement(By.cssSelector("body > div > div.header > input[type=text]")).sendKeys("list");
driver.findElement(By.cssSelector("#search-btn")).click();
//跳转页面
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.equals(curHandle)) {
driver.switchTo().window(handle);
break;
}
}
getShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
}
四、兼容性测试
测试场景1:使用edge浏览器进入API搜索引擎
预期结果:无异常且布局显示功能与预期一致

测试场景2:使用谷歌浏览器进入API搜索引擎
预期结果:无异常且布局显示功能与预期一致

测试场景3:使用手机浏览器进入API搜索引擎
预期结果:无异常且布局显示功能与预期一致

五、易用性测试
功能易用,反馈清晰。

六、测试总结
1.潜在问题
不兼容手机浏览器,使用手机浏览器打开后布局异常,无法正常使用。

2.总结
本次测试覆盖的功能、界面、易用性等核心指标均满足上线标准,但兼容性指标仍存在问题。