OJ在线答题-测试报告

一、报告概述

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

访问列表页,访问成功

访问详情页,访问成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值