在线oj判题系统-测试报告

一、报告概述

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。

监控上线:发布后需密切关注系统运行状态,特别是竞赛等高并发场景。

持续回归:将本次发现的用例补充至回归测试集,保障后续版本质量。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值