基于Python的程序评分软件的设计与实现
2021-04-01王晓华
摘要:随着Python越来越受到编程爱好者的青睐,普通高中信息技术教材都采用了Python作为编程语言。但在实际教学过程中,学生编写了很多Python程序,教师如果都进行手工批改,工作量就很大。作者提出使用基于Python的评分软件,可以大大提高教师的工作效率,体现信息技术的优势。
关键词:Python;程序;评分;黑箱测试
中图分类号:G434 文献标识码:A 论文编号:1674-2117(2021)02-0077-03
Python简单易学,功能强大,相比其他语言更容易上手。2020年9月,江苏省正式开始使用高中信息技术新教材,采用的编程语言是Python。学生在学习编程的过程中,写了很多的Python程序需要批改。另外,即使是解决同一个问题,学生的程序也是五花八门,各有特色。因此,对于教师来说,逐个手工批改程序作业,费时费力。
Python在文本处理、自动化办公等方面有着很大的优势,用很短的代码便可实现一些烦琐工作的自动化处理。因此,本文采用黑箱测试法来评价学生的程序。
● 问题描述
现有若干班级的Python程序等待批改(如图1),每名学生都有一个以学号命名的文件夹,程序文件名都是统一的,所有学生的文件夹都在student目录中。要求批改每名学生的程序,给出评分、程序运行时间以及错误提示信息,形成电子表格。
● 准备工作
学校机房里的计算机都装有Thonny3.2.7,自带Python3.7.7。Thonny的界面简洁明了,适合初学者。系统中安装了常见的第三方库,为了将结果写入电子表格,还安装了openpyxl库。
● 软件的设计分析
本软件的输入信息为学生的Python程序,输出信息为程序评分的结果,包括得分、程序运行时间、程序错误信息。
Python自带模块subprocess,它可以创建一个子进程,并运行一个外部的程序,正好可以用于测试学生程序。
学生程序的输入输出都是通过键盘和显示器,subprocess可以将输入输出定义到指定的文件,方便实现批量处理。
本软件采用黑箱测试法给学生程序评分。通过比对学生程序的输出和教师程序的输出是否相同,来确定学生程序的得分。
● 软件的主要代码
1.获取配置文件信息
评分软件的文件夹programJudge和学生文件夹在同一目录。
评分软件的配置文件为programJudge.js,内容如图2所示。
学生程序名应根据实际的要求改为相应的Python程序名。
timeout的值是学生程序最长运行时间,本软件设置为3秒。
class的值是若干个班级的编号。
将配置文件读入到字典d中,只需一行代码,如图3所示。
2.获取测试数据
测试数据和教师标准程序所在文件夹:programJudge/学生程序名/。
输入文件为:0.in, 1.in, … 由教师自己手工生成。
标准答案为:0.ans, 1.ans, …由教师程序自动产生。
获取测试数据getNumOfTestFile()代码如图4所示。
该函数将根据顺序编号的输入文件数量返回测试数据数量,同时,根据教师程序生成标准答案,函数myCmd在后面会有说明。
3.新建工作簿
新建工作簿是为了收集学生程序的评分信息,代码如图5所示。
4.枚举学生文件
枚举学号studID,如果studID的前缀和班级一致,处理该学号(如上页图6)。其中,n为测试数据数量。
5.学生文件的评分
根据学号和程序名得到学生文件studFile,如果studFile不存在,得分score为-1,如果存在,分别用n组测试数据测试,如果学生程序的输出文件和标准答案文件相同,那么k自增1。n组数据测试完毕,k*100/n即为本程序的得分,如上页图7所示。
程序执行时间和错误信息要根据myCmd的返回值而定,代码如图8所示。
subprocess.run执行完毕后,若是学生程序超时,返回(0,'Timeout'),若是returncode为0,表示正常结束学生程序,返回(执行时间,),否则返回(0,'Error')。一般是学生程序中存在错误,可在文件testOut中获取错误信息,本软件只取错误信息的最后一行写入表格,方便教师了解学生程序中出现的错误种类。
ws为新建的工作簿的活动工作表,ws.append可以将一个元组作为行写入工作表中,最终形成所有学生程序评分的一张表格,如图9所示。
其中,score为-1表示学生程序文件不存在;time单位为ms;error为TimeOut一般是学生程序出现死循环或者算法没有优化;其他错误与Thonny中运行Python程序的错误提示信息是一样的。
● 结论
本文从一线教师的实际需求出发,通过黑箱测试法给学生程序自动评分,利用Python的subprocess模块,获取学生程序执行的其他信息,如执行时间、错误提示信息等,最终得到一张学生程序评分的表格。这样可以让教师及时掌握学生的学习情况,学生也能获得及时的反馈,有利于更好地学习编程。
参考文献:
[1]Python3.7. Using the subprocess Module [OL].2020.
[2]Eric Gazoni,Charlie Clark. openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files [OL]. 2020.
作者简介:王晓华(1973—),男,江苏无锡人,教育硕士,中学高级,无锡市第一中学信息技术教师。
基金项目:本文是江苏省教育科学“十三五”规划2020年度普教立项课题“基于计算思维的高中生設计与智造项目化实践研究”阶段性成果,课题批准文号:D/2020/02/283;2019年江苏省基础教育前瞻性教学改革实验项目“设计与智造:统整理念下高中生学习方式的变革”阶段性成果。