
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
🍋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)模式设计 。在宏观结构上,项目的核心被划分为三个主要模块 :
- comm (公共模块):作为基础模块支撑其他业务 。
- compile_server (编译与运行模块):这是一个独立的服务,专门负责接收远端提交的代码,利用子进程完成代码的编译与运行工作 。
- oj_server (主控服务模块):负责与客户端的直接交互,处理获取题目列表、查看题目编写界面的请求,同时承担着对各个 compile_server 节点进行负载均衡选择的核心任务 。
🍑测试用例

🍑功能测试
🍍手动测试
- 进入首页成功(输入正确访问地址)

- 进入首页失败(访问地址有误)

- 进入题目列表

- 点击题目列表导航栏---首页(成功返回)


- 进入对应的答题界面

- 提交错误代码

- 提交正确代码

| 测试项 | 测试结果 |
|---|---|
| 首页是否显示正确 | 正确显示 |
| 题目列表是否正常显示 | 正常显示 |
| 导航栏功能是否成功跳转 | 成功跳转 |
| 答题界面是否正确显示 | 正确显示 |
| 代码提交功能是否正确 | 正常提交 |
🍍自动化测试
- 首页测试

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")
- 题目列表测试


题目列表不仅能正常显示,还能正常进入题目代码区
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()
- 代码区测试

界面正常显示
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()
- 提交代码按钮测试

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 系统测试框架。通过手动指定驱动路径,彻底解决了驱动兼容性报错,并利用显式等待技术让脚本在题目详情页的运行更加稳定。同时,项目实现了自动化的截图留痕功能,能够按日期自动分类保存测试现场,极大提升了排错效率。项目的核心功能已满足上线标准,但项目本身还具有较大的提升空间。
关于本项目如果有不足或者遗漏,欢迎大家指正,谢谢!!!

