一、报告概述
1.项目背景
在线 OJ 判题系统是一款聚焦编程测评场景的在线平台,为编程学习者提供编程题目训练、竞赛组织、代码评测的全流程服务。系统面向编程教学实践、算法竞赛筹备以及选拔等场景,覆盖从题目资源管理、竞赛 / 练习组织,到代码提交判题、结果分析反馈的完整流程,助力提升编程学习效率与竞赛、招聘的技术评测质量。
系统围绕编程测评核心,构建以下关键模块:
用户管理:支持注册、登录,实现不同角色(普通用户、管理员等)权限控制,保障系统资源合理访问。
题目管理:涵盖题目创建、编辑(含题目描述、输入输出样例、判题测试用例等)、分类(如算法类型、难度等级)及发布,为测评提供基础内容支撑。
竞赛管理:支持竞赛创建(设定时间、规则、题目集)、发布、报名、参赛流程,实现竞赛过程的全周期管控。
在线编程练习:提供代码在线编写、提交判题环境,关联错题管理、练习记录留存,辅助用户复盘提升。
判题系统:依托代码编译运行环境、测试用例,实现代码实时判题,反馈结果(如通过、编译错误、运行超时等) 。
系统消息:负责推送系统通知(如竞赛开始、判题结果等),保障信息及时触达用户。
2.测试目的
1.功能验证
①确保用户注册 / 登录、题目增删改查、竞赛流程、代码判题等核心功能,贴合需求规格。
②验证权限控制,明确管理员与普通用户操作边界,保障功能有序使用。
2.用户体验优化
①从编程者角度,评估界面布局(代码编辑区、题目展示区 )、交互流程(提交判题操作 )合理性。
②测试错误提示(代码语法、权限不足提示 )清晰度,辅助用户解决问题。
③验证响应式设计,确保 PC、平板、手机等设备上,编程、浏览题目体验一致。
3.系统稳定性保障
①模拟高并发场景(大规模竞赛代码提交 ),测试系统吞吐量、响应时间,保障服务稳定。
②开展长时间运行测试(多日练习活动 ),观测性能衰减、资源占用,提前排隐患。
③模拟异常场景(网络波动、服务器故障 ),验证系统容错、降级及恢复能力,保障数据一致(提交记录、判题结果不丢失混乱 )。
4.安全性加固
①防范未授权访问,验证伪造请求越权操作(普通用户访问管理员后台 )拦截有效性。
②检测代码提交、数据传输中,对 SQL 注入(题目描述特殊字符处理 )、XSS(用户反馈内容过滤 )等攻击的防护。
③确认敏感数据(用户密码、判题用例 )加密存储与传输,防止泄露。
3.测试环境
操作系统:Windows 11 / Windows 10
浏览器:Chrome、Edge
测试工具:Selenium、JMeter、postman
二、 测试用例




三、手动测试
管理员B端
1.登录页面
测试场景一:输入正确的用户名和密码admin
预期结果:跳转到后台首页,显示超级管理员


测试场景二:错误的用户名/密码
预期结果:无法登录


2.用户管理
搜索功能
测试场景一:搜索用户ID/用户昵称
预期结果:显示对应用户的信息

测试场景二:搜索错误的用户ID/用户昵称
预期结果:无法查找到用户的信息

测试场景三:点击重置
预期结果:显示所有用户信息
页面显示功能
测试场景一:选择每页显示条数
预期结果:按照条数进行展示

测试场景二:选择页面
预期结果:挑战到正确的页面

测试场景三:超出或者低于页码范围
预期结果:自动跳转到最小页或者最大页

3.竞赛管理
搜索功能
测试场景一:择合适的创建日期,输入竞赛名称关键词,点击搜索
预期结果:列表显示对应竞赛信息

测试场景二:择错误的创建日期,竞赛名称关键词,点击搜索
预期结果:列表不显示竞赛信息

测试场景三:点击重置
预期结果:列表显示所有竞赛信息

添加竞赛功能
测试场景一:输入正确竞赛名称,和合适的竞赛周期,点击保存后添加题目,再点击发布
预期结果:成功发布竞赛

测试场景二:输入不合适的竞赛名称,和合竞赛周期,点击保存后添加题目
预期结果:无法保存竞赛

测试场景三:不添加题目进行发布
预期结果:提示竞赛当中不存在题目

发布撤销功能
测试场景一:点击发布/撤销
预期结果:撤销/发布竞赛

编辑功能

已测试通过。
列表显示功能

已测试通过。
4.题目管理

已测试通过
普通用户C端
1.注册/登录页面
测试场景一:输入正确格式的手机号和正确的验证码
预期结果:注册/登录成功,跳转到首页

测试场景二:输入正确格式的手机号和错误的验证码
预期结果:提示验证码错误

测试场景二:输入正确格式的手机号和过期的验证码
预期结果:提示验证码失效

测试场景三:多次点击获取验证码的按钮
预期结果:操作频繁,请稍后重试

2.题库
部分进行展示,其余已测试通过。

答题功能
测试场景一:点击答题,在代码界面填入正确的代码,点击提交
预期结果:提示代码通过

测试场景二:在代码界面提交能够运行的代码,但返回结果错误,点击提交
预期结果:提示代码为通过,显示未通过的用例。

测试场景三:在代码界面提交不能够运行的代码,点击提交
预期结果:提示代码的错误信息

3.竞赛

已测y
4.个人中心
测试场景一:点击个人中心,上传头像
预期结果:头像正常显示

测试场景二:编辑剩余信息,点击保存
预期结果:剩余信息正常保存

测试场景三:编辑剩余信息,点击取消
预期结果:剩余信息不保存

5.消息中心
测试场景一:点击消息中心
预期结果:正常显示消息

6.日历功能
测试场景一:点击今天
预期结果:正常显示当前日期

测试场景二:点击上个月/下个月
预期结果:跳转月份日期
7.热榜排行
测试场景一:进入首页
预期结果:题目按热度进行排名推荐

四、兼容性测试
测试场景一:Edge浏览器
预期结果:页面一切正常




测试场景二:谷歌浏览器
预期结果:页面一切正常



测试场景三:360浏览器
预期结果:页面一切正常
测试通过,不存在兼容问题。
测试场景四:华为浏览器
预期结果:页面一切正常
测试通过,不存在兼容问题。
五、自动化测试
Utils类
用于创建驱动对象并提供截图的方法,截图以//./src/test/image/2024-07-17/test01-17453020.png的格式保存。
public class Utils {
public static WebDriver driver;
public static WebDriver createDriver()
{
if(driver == null)
{
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
//允许访问所有的链接
options.addArguments("--remote-allow-origins=*");
driver = new ChromeDriver(options);
//等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
}
return driver;
}
public Utils(String url)
{
//调用driver对象
driver = createDriver();
//访问url
driver.get(url);
}
public void getScreenShot(String str) throws IOException {
//屏幕截图
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/test/image/"+ dirTime +"/" + str + "-" + fileTime+".png";
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
//srcFile放到指定位置
FileUtils.copyFile(srcFile,new File(filename));
}
}
b端自动化测试
未登录状态功能测试
自动化测试未登录情况下访问用户管理,问题管理,竞赛管理界面,是否自动跳转到登录页面。
public class PageByNologin extends Utils {
public static String userUrl = "http://localhost:5173/oj/layout/cuser";
public static String questionUrl = "http://localhost:5173/oj/layout/question";
public static String examUrl = "http://localhost:5173/oj/layout/exam";
public PageByNologin() {
super("http://localhost:5173/oj/login");
}
public void userPageByNoLogin() throws IOException {
driver.get(userUrl);
//测试未登录情况下访问用户管理界面,是否自动跳转到登录页面
String expect = driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div.submit-box")).getText();
getScreenShot(getClass().getName());
assert expect.equals("登录");
}
public void questionPageByNoLogin() throws IOException {
driver.get(questionUrl);
//测试未登录情况下访问问题管理界面,是否自动跳转到登录页面
String expect = driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div.submit-box")).getText();
getScreenShot(getClass().getName());
assert expect.equals("登录");
}
public void examPageByNoLogin() throws IOException {
driver.get(examUrl);
//测试未登录情况下访问竞赛管理界面,是否自动跳转到登录页面
String expect = driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div.submit-box")).getText();
getScreenShot(getClass().getName());
assert expect.equals("登录");
}
}
登录测试
自动化测试正常登录和异常登录的情况。
public class loginTest extends Utils {
public static String url = "http://localhost:5173/oj/login";
public loginTest() {
super(url);
}
//测试能否正常登录
public void loginPageRight() throws IOException, InterruptedException {
driver.navigate().refresh();
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(1) > div > div >input")).sendKeys("admin");
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(2) > div > div >input")).sendKeys("admin");
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div.submit-box")).click();
//检测是否登陆成功
getScreenShot(getClass().getName());
String txt = driver.findElement(By.cssSelector("#app > section > header > div > span > div")).getText();
System.out.println(txt);
assert txt.equals("当前用户:超级管理员");
}
//检测异常登录
public void loginPageFail() throws InterruptedException, IOException {
//不输入密码
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(1) > div > div >input")).sendKeys("admin");
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div.submit-box")).click();
String accept = driver.findElement(By.cssSelector("body >div:nth-child(3)>p")).getText();
assert accept.equals("账号或密码错误");
//sql注入
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(1) > div > div >input")).sendKeys("admin");
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(2) > div > div >input")).sendKeys("1111 or 1");
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div.submit-box")).click();
accept = driver.findElement(By.cssSelector("body >div:nth-child(3)>p")).getText();
assert accept.equals("账号或密码错误");
//用户不存在
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(1) > div > div >input")).sendKeys("admi");
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(2) > div > div >input")).sendKeys("admin");
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div.submit-box")).click();
accept = driver.findElement(By.cssSelector("body >div:nth-child(3)>p")).getText();
assert accept.equals("用户不存在");
}
}
竞赛管理
自动化测试竞赛添加和删除题目功能
public class examPageTest extends Utils {
public static String examUrl = "http://localhost:5173/oj/layout/exam";
public examPageTest() {
super(examUrl);
}
//为竞赛添加/删除新题目
public void addExamQuestion() throws IOException, InterruptedException {
driver.findElement(By.xpath("//*[@id=\"app\"]/section/main/div[2]/div[1]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[2]/td[8]/div/button[1]/span")).click();
driver.findElement(By.cssSelector("#app > section > main > div.right > div > div > div.exam-select-question-box > button")).click();
driver.findElement(By.cssSelector("#app > section > main > div.right > div > div > div:nth-child(3) > div > div > div>div>div >div:nth-child(3)>div>div:nth-child(3)>div>div>div>table>tbody>tr>td>div>label>span>span")).click();
driver.findElement(By.cssSelector("#app > section > main > div.right > div > div > div:nth-child(3) > div > div > div>div>div >div:nth-child(4)>button")).click();
getScreenShot(getClass().getName());
Thread.sleep(1000);
String txt = driver.findElement(By.cssSelector("#app > section > main > div.right > div > div > div.exam-select-question-box > div > div.el-table__inner-wrapper > div.el-table__body-wrapper > div > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > table > tbody > tr > td.el-table_2_column_10.el-table__cell > div")).getText();
assert txt.equals("二叉树");
//删除题目
driver.findElement(By.cssSelector("#app > section > main > div.right > div > div > div.exam-select-question-box > div > div.el-table__inner-wrapper > div.el-table__body-wrapper > div > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > table > tbody > tr > td.el-table_2_column_12.el-table__cell > div > button > span")).click();
getScreenShot(getClass().getName());
}
}
用户管理
自动化测试用户管理的拉黑和解禁功能,搜索功能。
public class userPageTest extends Utils {
public static String userUrl = "http://localhost:5173/oj/layout/cuser";
public userPageTest() {
super(userUrl);
}
//拉黑/解禁用户
public void testUserManagement() throws IOException {
//截图用户信息
getScreenShot(getClass().getName());
//拉黑/解禁测试
String txt = driver.findElement(By.xpath("//*[@id=\"app\"]/section/main/div[2]/div[1]/div[1]/div[3]/div/div[1]/div/table/tbody/tr/td[10]/div/button/span")).getText();
if(txt.equals("解禁")){
driver.findElement(By.xpath("//*[@id=\"app\"]/section/main/div[2]/div[1]/div[1]/div[3]/div/div[1]/div/table/tbody/tr/td[10]/div/button/span")).click();
txt = driver.findElement(By.xpath("//*[@id=\"app\"]/section/main/div[2]/div[1]/div[1]/div[3]/div/div[1]/div/table/tbody/tr/td[10]/div/button/span")).getText();
assert txt.equals("拉黑");
}
else if(txt.equals("拉黑")){
driver.findElement(By.xpath("//*[@id=\"app\"]/section/main/div[2]/div[1]/div[1]/div[3]/div/div[1]/div/table/tbody/tr/td[10]/div/button/span")).click();
txt = driver.findElement(By.xpath("//*[@id=\"app\"]/section/main/div[2]/div[1]/div[1]/div[3]/div/div[1]/div/table/tbody/tr/td[10]/div/button/span")).getText();
assert txt.equals("解禁");
}
}
public void userPageSearchTest() throws IOException, InterruptedException {
//搜索用户id
driver.findElement(By.cssSelector("#app > section > main > div.right > form > div:nth-child(1) > div > div > div > input")).sendKeys("1961078732107448322");
driver.findElement(By.cssSelector("#app > section > main > div.right > form > div:nth-child(3) > div > button:nth-child(1)")).click();
//截图用户信息
getScreenShot(getClass().getName());
String txt = driver.findElement(By.xpath("//*[@id=\"app\"]/section/main/div[2]/div[1]/div[1]/div[3]/div/div[1]/div/table/tbody/tr/td[2]/div")).getText();
assert txt.equals("李现");
}
}
题目管理
自动化测试题目添加和删除功能
public class questionPageTest extends Utils {
public static String quetsionUrl = "http://localhost:5173/oj/layout/question";
public questionPageTest() {
super(quetsionUrl);
}
//添加题目
public void createQuestion() throws IOException {
driver.findElement(By.cssSelector("#app > section > main > div.right > form > div:nth-child(3) > div > button.el-button.el-button--primary.is-plain > span")).click();
driver.findElement(By.cssSelector("#app > section > main > div.right > div.el-overlay > div >div >form >div>div>div>div>input")).sendKeys("测试");
driver.findElement(By.cssSelector("#app > section > main > div.right > div.el-overlay > div > div > form >div:nth-child(2) >div>div>div>div>div:nth-child(2)")).click();
driver.findElement(By.cssSelector("body >div >div:nth-child(4) >div>div>div>ul>li")).click();
driver.findElement(By.cssSelector("#app > section > main > div.right > div.el-overlay > div >div >form >div:nth-child(3)>div>div>div>input")).sendKeys("1000");
driver.findElement(By.cssSelector("#app > section > main > div.right > div.el-overlay > div >div >form >div:nth-child(4)>div>div>div>input")).sendKeys("1000");
driver.findElement(By.cssSelector("#app > section > main > div.right > div.el-overlay > div >div >form >div:nth-child(6)>div>div>div>input")).sendKeys("{[2]}");
driver.findElement(By.cssSelector("#app > section > main > div.right > div.el-overlay > div >div >form >div:nth-child(5)>div:nth-child(2)>div>div:nth-child(2)>div")).sendKeys("测试");
driver.findElement(By.cssSelector("#app > section > main > div.right > div.el-overlay > div >div >form >div:nth-child(7)>div:nth-child(2)>div>textarea")).sendKeys("test...");
driver.findElement(By.cssSelector("#app > section > main > div.right > div.el-overlay > div >div >form >div:nth-child(8)>div:nth-child(2)>div>textarea")).sendKeys("test...");
driver.findElement(By.cssSelector("#app > section > main > div.right > div.el-overlay > div >div >form >div:nth-child(9)>div>button")).click();
getScreenShot(getClass().getName());
String txt = driver.findElement(By.cssSelector("#app > section > main > div.right > div.el-table--fit.el-table--scrollable-x.el-table--enable-row-transition.el-table.el-table--layout-fixed.is-scrolling-left > div.el-table__inner-wrapper > div.el-table__body-wrapper > div > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > table > tbody > tr:nth-child(1) > td.el-table_1_column_2.el-table__cell > div")).getText();
assert txt.equals("测试");
}
//删除题目
public void deleteQuestion() throws IOException, InterruptedException {
Thread.sleep(1000);
driver.findElement(By.xpath("//*[@id=\"app\"]/section/main/div[2]/div[1]/div[1]/div[3]/div/div[1]/div/table/tbody/tr[1]/td[6]/div/button[2]/span")).click();
getScreenShot(getClass().getName());
String txt = driver.findElement(By.cssSelector("#app > section > main > div.right > div.el-table--fit.el-table--scrollable-x.el-table--enable-row-transition.el-table.el-table--layout-fixed.is-scrolling-left > div.el-table__inner-wrapper > div.el-table__body-wrapper > div > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > table > tbody > tr:nth-child(1) > td.el-table_1_column_2.el-table__cell > div")).getText();
assert txt.equals("二叉树");
}
}
c端用户功能测试
注册登录功能
自动化测试注册成功和注册失败的情况,注册成功直接登录。
public class registerTest extends Utils {
public static String url = "http://localhost:5174/c-oj/login";
public registerTest() {
super(url);
}
//注册成功
public void registerSuc() throws InterruptedException, IOException {
driver.navigate().refresh();
String phone = "15622792879";
String code = "123456";
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(1) > div > div > input")).sendKeys(phone);
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(2) > div.code-btn-box")).click();
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(2) > div.el-input > div > input")).sendKeys(code);
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div.submit-box")).click();
getScreenShot(getClass().getName());
String txt = driver.findElement(By.cssSelector("#app > div.oj-main-layout > div.oj-main-layout-header > div > div > div.oj-navbar-menus > ul > li:nth-child(1)")).getText();
assert txt.equals("题库");
}
//注册失败
public void registerFail() throws InterruptedException, IOException {
String phone = "1";
String code = "123456";
//手机号错误
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(1) > div > div > input")).sendKeys(phone);
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(2) > div.code-btn-box")).click();
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div.submit-box")).click();
String txt = driver.findElement(By.cssSelector("body >div:nth-child(3) >p")).getText();
assert txt.equals("你输入的手机号有误");
getScreenShot(getClass().getName());
phone = "15622792879";
driver.navigate().refresh();
//验证码失效
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(1) > div > div >input")).sendKeys(phone);
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(2) > div.el-input > div")).sendKeys(code);
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div.submit-box")).click();
txt = driver.findElement(By.cssSelector("body >div:nth-child(3) >p")).getText();
assert txt.equals("验证码无效");
getScreenShot(getClass().getName());
driver.navigate().refresh();
//验证码错误
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(1) > div > div >input")).sendKeys(phone);
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(2) > div.code-btn-box")).click();
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div:nth-child(2) > div.el-input > div >input")).sendKeys("111111");
driver.findElement(By.cssSelector("#app > div > div.login-box > div.form-box > div.submit-box")).click();
getScreenShot(getClass().getName());
txt = driver.findElement(By.cssSelector("body >div:nth-child(3) >p")).getText();
assert txt.equals("验证码错误");
}
}
用户中心
自动化测试用户信息编辑功能。
public class userCenterTest extends Utils {
public static String url = "http://localhost:5174/c-oj/home/user/detail";
public userCenterTest() {
super(url);
}
public void editUser() throws IOException {
//编辑用户昵称为李现,并保存
driver.findElement(By.cssSelector("#app > div.user-info-page > div > div > form > div.oj-user-info-subtitle-box > div > div > button.el-button.el-button--text.user-info-edit > span")).click();
driver.findElement(By.cssSelector("#app > div:nth-child(2) >div> div>form>div:nth-child(2)>div:nth-child(2)>div>div>div>input")).sendKeys("李现");
driver.findElement(By.cssSelector("#app > div:nth-child(2) >div> div>form>div:nth-child(3) >button:nth-child(2)")).click();
getScreenShot(getClass().getName());
String txt = driver.findElement(By.cssSelector("#app > div.user-info-page > div > div > form > div.ku-user-section > div:nth-child(2) > div.el-form-item__content > span")).getText();
assert txt.equals("李现");
}
}
答题
自动化测试答题功能,答题通过和不通过两种情况。
public class answerQuestionTest extends Utils {
public static String url = "http://localhost:5174/c-oj/home/question";
public answerQuestionTest() {
super(url);
}
public void answerQuetsion() throws InterruptedException, IOException {
//成功作答
driver.findElement(By.cssSelector("#app > div.index-question > div > page-container > div.el-table--fit.el-table--enable-row-hover.el-table--enable-row-transition.el-table.el-table--layout-fixed.is-scrolling-none > div.el-table__inner-wrapper > div.el-table__body-wrapper > div > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > table > tbody > tr:nth-child(2) > td.el-table_1_column_4.is-center.el-table__cell > div > button > span")).click();
Thread.sleep(1000);
driver.findElement(By.cssSelector("#app >div >div:nth-child(2)> div:nth-child(2)>div:nth-child(2)>div>div:nth-child(2)>div:nth-child(3)>div>div:nth-child(3)>div:nth-child(3)")).sendKeys("return a+b");
String txt = driver.findElement(By.cssSelector("")).getText();
assert txt.equals("通过");
getScreenShot(getClass().getName());
//做答错误
driver.findElement(By.cssSelector("#app > div.index-question > div > page-container > div.el-table--fit.el-table--enable-row-hover.el-table--enable-row-transition.el-table.el-table--layout-fixed.is-scrolling-none > div.el-table__inner-wrapper > div.el-table__body-wrapper > div > div.el-scrollbar__wrap.el-scrollbar__wrap--hidden-default > div > table > tbody > tr:nth-child(2) > td.el-table_1_column_4.is-center.el-table__cell > div > button > span")).click();
Thread.sleep(1000);
driver.findElement(By.cssSelector("#app >div >div:nth-child(2)> div:nth-child(2)>div:nth-child(2)>div>div:nth-child(2)>div:nth-child(3)>div>div:nth-child(3)>div:nth-child(3)")).sendKeys("return 0");
txt = driver.findElement(By.cssSelector("")).getText();
assert txt.equals("未通过");
getScreenShot(getClass().getName());
}
}
竞赛
自动化测试竞赛排名查询。
public class userExamTest extends Utils {
public static String url = "http://localhost:5174/c-oj/home/exam";
public userExamTest() {
super(url);
}
//查看历史竞赛排名
public void checkHistoryExam() throws IOException {
driver.findElement(By.cssSelector("#app > div.exam-page.flex-col > div > div.exam-option-group.flex-row.justify-between > div.exam-option.selected")).click();
driver.findElement(By.cssSelector("#app > div.exam-page.flex-col > div > div.center-box > div.exam-list-group.flex-row > div:nth-child(1) > div.right-info > div.exam-button-container > div > button.el-button.el-button--primary.is-plain.exam-rank-button > span")).click();
getScreenShot(getClass().getName());
}
}
runCase类
public class runCase {
public static void main(String[] args) throws InterruptedException, IOException {
//b端未登录测试
PageByNologin test = new PageByNologin();
test.examPageByNoLogin();
test.questionPageByNoLogin();
test.userPageByNoLogin();
// b端登录测试
loginTest test2 = new loginTest();
test2.loginPageFail();
test2.loginPageRight();
// b端用户管理测试
userPageTest test3 = new userPageTest();
test3.userPageSearchTest();
test3.testUserManagement();
examPageTest test4 = new examPageTest();
test4.addExamQuestion();
questionPageTest test5 = new questionPageTest();
test5.createQuestion();
test5.deleteQuestion();
//c端用户注册/登录测试
registerTest test6 = new registerTest();
test6.registerFail();
test6.registerSuc();
//c端用户答题测试
answerQuestionTest test7 = new answerQuestionTest();
test7.answerQuetsion();
userCenterTest test8 = new userCenterTest();
test8.editUser();
userExamTest test9 = new userExamTest();
test9.checkHistoryExam();
Utils.driver.quit();
}
}
六、性能测试
通过jmeter对在线oj网站的登录,题目,竞赛,答题接口进行简单的测试。
创建梯度压测线程组慢慢增大我们对接口的并发请求。

1.添加线程和登录请求
2.创建csv存放手机号和验证码(为了方便测试统一为123456),导入csv文件

3.设置默认请求值

4.设置登录接口


5.设置json提取器


6.设置题目,竞赛,答题接口



查看结果:
响应时间:
没有出现响应时间持续上升的趋势,无性能衰减。响应时间波动在可接受范围内,系统表现稳定。最高响应时间未超过64ms。

每秒处理事务数:
每秒处理的事务数在100上下,较为稳定。

聚合报告:
响应速度:平均 15ms,90%的请求在 23ms 内完成,用户体验流畅。
处理能力:吞吐量达 293.2 请求/秒,表明系统并发处理能力良好。
稳定性:异常率仅 0.08%,系统运行非常稳定。
网络负载:网络带宽使用正常,无瓶颈迹象。

七、bug描述
1.管理员竞赛管理版块
无法正常添加题目


2.管理员竞赛管理
用户未对竞赛信息进行保存时,提示不够明确

3.c端消息中心,消息不正常显示

4.C端个人中心,初始化头像不显示

5.页码处格式混乱

八、测试总结
本次测试全面覆盖了功能、自动化、性能及兼容性等方面。系统核心功能稳定,性能表现优异,满足上线要求。发现的部分次要缺陷不影响主体功能,建议修复后发布。
亮点与优势:
功能完整性强:B端管理与C端用户功能均实现良好,流程通畅。
性能表现突出:压力测试下,系统响应迅速(平均15ms)、吞吐量高(293.2请求/秒)、异常率极低(0.08%),具备良好的并发处理能力。
自动化覆盖度高:成功构建自动化测试框架,覆盖了登录、用户管理、题目竞赛操作、答题等关键场景,提升了测试效率。
安全性与稳定性达标:基础安全控制有效,系统在长时间运行下未出现性能衰减。
三、待办事项与建议:
缺陷修复:需修复【竞赛管理添加题目异常】、【消息中心显示不全】等已发现的Bug。
监控上线:发布后需密切关注系统运行状态,特别是竞赛等高并发场景。
持续回归:将本次发现的用例补充至回归测试集,保障后续版本质量。





618

被折叠的 条评论
为什么被折叠?



