1. 引言
程序设计类课程是我国高等院校绝大多数本科生必修的一门计算机基础课程。该课程学习人数众多,影响面广,其教学目标是培养学生的程序设计基本技能、严密的逻辑思维方式以及实践和动手能力,其中实际的编程能力是学科培养和教学效果考查的重点。但是在教学过程中,存在着以下问题:课堂上主要以老师讲授为主,学生动手机会不多;学生上机实验时,也只是简单将老师或教材上的代码抄写到实验报告中;平时作业、实验报告以及考试试卷都是由教师进行人工判题评阅的,教师由于重复性工作量巨大,最多抽查批改部分作业。这样就导致了一方面对任课教师很难全面了解班级的学习情况,另一方面对学生来说无法及时反馈,导致学习兴趣不高,最终影响学习效果。
在线评测(Online Judge, OJ)系统 [1] 是一个基于B/S的多用户在线判题系统,它允许注册用户多次在线提交源代码(如C、C#、Java、Python等),系统自动对用户提交的代码进行编译,采用“黑盒判定”的形式使用预先设定的测试用例进行测试,通过测试的结果检测程序的正确性,最终根据用户正确的解题数和用时给出排名。传统的OJ系统主要用于ACM国际大学生程序设计竞赛(ACM/ICPC)的训练和比赛。目前应用比较广泛的OJ系统,国内有北京大学的POJ [2]、浙江大学的ZOJ [3]、华中科技大学的HUSTOJ [4] 等,国外有美国的USACO、俄罗斯乌拉尔大学的URAL、波兰格但斯克理工大学的SPOJ等。这些OJ系统含有丰富的题库,拥有强大的功能以及完善的竞争体系,但是这些系统对编程者综合素质要求高,对于程序的评判过于严格 [5] [6],如果让刚接触编程的学生一开始就利用这些系统进行练习,由于其自身的编程能力不强,会打击其对学习编程的积极性,不适合课程教学辅助场景。
基于此,本文借鉴OJ系统的判题模式,并结合高校教学特点,设计了一个基于Django的在线测评系统,学生可在网上自主进行程序设计训练时,能及时准确地发现错误反馈给学生,从而设计正确、合理、高效的程序。本系统的应用有利于降低教师的重复性工作,提升教学效率,帮助学生提高编程水平,增强实践动手能力。
2. 需求分析
本文设计一个适用于高等院校程序设计类课程的在线测评系统,便于教师布置作业、管理教学进度、监督学生作业完成情况和实时了解学生的学习状况等。系统主要划分为教师和学生两个角色:
1) 教师。登录系统后能够对学生用户进行管理、查看学生基本信息以及查看学生的当前的排名情况;能够对题库进行管理、添加题库,并提供测试用例和测试结果;可以布置作业、批阅试卷和查看成绩;能够与学生进行在线交流讨论,发布新闻公告等权限。
2) 学生。学生拥有的权限最少,只具有查看新闻、在线交流讨论;查看并提交作业,根据测试用例自动判断结果是否正确;参加学习、查看成绩以及修改个人信息等权限。
根据以上分析,得到两个角色的用例图如下图1所示。

Figure 1. Use case diagram of online judge system
图1. 在线测评系统用例图
3. 系统设计
3.1. 系统总体架构
系统采用分层结构,主要包括前端展示、后台管理和评测模块三部分。前端展示和后台管理界面主要由基于Python语言的Django框架来编写完成。系统的网络拓扑结构如图2所示,整个系统采用B/S体系结构,通过Internet网对外提供服务。应用服务由Web服务器、文件服务器、评测机和数据库服务器四部分构成,Web服务器主要对外提供访问服务,文件服务器存储相关的测试用例和学生每次提交的源代码,评测机主要用来对学生提交的代码进行检测,数据库服务器在通过数据的共享的方式实现上述三个服务的数据通信。当用户访问Web服务器,选择题目进行答题并提交新的源代码后,后台程序会在数据库中做相应的记录,并将该题目的评测任务加入到数据库的任务队列中,评测机利用轮询或者事件响应机制进行评测,对队列中的任务采用FIFO评测方式实现自定义的动态任务分配。当评测任务完成后,评测结果保存到数据库服务器,同时也会利用消息事件机制将结果返回给WEB服务器,最终用户在WEB页面上就可以看到自己提交源代码的评测结果。

Figure 2. System architecture design drawing
图2. 系统架构设计图
3.2. 系统功能模块设计
基于前面的需求分析,在线评判系统设计了以下五个模块:基本信息管理模块,题库管理模块,作业管理模块,评测管理模块,交流讨论模块。系统的功能模块结构如图3所示。
1) 基本信息管理。该模块主要完成用户、课程、班级以及学生等基本信息的管理。其中用户信息管理模块主要管理使用本系统的所有用户基本信息,包括注册、登录、修改密码等功能;课程管理模块主要是对教师所教学的课程的进行管理,包括CRUD (添加、查询、修改、删除)等功能;教学班级管理模块对教师所教某门课程的教学班级进行管理,包括CRUD操作;学生管理是对教师所教某门课程下的某个教学班级的学生进行管理,主要包括CRUD操作、查看学生的当前排名情况以及批量导入学生信息并自动关联用户信息等功能。
2) 题库管理。该模块主要对试题进行管理,包括CRUD操作、批量导入(出)题目等。题目类型主要包括单选题、多选题、判断题、填空题、编程题等。每个题目主要包含题目编号、题型、题目内容、标参考答案、知识点、时间和内存限制、题目提示等内容,其中时间限制、内存限制可以采用默认值;每道题都可以查看评测历史记录。同时还包括测试用例管理,在该模块中可以对测试数据进行CRUD操作。每组测试数据可以灵活地设置分值以及是否启用。
3) 作业管理模块。该模块用于对学生作业进行管理,包括作业的CURD操作、批改作业以及成绩管理。发布作业时首先输入作业基本信息(作业名称、成绩、截止时间、班级、备注等信息),接下来从题库中选择题目添加到作业中,并设置每道题的分值;人工批改作业(可批量修改),作业代码打包下载;成绩管理中可以针对每次作业,按班级、学号、姓名等信息查看学生的成绩。
4) 评测管理模块。该模块是本系统的核心模块。主要用于学生源代码的上传提交,系统后台代码的编译运行,并根据执行结果与测试用例的标准输出的差别,返回给学生源代码的执行状态。基本的状态代码信息包括以下几种:编译错误(Compile Error)、时间超限(Time Limit Exceed)、内存超限(Memory Limit Exceed)、运行错误(Runtime Error)、通过(Accepted)、答案错误(Wrong Answer)、格式错误(Presentation Error)等。整个评测过程如图4所示。
5) 交流讨论模块。该模块主要是用于教师和学生以及学生之间的在线交流讨论,学生可以在线提交问题,教师和其它学生可以参与相关的问题的讨论,可以对相关问题进行检索查询,以及按时间或者内容相关度进行排序。同时还提供站内信息发布功能,教师可以发布作业、比赛、公告通知等信息,学生只能查看信息,当学生点击标题后可以查看相关详细内容。
3.3. 数据库设计
本系统采用MySQL数据库,MySQL提供了一整套数据库管理工具,由于其高性能和开源性,已经被很多大型系统广泛使用。根据前面的调研和分析,本系统中的数据实体有:教师、课程、班级、学生、题库类型、题库、测试用例、作业、讨论等。这些实体之间的关系是:教师可以给相关班级(一对多)讲授课程(一对多),针对相关课程布置作业(一对多),不同的作业由不同的题目构成(多对多);学生在线完成相关作业(多对多),同时可以对其它同学提出的问题参与讨论(多对多)。整个概念设计阶段的系统实体联系图如图5所示。
本系统的核心数据表包括用户基本信息表(py_user)、课程信息表(py_course)、班级信息表(py_class)、学生信息表(py_student)、试题类别信息表(py_tktype)、题库信息表(py_tiku)、测试用例信息表(py_testcase)、作业基本信息表(py_task)、作业题目详细表(py_taskdetail)、学生完成作业信息表(py_usertask)、学生作业题目详细表(py_usertaskdetail)、公告信息表(py_nofity)以及在线讨论表(py_bbs)等。
4. 系统实现
4.1. 开发平台
本系统是一种基于B/S架构的多用户在线评测系统,用户在线提交源代码后,系统进行自动编译运行并给出测试结果。网站采用Django框架进行系统开发。Django是一个用Python编写的开源Web框架,采用MTV的框架模式。MTV框架把Web应用分模型(Model)、模板(Template)和视图(View)三部分,其中模型是数据持久层,负责业务对象和数据库的关系映射,实现数据的持久化;模板为表现层,负责如何把页面展示给用户;视图也就是业务逻辑层,并在适当时候调用Model和Template。
开发工具方面,采用Python3.6,在Windows操作系统下运行并最终完成本地开发。为了防止出现 Python包管理问题以及版本冲突问题,采用virtualeny来建立虚拟环境。系统采用nginx+uwsgi进行部署,数据库采用MariaDB 5.5.68版本,使用Navicat 15作为图形化开发工具。
4.2. 界面实现
介于篇幅的原因,以下只介绍几个主要功能的界面实现。
1) 登录界面。在用户登录模块中,根据不同的使用权限将角色分设为两类:老师(管理员)和学生。老师(管理员)可以对整个平台的信息进行更新及管理操作,包含课程、班级、学生、试题、试卷、新闻等信息的管理,还可以对学生提交作业进行评测得分以供教学分析使用。学生用户是系统的主要使用者,其主要权限包括查看个人相关信息、新闻公告,完成系统中的试卷和作业等,还可以根据评测结果查看自己的学习情况并根据个人情况加以调整练习。具体登录界面如图6所示。
2) 系统主页。通过登录验证后,进入的是系统的主界面,如图7所示。左侧的导航栏会根据当前用户的角色显示不同的菜单项,拥有权限的教师(管理员)登录成功后,可以在系统设置菜单中进行相关配置。右侧为本系统的中的常用功能区,包括评测功能统计分析,通知公告列表、错题集、以及错题集排行等。
3) 题库管理。题库管理为教师(管理员)提供题库维护操作,操作界面如图8所示,主要涉及增加题目,修改题目,删除题目,查看通过率,平均代码行以及完成时间等。教师(管理员)登录成功后,选择试题添加页面。根据提示信息输入一系列基本数据,再添加动态评测的测试用例以及用来评测测试用例的样例代码。也可以对题库题型进行管理。
4) 作业管理。教师(管理员)可以通过该模块进行在线组卷,系统提供两种组卷模式,分别是自动出题和手工出题。教师进入界面后,先按提示录入一些基本数据,如图9所示。选择试卷类型,填写试卷名称,并确定答题开始时间和结束时间,考生就只能在规定的时间范围内进行作答。在“试题分布”界面,如图10所示。教师可以选择出题方式,如果选择“自动出题”,则选取相应的知识点、科目、题型、题目难度、题目数量就能完成组卷。如果是“人工出题”,则教师根据科目名称、知识点和题型名称来进行选题,最终完成手工组卷。
5) 在线测评。当教师完成组卷后,学生登录系统后就能查看相应的考试和作业信息,点击题目详细信息后,可以进入题目详情页,如图11所示。学生阅读题目后可以在线编写代码。编写完成后,即可提交自己的代码。代码提交后,会及时的反馈评测结果以及得分。如果不是满分,学生可以根据各个测试用例的结果,进一步修改自己的代码,再次进行提交评测,直到满意为止。
5. 总结
本文设计并开发了基于Django的程序设计题在线自动评测系统,实现了人员管理、题库管理、网页提交题目、程序评价反馈、信息统计、在线讨论交流等功能,达到了预期的目的,可以有效解决高等院校程序设计类课程的作业、实验和期末考试在线自动评判问题。本系统的应用能够促进学生学习的积极性和主动性,提高学生的学习效率;降低教师的重复性工作量,改进教学效果。
基金项目
本文工作受以下项目资助:广东省普通高校科研项目—青年创新人才类项目(2019KQNCX073),岭南师范学院燕岭优秀青年教师培养计划(YL20200205),岭南师范学院—自然科学人才专项(ZL2051)。
NOTES
*第一作者。
#通讯作者。