一、报告概述
1、项目背景
OJ,全称为 Online Judge(在线评测系统),是一个用于在线编程、提交代码并自动评判程序正确性的网络平台。用于训练和选拔编程人才,如今已广泛应用于计算机科学教育、编程竞赛、技术面试和企业内部技术测评等领域。
用户可以在这个平台上解决各类编程题目,编写代码(通常支持C、C++、Java、Python等多种语言),并提交到服务器。服务器会在一个受保护的安全环境中编译并运行用户的代码,使用预设的测试数据来验证其正确性、效率和资源消耗,并即时返回评判结果。
系统包含的核心模块:
- comm:公共模块
- compile_server:编译与运行模块
- oj_server:获取题目列表,查看题目编写题目界面,负载均衡,其它功能
- questions:题目列表,题目标题+题目描述+题目测试用例
- 系统设置:界面是否美观、是否运行正常
这里我们只是实现leetcode的题目在线+在线编程功能
2、测试目的
1.功能验证
- 确保核心功能能实现,如编译与运行能正常使用
- 验证从服务器链接进去,能进入页面
- 检查题库的完整性及合理性
2.用户体验
- 评估界面布局的合理性和易用性
- 检查页面上的按钮是否能正常使用
- 检验代码的正确性,返回结果是否合理
3.兼容性测试
- 确保常用浏览器下能正常使用
- 验证不同操作系统下的运行功能
- 测试多个用户同时访问是否正常
3、所需技术与开发环境
所需技术
- C++ STL 标准库
- Boost 准标准库(字符串切割)
- cpp-httplib 第三⽅开源⽹络库
- ctemplate 第三⽅开源前端⽹⻚渲染库
- jsoncpp 第三⽅开源序列化、反序列化库
- 负载均衡设计
- 多进程、多线程
- MySQL C connect
- Ace前端在线编辑器
- html/css/js/jquery/ajax
开发环境
- ubuntu22.04云服务器
- vscode
- Mysql Workbench
测试环境
- 操作系统:Window11/Window10
- 浏览器:Chrome、Edge
- 测试工具:JMeter、postman
二、测试用例

三、手动测试
1.进入首页功能
测试场景一:edge浏览器输入IP地址进行访问
预期结果:出现首页界面


测试场景二:edge浏览器输入错误的IP地址进行访问
预期结果:进入不了首页的页面


2.进入列表页功能
测试场景一:点击进入编程按钮
预期结果:进入列表页


测试场景二:输入列表页链接
预期结果:进入列表页

3.进入详情页功能
测试场景一:点击列表页的题目
预期结果:进入题目详情页


测试场景二:输入题目详情页链接
预期结果:进入题目详情页

4.题目判断对错功能
测试场景一:输入正确代码
预期结果:代码通过

测试场景二:输入错误代码
预期结果:代码不通过

四、自动化测试
1.自动化代码测试示例
创建一个工具类,方便各个模块链接
构建两个函数,一个用来通过创建谷歌浏览器的驱动来进行网页访问,另一个通过截图功能来观察代码测试是否按照需求进行
#创建一个浏览器对象
import sys
from datetime import datetime
import os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
class Driver:
driver=""
def __init__(self):
options=webdriver.ChromeOptions()
self.driver = webdriver.Chrome(service=Service("D:\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe"),options=options)
#self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)
self.driver.implicitly_wait(2)
def getScreeShot(self):
#创建屏幕截图
#图片文件名称:./2024-05-08-173456.png
#图片路径:../images/2024-05-08/2024-05-08-173456.png
dirname=datetime.now().strftime("%Y-%m-%d")
#判断dirname文件夹是否已经存在,若不存在则创建文件夹
#../ images / 2024 - 05 - 08
if not os.path.exists("../images/"+dirname):
os.mkdir("../images/"+dirname)
#2024-05-08-173456.png
# 图片路径:../images/调用方法-2024-05-08/2024-05-08-173456.png
# 图片路径:../images/LoginSucTest-2024-05-08/2024-05-08-173456.png
# 图片路径:../images/LoginFailTest-2024-05-08/2024-05-08-173456.png
filename=sys._getframe().f_back.f_code.co_name+"-"+datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"
self.driver.save_screenshot("../images/"+dirname+"/"+filename)
BlogDriver=Driver()
OJ在线首页代码测试
from selenium.webdriver.common.by import By
from BlogAuoTest.common.Utils import BlogDriver
#OJ首页测试用例
class BlogList:
url=" "
driver=" "
def __init__(self):
self.url="http://47.107.142.189:8080/"
self.driver=BlogDriver.driver
self.driver.get(self.url)
#测试首页(登录情况下)
def ListTestByLogin(self):
#测试OJ在线标题是否存在
self.driver.find_element(By.CSS_SELECTOR, "body > div > div.content > h1")
#测试OJ内容是否存在
self.driver.find_element(By.CSS_SELECTOR,"body > div > div.content > p")
#测试按钮是否存在
self.driver.find_element(By.CSS_SELECTOR,"body > div > div.content > a")
# 添加屏幕截图
BlogDriver.getScreeShot()
OJ列表页代码测试
from selenium.webdriver.common.by import By
from BlogAuoTest.common.Utils import BlogDriver
#测试OJ列表页
class BlogDetail:
url=" "
driver=" "
def __init__(self):
self.url="http://47.107.142.189:8080/all_questions"
self.driver=BlogDriver.driver
self.driver.get(self.url)
#OJ在线列表页的测试
def DetailTestLogin(self):
#检查标题
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()
OJ在线编辑页代码测试
import time
from selenium.webdriver.common.by import By
from BlogAuoTest.common.Utils import BlogDriver
#测试OJ编辑页面
class BlogEdit:
url=" "
driver=" "
def __init__(self):
self.url="http://47.107.142.189:8080/question/2"
self.driver=BlogDriver.driver
self.driver.get(self.url)
def EditSucTestByLogin(self):
#OJ编辑页标题
self.driver.find_element(By.CSS_SELECTOR,"body > div > div.part1 > div.left_desc > h3")
#题目内容
self.driver.find_element(By.CSS_SELECTOR, "#code > div.ace_scroller > div")
#预留代码
self.driver.find_element(By.CSS_SELECTOR,"body > div > div.part1 > div.left_desc > pre")
# 添加屏幕截图
BlogDriver.getScreeShot()
运行代码
将上述的三个页面进行汇总,一一观察图片,查看测试用例是否正确
from BlogAuoTest.tests import BlogLogin
from BlogAuoTest.common.Utils import BlogDriver
from BlogAuoTest.tests import BlogList
from BlogAuoTest.tests import BlogDetail
from BlogAuoTest.tests import BlogEdit
if __name__ == "__main__":
#OJ首页
BlogList.BlogList().ListTestByLogin()
#OJ列表页
BlogDetail.BlogDetail().DetailTestLogin()
#OJ编辑页
BlogEdit.BlogEdit().EditSucTestByLogin()
#指定浏览器的退出
BlogDriver.driver.quit()
2.自动化测试代码照片详情
自动化测试之后会生成三组照片,捕获测试用例(因为运行只进行三组),我们从图片就可以观察到OJ首页页面、OJ列表页面、OJ编辑页面


从图片可以知道捕获图片成功,证明测试是正确的,确保了可靠性
自动化测试需要注意点
- 注意测试用例的先后顺序
- 定位查找页面元素时,要确保是正确的,否则就会影响代码测试
- 驱动关闭和驱动退回一定要理清楚是在什么位置上进行
- 屏幕截图保存方式要保留文件名+时间格式化,以文件夹的形式进行保存
性能测试
测试工具postman
postman
访问列表页,访问成功


访问详情页,访问成功

670

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



