C++负载均衡式在线OJ测试报告

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿

🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟

🌟🌟 追风赶月莫停留 🌟🌟

🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀

🌟🌟 平芜尽处是春山🌟🌟

🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟

🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍋C++负载均衡式在线OJ测试报告

🍑项目概述

🍍项目背景

本项目致力于打造一个类似 LeetCode 的系统,核心在于实现题目列表展示与在线编程功能

🍍项目目标

实现基础的在线编程环境,包括获取题目列表以及在线进行代码编写的功能 。提供稳定的代码编译与运行服务,能够处理远端提交的代码并返回格式化的运行结果 。实现负载均衡机制,以便在多个编译节点中合理调度请求 。完成两套版本的数据存储方案:基于文件版的在线OJ和基于 MySQL 版的在线OJ 。

🍍业务场景

客户端可以向系统请求展示所有的题目列表 。

客户端可以请求进入特定题目的详细编写界面 。

用户在前端页面完成代码编写后,可以向服务端提交代码 。

系统接收代码后,通过负载均衡机制选择合适的 compile_server 节点进行编译和运行,最终将判题结果返回给客户端 。

🍍技术特点

基础语言设施采用了 C++ STL 标准库以及 Boost 准标准库进行字符串切割 。

网络通信层面使用了 cpp-httplib 第三方开源网络库 。

数据处理与展示层面,使用了 jsoncpp 进行序列化与反序列化,以及 ctemplate 进行前端网页的渲染 。

系统设计融合了多进程、多线程以及自定义的负载均衡调度策略 。

数据持久化使用了 MySQL C connect 进行数据库交互 。

前端页面集成了 Ace 前端在线编辑器,并使用了基础的 html/css/js/jquery/ajax 技术 。

🍑测试环境

服务器环境:ubuntu(22.04) 云服务器 。

代码编辑器:vscode 。

数据库及可视化:MySQL 数据库,搭配 Mysql Workbench 工具使用 。

编译器:建议使用高版本的 gcc (建议是 gcc 7, 8 或 9),以确保 cpp-httplib 能够正常编译和运行 。

🍑项目结构

本项目整体采用 BS(Browser/Server)模式设计 。在宏观结构上,项目的核心被划分为三个主要模块 :

  1. comm (公共模块):作为基础模块支撑其他业务 。
  2. compile_server (编译与运行模块):这是一个独立的服务,专门负责接收远端提交的代码,利用子进程完成代码的编译与运行工作 。
  3. oj_server (主控服务模块):负责与客户端的直接交互,处理获取题目列表、查看题目编写界面的请求,同时承担着对各个 compile_server 节点进行负载均衡选择的核心任务 。

🍑测试用例

🍑功能测试

🍍手动测试

  1. 进入首页成功(输入正确访问地址)
  2. 进入首页失败(访问地址有误)
  3. 进入题目列表
  4. 点击题目列表导航栏---首页(成功返回)
  1. 进入对应的答题界面
  2. 提交错误代码
  3. 提交正确代码
测试项 测试结果
首页是否显示正确 正确显示
题目列表是否正常显示 正常显示
导航栏功能是否成功跳转 成功跳转
答题界面是否正确显示 正确显示
代码提交功能是否正确 正常提交

🍍自动化测试

  1. 首页测试
python 复制代码
class BlogList:
    url = ""
    driver = ""
    def __init__(self):
        self.url = "http://43.136.55.238:8080/"
        self.driver = BlogDriver.driver
        self.driver.get(self.url)
    #测试首页(登录情况下)
    def ListTestByLogin(self):
        time.sleep(2)
        #测试标题是否存在
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.content > h1")
        #测试二级标题是否存在
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.content > p")
        #测试按钮在不在
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.content > a")
  1. 题目列表测试


    题目列表不仅能正常显示,还能正常进入题目代码区
python 复制代码
class BlogDetail:
    url = ""
    driver = ""
    def __init__(self):
        self.url = "http://43.136.55.238:8080/all_questions"
        self.driver = BlogDriver.driver
        self.driver.get(self.url)

    #详情页的测试
    def DetailTestByLogin(self):

        time.sleep(2)
        #检查标题
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.question_list > h1")
        #检查第一个小标题
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.question_list > table > tbody > tr:nth-child(1) > th:nth-child(1)")
        #检查第二个小标题
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.question_list > table > tbody > tr:nth-child(1) > th:nth-child(2)")
        # 检查第三个小标题
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.question_list > table > tbody > tr:nth-child(1) > th:nth-child(3)")
        #屏幕截图
        BlogDriver.getScreeShot()
        #点击进入题目:判断回文数
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.question_list > table > tbody > tr:nth-child(2) > td:nth-child(2) > a").click()
        #屏幕截图
        BlogDriver.getScreeShot()
  1. 代码区测试

    界面正常显示
python 复制代码
class BlogDetail2:
    url = ""
    driver = ""
    def __init__(self):
        self.url = "http://43.136.55.238:8080/question/2"
        self.driver = BlogDriver.driver
        self.driver.get(self.url)

    #代码区的测试
    def DetailTestByLogin2(self):

        time.sleep(1)
        #检查题目
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.part1 > div.left_desc > h3")
        #检查题目内容
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.part1 > div.left_desc > pre")
        #检查代码区
        self.driver.find_element(By.CSS_SELECTOR, "#code > div.ace_scroller > div")
        # 检查是否有提交按钮
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.part2 > button")
        #屏幕截图
        BlogDriver.getScreeShot()
  1. 提交代码按钮测试
python 复制代码
class BlogDetail2:
    url = ""
    driver = ""
    def __init__(self):
        self.url = "http://43.136.55.238:8080/question/2"
        self.driver = BlogDriver.driver
        self.driver.get(self.url)

    #代码区的测试
    def DetailTestByLogin2(self):

        time.sleep(1)
        #检查题目
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.part1 > div.left_desc > h3")
        #检查题目内容
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.part1 > div.left_desc > pre")
        #检查代码区
        self.driver.find_element(By.CSS_SELECTOR, "#code > div.ace_scroller > div")
        # 检查是否有提交按钮
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.part2 > button")
        #屏幕截图
        BlogDriver.getScreeShot()
        self.driver.find_element(By.CSS_SELECTOR, "body > div > div.part2 > button").click()

🍑负载均衡测试

本项目实现的负载均衡主要是轮询的方式,遍历在线主机和离线主机,找到有空的机器。

🍑测试总结

本次测试成功搭建了基于 Python 和 Selenium 的 OJ 系统测试框架。通过手动指定驱动路径,彻底解决了驱动兼容性报错,并利用显式等待技术让脚本在题目详情页的运行更加稳定。同时,项目实现了自动化的截图留痕功能,能够按日期自动分类保存测试现场,极大提升了排错效率。项目的核心功能已满足上线标准,但项目本身还具有较大的提升空间。

关于本项目如果有不足或者遗漏,欢迎大家指正,谢谢!!!

相关推荐
不想写代码的星星2 小时前
C++引用的“三重门”:左值、右值、万能引用,你真的懂了吗?
c++
小温冲冲2 小时前
Qt进阶:高级渲染与界面定制完全指南(新手友好版)
c++·qt
꯭ 瞎꯭扯꯭蛋꯭2 小时前
3万字80道Java基础经典面试题总结
java·开发语言
cpp_25012 小时前
P1359 租用游艇
c++·算法·题解·洛谷·线性dp
小二·2 小时前
Go 语言系统编程与云原生开发实战(第36篇)
开发语言·云原生·golang
奔跑的蜗牛FelixChioa2 小时前
python连接sqlite快速入门
开发语言·python·sqlite
王夏奇2 小时前
python-PyQt6库学习
开发语言·python·学习
不会写DN2 小时前
Go中的Tcp编程为什么总是能看到handle?
开发语言·网络·后端·tcp/ip·golang
飞Link2 小时前
进阶时序建模:门控递归单元 (GRU) 深度解析与实战
开发语言·人工智能·rnn·深度学习·gru