CN117331836A - 一种基于代码语法树分析的评测方法 - Google Patents
一种基于代码语法树分析的评测方法 Download PDFInfo
- Publication number
- CN117331836A CN117331836A CN202311331646.3A CN202311331646A CN117331836A CN 117331836 A CN117331836 A CN 117331836A CN 202311331646 A CN202311331646 A CN 202311331646A CN 117331836 A CN117331836 A CN 117331836A
- Authority
- CN
- China
- Prior art keywords
- code
- score
- test
- analysis
- codes
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000004458 analytical method Methods 0.000 title claims abstract description 95
- 238000011156 evaluation Methods 0.000 title claims abstract description 77
- 238000012360 testing method Methods 0.000 claims abstract description 215
- 230000003068 static effect Effects 0.000 claims abstract description 40
- 238000000034 method Methods 0.000 claims abstract description 24
- 238000010801 machine learning Methods 0.000 claims abstract description 14
- 238000012549 training Methods 0.000 claims abstract description 9
- 230000006870 function Effects 0.000 claims description 38
- 230000014509 gene expression Effects 0.000 claims description 28
- 230000007547 defect Effects 0.000 claims description 7
- 238000013528 artificial neural network Methods 0.000 claims description 6
- 238000004364 calculation method Methods 0.000 claims description 4
- 238000000605 extraction Methods 0.000 claims description 3
- 238000007781 pre-processing Methods 0.000 claims description 3
- 230000008569 process Effects 0.000 description 7
- 238000001514 detection method Methods 0.000 description 6
- 230000000694 effects Effects 0.000 description 5
- 230000002159 abnormal effect Effects 0.000 description 3
- 230000006872 improvement Effects 0.000 description 3
- 230000006399 behavior Effects 0.000 description 2
- 230000007849 functional defect Effects 0.000 description 2
- 238000007689 inspection Methods 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 244000035744 Hura crepitans Species 0.000 description 1
- 230000005856 abnormality Effects 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000015572 biosynthetic process Effects 0.000 description 1
- 230000015556 catabolic process Effects 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 238000013499 data model Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000012854 evaluation process Methods 0.000 description 1
- 238000011835 investigation Methods 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000010606 normalization Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 238000003786 synthesis reaction Methods 0.000 description 1
- 238000010998 test method Methods 0.000 description 1
- 239000002699 waste material Substances 0.000 description 1
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明提出了一种基于代码语法树分析的评测方法,应用于服务器中,包括以下步骤:搭建代码测试服务集群,创建若干代码测试节点,并依次拉取消息队列中暂存的待测代码;预设测试用例,代码测试节点使用预设测试用例对待测代码进行用例测试,获取用例测试结果,并生成代码语法树;基于代码语法树对待测代码分别进行静态分析和动态分析测试,获取代码静态和动态测试结果;基于机器学习迭代训练评估推荐模型,将所有测试代码及测试结果输入评估推荐模型,获取相应代码综合评测得分及推荐学习方案,该方法将为编程学习者和开发者提供更高效、准确的评估和指导,促进编程能力的发展和软件开发水平的提升。
Description
技术领域
本发明涉及智慧教育技术领域,尤其涉及一种基于代码语法树分析的评测方法。
背景技术
在软件开发与技能测评领域,传统的代码审查和测试方法存在一些问题。代码审查通常是通过人工方式对代码进行逐行检查,这种方法耗时且容易出现遗漏;而测试方法通常需要编写测试用例并模拟各种情况进行测试,同样需要大量的时间和人力资源。
公开号为CN111176993A公开了一种基于抽象语法树的代码静态检测方法,对不同语言环境构建规则扩展模板;基于规则扩展模板的基类规则构建规则库;采用注册列表机制进行规则注册;将规则库嵌套到开源平台中;基于抽象语法树进行代码扫描与分析。
现有的代码测试方法通过借助语法树和静态工具相集成,对代码进行静态分析检测,即代码的语法对错及代码规范检测,但是该方法无法对代码进行动态分析检测,即代码的综合运行性能检测,导致不能评估代码的性能及稳定性,进而降低了代码的测试效果,并且,该方法也无法根据代码测试出现的缺陷进行综合评估和反馈,不能很好的有助于开发者编程业务能力的提升。
发明内容
有鉴于此,本发明提出了一种基于代码语法树分析的评测方法,通过用例、静态分析和动态分析测试代码,实现对代码功能性和整体性的评估,有助于发现潜在的逻辑错误或功能缺陷,提供更准确的评估结果,并且,根据缺陷制定相应的学习方法,有助于开发者编程能力的提升。
本发明的技术方案是这样实现的:本发明提供了一种基于代码语法树分析的评测方法,应用于服务器中,包括以下步骤:
S1、接收客户端提交的测试代码;
S2、对提交的测试代码预处理,并将待测代码推送至消息队列中暂存;
S3、搭建代码测试服务集群,创建若干代码测试节点,并依次拉取消息队列中暂存的待测代码;
S4、预设测试用例,代码测试节点使用预设测试用例对待测代码进行用例测试,获取用例测试结果,并生成代码语法树;
S5、基于代码语法树对待测代码分别进行静态分析和动态分析测试,获取代码静态和动态测试结果;
S6、基于机器学习迭代训练评估推荐模型,将所有测试代码及测试结果输入评估推荐模型,获取相应代码综合评测得分及推荐学习方案。
在以上技术方案的基础上,优选的,所述步骤S1中的接收客户端提交的测试代码,其中,用户在客户端提交测试代码,客户端将用户提交的代码信息通过HTTP请求方式发送给服务器。
在以上技术方案的基础上,优选的,所述步骤S4中的预设测试用例,代码测试节点使用预设测试用例对待测代码进行用例测试,获取用例测试结果,并生成代码语法树,包括以下子步骤:
S41,根据待测代码预设相应的多个测试用例;
S42,代码测试节点使用多个测试用例分别对待测代码进行用例测试;
S43,获取通过用例测试的测试用例数量。
在以上技术方案的基础上,优选的,所述步骤S5中的基于代码语法树对待测代码分别进行静态分析和动态分析测试,获取代码静态和动态测试结果,包括以下子步骤:
S51,基于代码语法树集成MyPy、Bandit和Pylint分析工具,对待测代码进行静态分析测试,用于测试代码的语法错误和代码的可读性指标,获取静态分析测试中的结果,其中,代码的可读性指标包括代码长度、代码复杂度、代码变量和函数、代码注释和代码行数;
S52,基于代码语法树集成Cprofile和Memory_Profiler分析工具,对待测代码进行动态分析测试,用于测试代码的运行时间和资源消耗,获取动态分析测试中的结果。
在以上技术方案的基础上,优选的,所述步骤S6中基于机器学习迭代训练评估推荐模型,将所有测试代码及测试结果输入评估推荐模型,获取相应代码综合评测得分,包括以下子步骤:
S61,根据用例测试结果,计算得到用例测试得分,表达式为:
T1_Score=x/n*100;
式中,T1_Score为用例测试得分,x为通过用例测试的测试用例数量,n为总的测试用例数量;
S62,根据静态分析测试结果,分别计算得到语法得分和可读性得分;
S63,根据动态分析测试结果,计算得到性能得分;
S64,对用例测试得分、语法得分、性能得分和可读性得分赋予相对应的权重,并计算获取综合评测得分,表达式为:
A_Score=T1_Score*w1+T2_Score*w2+T3_Score*w3+T4_Score*w4;
式中,A_Score为综合评测得分,w1为用例测试得分的权重,T2_Score为语法得分,w2为语法得分的权重,T3_Score为性能得分,w3为性能得分的权重,T4_Score为可读性得分,w4为可读性得分的权重,w1、w2、w3和w4的和为1。
在以上技术方案的基础上,优选的,所述步骤S62中的语法得分表达式为:
式中,g为代码出现的语法错误数量,且g为整数。
在以上技术方案的基础上,优选的,所述步骤S62中的可读性得分是根据静态分析测试中各项可读性指标综合计算所得,包括以下子步骤:
步骤S621,根据代码的长度,计算得到代码长度得分,表达式为:
L_Score=100-(Lx-Lmin)/(Lmax-Lmin)×100;
式中,L_Score为代码长度得分,Lx为代码长度,Lmin为最小代码长度,Lmax为最大代码长度;
步骤S622,根据代码的复杂度,计算得到代码复杂度得分,表达式为:
F_Score=100-(Fx-Fmin)/(Fmax-Fmin)×100;
式中,F_Score为代码复杂度得分,Fx为代码复杂度,Fmin为最小复杂度,Fmax为最大复杂度;
步骤S623,根据有意义的变量和函数名的数量,计算得到代码有意义的变量和函数名得分,表达式为:
N_Score=100-(Nx-Nmin)/(Nmax-Nmin)×100;
式中,N_Score为代码有意义的变量和函数名的得分,Nx为有意义的变量和函数名的数量,Nmin为最小有意义的变量和函数名的数量,Nmax为最大有意义的变量和函数名的数量;
步骤S624,根据注释数量和代码行数,计算得到代码注释数量得分,表达式为:
Z_Score=Zx/Cn×100;
式中,Z_Score为代码注释数量得分,Zx为注释数量,Cn为代码总行数;
步骤S625,将代码长度得分、代码复杂度得分、代码有意义的变量和函数名得分和代码注释数量得分赋予相对应的权重,并计算得到可读性得分,表达式为:
T4_Score=L_Score×W1+F_Score×W2+N_Score×W3+Z_Score×W4;
式中,W1为代码长度得分的权重,W2为代码复杂度得分的权重,W3为代码有意义的变量和函数名得分的权重,W4为代码注释数量得分的权重;其中,W1、W2、W3和W4的和为1。
在以上技术方案的基础上,优选的,所述步骤S63中的性能得分是根据动态分析测试中测试代码的运行时间和资源消耗计算所得,表达式为:
式中,t1是运行时间,t2是最佳运行时间;s1是资源消耗数,s2是最佳资源消耗数。
在以上技术方案的基础上,优选的,所述步骤S6中的基于机器学习迭代训练评估推荐模型,将所有测试代码及测试结果输入评估推荐模型,获取相应的推荐学习方案,其中,基于机器学习的推荐模型使用深度神经网络进行分析,将测试代码作为输入,通过多层神经网络对数据进行特征提取建模,并根据测试出的代码缺陷输出相应的推荐学习方案。
在以上技术方案的基础上,优选的,还包括步骤S7,将用例测试结果、代码静态、动态测试结果和综合评测得分以及推荐学习方案数据存储到数据库中,并同步发送回客户端窗口供用户查看。
本发明的基于代码语法树分析的评测方法相对于现有技术具有以下有益效果:
(1)通过将测试用例与代码语法树相融合,并集成静态分析工具和动态分析工具对代码进行多维度的测试,并借助机器学习迭代训练评估推荐模型对测试结果进行分析,并获取代码综合评测得分及推荐学习方案,该方法将为编程学习者和开发者提供更高效、准确的评估和指导,促进编程能力的发展和软件开发水平的提升;
(2)可以根据需求定义不同的评估因子,从而满足不同的评估需求,评估因子是用于评估和衡量目标对象或现象的重要指标或因素,可以是用来度量开发者在编程能力方面的不同方面或维度的要素;在编程教育中,评估因子设定可以用于评估学生的编程能力、学习效果和问题解决能力等方面的关键指标,可以根据不同的评估需求和教学目标,提供个性化的评估和指导,生成个性化的学习反馈和建议,帮助学生提高学习效果和编程能力;
(3)通过消息队列与搭建代码测试服务集群对提交的代码进行处理,实现多对多的数据请求交互,可以有效提高代码评测整个系统的吞吐量和性能,同时确保评测服务的稳定性和可靠性,这种设计允许根据需要调整系统资源,并根据负载情况快速响应用户的评测请求。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明的基于代码语法树分析的评测方法的流程图;
图2为本发明的基于代码语法树分析的评测方法的用例测试流程图;
图3为本发明的基于代码语法树分析的评测方法的代码综合评测得分流程图;
图4为本发明的基于代码语法树分析的评测方法的代码可读性得分流程图。
具体实施方式
下面将结合本发明实施方式,对本发明实施方式中的技术方案进行清楚、完整地描述,显然,所描述的实施方式仅仅是本发明一部分实施方式,而不是全部的实施方式。基于本发明中的实施方式,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施方式,都属于本发明保护的范围。
如图1-4所示,本发明的一种基于代码语法树分析的评测方法,应用于服务器中,包括以下步骤:
S1、接收客户端提交的测试代码;
其中,用户在客户端提交测试代码,客户端将用户提交的代码信息通过HTTP请求方式发送给服务器。
S2、对提交的测试代码预处理,并将待测代码推送至消息队列中暂存。
S3、搭建代码测试服务集群,创建若干代码测试节点,并依次拉取消息队列中暂存的待测代码。
需要说明的是,将测试代码封装成一个消息,并将消息发送到消息队列中进行缓存,消息队列可使用RabbitMQ技术,并且搭建代码测试服务集群,创建若干代码测试节点,每个测试节点依次拉取消息队列中暂存的待测代码,实现多对多的数据请求交互,可以有效提高代码评测整个系统的吞吐量和性能,同时确保评测服务的稳定性和可靠性,这种设计允许根据需要调整系统资源,并根据负载情况快速响应用户的评测请求。
S4、预设测试用例,代码测试节点使用预设测试用例对待测代码进行用例测试,获取用例测试结果,并生成代码语法树。
其中,包括以下子步骤:
S41,根据待测代码预设相应的多个测试用例;
S42,代码测试节点使用多个测试用例分别对待测代码进行用例测试;
S43,获取通过用例测试的测试用例数量。
需要说明的是,测试用例是根据具体的功能实现代码对应生成的,生成的测试用例要求需要考虑到特殊值、边界值、随机性,其中,特殊输入是尝试使用一些特殊值,这些值可能会导致程序的行为与典型情况不同,例如,对于数值计算,可以测试除以零、负数等可能导致异常的输入;边界情况是考虑输入值接近边界的情况,例如在整数范围内测试最小值、最大值等情况,以及字符串长度接近限制的情况;异常情况是测试程序是否能够正确处理各种异常情况,例如输入非法字符、文件不存在等,确保程序能够适当地捕获和处理这些异常,而不会导致崩溃或错误输出;随机性是为了测试这个程序是否具有良好的通用性,而不只是只能针对个别值能计算正确。
并且,本实施例中的代码语法树是基于Python的AST模块来生,其中,语法树的生成通常是编译器或解释器在处理源代码的过程中产生的,生成AST的过程可以分为以下几个步骤,词法分析:首先,编译器或解释器会对源代码进行词法分析,将源代码分解为一系列的标记(tokens),标记是源代码中的最小语法单位,如关键字、标识符、运算符、字面量等;语法分析:编译器或解释器会对标记进行语法分析,根据编程语言的语法规则将它们组合成更高层次的结构,如表达式、声明和控制结构等,语法分析的结果通常是一个由这些结构组成的代码语法树,构建AST:在语法分析过程中,编译器或解释器会创建AST的节点并逐步建立节点间的关系,每个节点代表一个语法结构,如函数定义、变量声明、赋值语句等;树的根节点通常表示整个源代码文件,而子节点表示具体的语法元素及其关系。
S5、基于代码语法树对待测代码分别进行静态分析和动态分析测试,获取代码静态和动态测试结果。
其中,包括以下子步骤:
S51,基于代码语法树集成MyPy、Bandit和Pylint分析工具,对待测代码进行静态分析测试,用于测试代码的语法错误和代码的可读性指标,获取静态分析测试中的结果,其中,代码的可读性指标包括代码长度、代码复杂度、代码变量和函数、代码注释和代码行数。
需要说明的是,MyPy用于检测Python代码中的类型错误,Bandit是一个专门用于检测Python代码中安全漏洞的工具,Pylint检测代码中的语法错误、命名规范、代码风格违规、未使用的变量、不良的代码实践等,进而基于代码语法树集成MyPy、Bandit和Pylint这些静态分析工具,可实现对代码进行静态分析测试。
S52,基于代码语法树集成Cprofile和Memory_Profiler分析工具,对待测代码进行动态分析测试,用于测试代码的运行时间和资源消耗,获取动态分析测试中的结果。
需要说明的是,动态代码分析测试代码执行过程中的运行信息,该运行信息包括运行时间、内存占用、资源消耗等指标,使用性能分析器Cprofile来分析代码的运行时间、函数调用次数以及各函数的耗时;使用内存分析工具Memory_Profiler检测代码中可能的内存泄漏、资源浪费和大内存占用的地方,以及识别造成内存使用增加的操作,进而基于代码语法树集成Cprofile和Memory_Profiler分析这些动态分析工具,可实现对代码进行静态分析测试。
并且,动态分析测试在沙箱中进行,其中在沙箱中使隔离代码的执行环境,确保代码的运行不会对系统造成危害。
本方法支持代码的静态分析和动态测试。对于静态分析,首先,系统会对提交的代码进行语法检查,以确保它遵循正确的编程语法,接着可以对代码进行格式检查,检查其是否符合约定的编码规范,最后,静态分析工具进行检测代码中的潜在问题,如未使用的变量、未处理的异常等。而动态测试平台会创建一个模拟的运行环境,该环境包括操作系统、运行时库、文件系统等,这个环境旨在模拟实际运行的条件,系统会提供一组测试用例,这些用例代表了不同的输入情况和场景,代码会针对这些测试用例进行执行,系统会监控代码的行为,包括输入输出、运行时间等,在执行过程中,系统会捕获代码可能出现的错误和异常,如崩溃、死锁、内存溢出等以及记录代码的执行时间和资源使用情况,以评估其性能,对代码的正确性、稳定性和安全性进行测试,有助于提升代码质量,在动态分析测试中,为了模拟不同类型的代码和运行场景,评测服务提供多种环境实例,用来针对满足模拟网络环境和多线程执行等环境要求,提高了评测的效率、质量和可靠性,实现对代码功能性、整体性的评估。有助于发现潜在的逻辑错误或功能缺陷,提供更准确的评估结果。
S6、基于机器学习迭代训练评估推荐模型,将所有测试代码及测试结果输入评估推荐模型,获取相应代码综合评测得分及推荐学习方案。
其中,获取代码综合评测得分,包括以下子步骤:
S61,根据用例测试结果,计算得到用例测试得分,表达式为:
T1_Score=x/n*100;
式中,T1_Score为用例测试得分,x为通过用例测试的测试用例数量,n为总的测试用例数量;
S62,根据静态分析测试结果,分别计算得到语法得分和可读性得分;
其中,语法得分通常是根据代码的语法规范性计算得到的,代码分析工具对代码进行分析,检查代码是否符合一些语法规范,例如是否使用了正确的变量类型,是否报错等,语法得分表达式为:
式中,g为代码出现的语法错误数量,且g为整数。
可以理解的是,该语法得分计算过程中,在预先还应判断代码是否可以跑通测试用例,如果不行则语法得分直接为0分,如果跑通了,但是静态分析代码时出现的错误类型在5个以内的,则按照公式计算,每一种错误扣10分,上限扣40分,最低为60及格分;如果出现的错误类型在超过并含5个的,则语法得分直接为0分。
本实施中的可读性测试是根据代码的可读性、清晰性和易理解性来评估的,这里面主要涉及代码的长度,代码的复杂度,有意义的变量名和函数名、注释的数量计算得到的,每个指标的在可读性得分中的得分占比不同。
其中,可读性得分是根据静态分析测试中各项可读性指标综合计算所得,包括以下子步骤:
步骤S621,根据代码的长度,计算得到代码长度得分,表达式为:
L_Score=100-(Lx-Lmin)/(Lmax-Lmin)×100;
式中,L_Score为代码长度得分,Lx为代码长度,Lmin为最小代码长度,Lmax为最大代码长度。
其中,最小代码长度和最大代码长度可以根据实际情况进行设定。
步骤S622,根据代码的复杂度,计算得到代码复杂度得分,表达式为:
F_Score=100-(Fx-Fmin)/(Fmax-Fmin)×100;
式中,F_Score为代码复杂度得分,Fx为代码复杂度,Fmin为最小复杂度,Fmax为最大复杂度。
其中,最小复杂度和最大复杂度可以根据实际情况进行设定。
步骤S623,根据有意义的变量和函数名的数量,计算得到代码有意义的变量和函数名得分,表达式为:
N_Score=100-(Nx-Nmin)/(Nmax-Nmin)×100;
式中,N_Score为代码有意义的变量和函数名的得分,Nx为有意义的变量和函数名的数量,Nmin为最小有意义的变量和函数名的数量,Nmax为最大有意义的变量和函数名的数量;
其中,最小有意义的变量和函数名的数量和最大有意义的变量和函数名的数量可以根据实际情况进行设定。
步骤S624,根据注释数量和代码行数,计算得到代码注释数量得分,表达式为:
Z_Score=Zx/Cn×100;
式中,Z_Score为代码注释数量得分,Zx为注释数量,Cn为代码总行数;
步骤S625,将代码长度得分、代码复杂度得分、代码有意义的变量和函数名得分和代码注释数量得分赋予相对应的权重,并计算得到可读性得分,表达式为:
T4_Score=L_Score×W1+F_Score×W2+N_Score×W3+Z_Score×W4;
式中,W1为代码长度得分的权重,W2为代码复杂度得分的权重,W3为代码有意义的变量和函数名得分的权重,W4为代码注释数量得分的权重;其中,W1、W2、W3和W4的和为1,并且W1、W2、W3和W4是根据实际情况进行调整的权重因子。
本实施例性能得分是根据代码的执行效率计算得到的。一种常用的方法是使用性能测试工具对代码进行测试,测量代码在不同负载下的执行时间和资源消耗。得分根据给定的执行时间和消耗资源的标准进行百分制打分。
S63,根据动态分析测试结果,计算得到性能得分;
其中,性能得分是根据动态分析测试中测试代码的运行时间和资源消耗计算所得,表达式为:
T3_Score=50*(1+(t1-t2)/(t2*√(t1/t2)))+50*(1+(s1-s2)/(s2*√(s1/s2)));
式中,t1是运行时间,t2是最佳运行时间;s1是资源消耗数,s2是最佳资源消耗数。
S64,对用例测试得分、语法得分、性能得分和可读性得分赋予相对应的权重,并计算获取综合评测得分,表达式为:
A_Score=T1_Score*w1+T2_Score*w2+T3_Score*w3+T4_Score*w4;
式中,A_Score为综合评测得分,w1为用例测试得分的权重,T2_Score为语法得分,w2为语法得分的权重,T3_Score为性能得分,w3为性能得分的权重,T4_Score为可读性得分,w4为可读性得分的权重,其中,w1、w2、w3和w4的和为1,并且w1、w2、w3和w4具体的权重和因素可能会根据评测需求和目标进行调整。
需要说明的是,可以根据需求定义不同的评估因子,从而满足不同的评估需求,评估因子是用于评估和衡量目标对象或现象的重要指标或因素,可以是用来度量开发者在编程能力方面的不同方面或维度的要素;在编程教育中,评估因子设定可以用于评估学生的编程能力、学习效果和问题解决能力等方面的关键指标,可以根据不同的评估需求和教学目标,提供个性化的评估和指导,生成个性化的学习反馈和建议,帮助学生提高学习效果和编程能力。
其中,基于机器学习的评估推荐模型使用深度神经网络进行分析,将测试代码作为输入,通过多层神经网络对数据进行特征提取建模,并根据测试出的代码缺陷输出相应的推荐学习方案。
需要说明的是,前期的评估推荐模型训练是先通过代码用时和代码能承担的测试范围以及代码长度,评判出哪些代码较好,如一段代码能跑1-1000的测试用例,另一个能跑-10000到10000的测试用例,则可判断出第二个代码更好,通过输入测试代码训练找出这些代码的共性,其中代码的大体结构,使用了多少自设函数,使用了多少和哪些第三方库和函数,将其训练好的模型与之进行比较。
可以理解的是,分析代码结构,将代码与大数据模型及优秀的代码相比,相比使用了过少或过多的自设函数,或使用了过于复杂的循环嵌套结构,使用了过少注释等的代码缺陷规范,则模型会根据缺陷规范推荐相关代码编写规范内容,供开发者学习,提升自身的编程业务能力。
本实施例中将测试用例与代码语法树相融合,并借助机器学习模型进行结果分析,使用这种方式,能够在尽可能短的时间对代码完成多维度的评测,提高了评测的效率和质量。同时,将测试用例与代码语法树相结合的评测方法,为代码的正确性提供了更全面的考察,该方式通过对编程语言的底层语法树进行深入分析,并借助自动评测的方式,我们能够迅速审查程序的正确性、效率以及可靠性,这种综合的技术手段使得我们能够全方位地发现程序中的问题,并通过机器学习模型精准地提供评测结果和建议,供开发者学习弥补知识的缺失。
本实施例还包括步骤S7,将用例测试结果、代码静态、动态测试结果和综合评测得分以及推荐学习方案数据存储到数据库中,并同步发送回客户端窗口供用户查看。
需要说明的是,用户后期可在数据库中对该数据进行查询,便于寻找记录。
实施例
本方案应用于学生编程教育领域中,学生用自己的账号登录系统平台,并在系统平台中获取相应的编程试题,学生根据题目要求编写相应的实现功能的代码,完成任务后点击提交代码按钮,此时代码提交到服务器中,服务器接收到提交的代码,并对代码进行预处理,封装成一个消息,并将消息发送到RabbitMQ中,然后代码测试服务集群里面的代码测试节点会从RabbitMQ中拉取待测代码并进行代码测试,依次进行用例测试、静态分析测试和动态分析测试,得到用例测试的结果、静态分析测试结果和动态分析测试结果,将所有测试结果以及代码输入到评估推荐模型中,计算获得综合评测得分,在评估过程中,依据预设的语法、逻辑、算法、知识点以及课程等标签,运用评估推荐模型对评估结果进行分析,了解学生哪些方面的知识存在缺陷,依据对应标签给出相关学习建议,这些建议内容涉及编程语法、算法、代码结构和适用的学习课程以填补知识的缺失,最终的测试结果被输出到对应的账户中,以便用户查看他们的代码表现,这个结果包括测试用例的通过或失败、综合评测得分和代码各个方面的详细分析以及学习方案推荐,该技术将为编程学习者和开发者提供更高效、准确的评估和指导,促进编程能力的发展和软件开发水平的提升。
以上所述仅为本发明的较佳实施方式而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种基于代码语法树分析的评测方法,应用于服务器中,其特征在于,包括以下步骤:
S1、接收客户端提交的测试代码;
S2、对提交的测试代码预处理,并将待测代码推送至消息队列中暂存;
S3、搭建代码测试服务集群,创建若干代码测试节点,并依次拉取消息队列中暂存的待测代码;
S4、预设测试用例,代码测试节点使用预设测试用例对待测代码进行用例测试,获取用例测试结果,并生成代码语法树;
S5、基于代码语法树对待测代码分别进行静态分析和动态分析测试,获取代码静态和动态测试结果;
S6、基于机器学习迭代训练评估推荐模型,将所有测试代码及测试结果输入评估推荐模型,获取相应代码综合评测得分及推荐学习方案。
2.如权利要求1所述的基于代码语法树分析的评测方法,其特征在于:所述步骤S1中的接收客户端提交的测试代码,其中,用户在客户端提交测试代码,客户端将用户提交的代码信息通过HTTP请求方式发送给服务器。
3.如权利要求1所述的基于代码语法树分析的评测方法,其特征在于:所述步骤S4中的预设测试用例,代码测试节点使用预设测试用例对待测代码进行用例测试,获取用例测试结果,并生成代码语法树,包括以下子步骤:
S41,根据待测代码预设相应的多个测试用例;
S42,代码测试节点使用多个测试用例分别对待测代码进行用例测试;
S43,获取通过用例测试的测试用例数量。
4.如权利要求3所述的基于代码语法树分析的评测方法,其特征在于:所述步骤S5中的基于代码语法树对待测代码分别进行静态分析和动态分析测试,获取代码静态和动态测试结果,包括以下子步骤:
S51,基于代码语法树集成MyPy、Bandit和Pylint分析工具,对待测代码进行静态分析测试,用于测试代码的语法错误和代码的可读性指标,获取静态分析测试中的结果,其中,代码的可读性指标包括代码长度、代码复杂度、代码变量和函数、代码注释和代码行数;
S52,基于代码语法树集成Cprofile和Memory_Profiler分析工具,对待测代码进行动态分析测试,用于测试代码的运行时间和资源消耗,获取动态分析测试中的结果。
5.如权利要求4所述的基于代码语法树分析的评测方法,其特征在于:所述步骤S6中基于机器学习迭代训练评估推荐模型,将所有测试代码及测试结果输入评估推荐模型,获取相应代码综合评测得分,包括以下子步骤:
S61,根据用例测试结果,计算得到用例测试得分,表达式为:
T1_Score=x/n*100;
式中,T1_Score为用例测试得分,x为通过用例测试的测试用例数量,n为总的测试用例数量;
S62,根据静态分析测试结果,分别计算得到语法得分和可读性得分;
S63,根据动态分析测试结果,计算得到性能得分;
S64,对用例测试得分、语法得分、性能得分和可读性得分赋予相对应的权重,并计算获取综合评测得分,表达式为:
A_Score=T1_Score*w1+T2_Score*w2+T3_Score*w3+T4_Score*w4;
式中,A_Score为综合评测得分,w1为用例测试得分的权重,T2_Score为语法得分,w2为语法得分的权重,T3_Score为性能得分,w3为性能得分的权重,T4_Score为可读性得分,w4为可读性得分的权重,w1、w2、w3和w4的和为1。
6.如权利要求5所述的基于代码语法树分析的评测方法,其特征在于:所述步骤S62中的语法得分表达式为:
式中,g为代码出现的语法错误数量,且g为整数。
7.如权利要求5所述的基于代码语法树分析的评测方法,其特征在于:所述步骤S62中的可读性得分是根据静态分析测试中各项可读性指标综合计算所得,包括以下子步骤:
步骤S621,根据代码的长度,计算得到代码长度得分,表达式为:
L_Score=100-(Lx-Lmin)/(Lmax-Lmin)×100;
式中,L_Score为代码长度得分,Lx为代码长度,Lmin为最小代码长度,Lmax为最大代码长度;
步骤S622,根据代码的复杂度,计算得到代码复杂度得分,表达式为:
F_Score=100-(Fx-Fmin)/(Fmax-Fmin)×100;
式中,F_Score为代码复杂度得分,Fx为代码复杂度,Fmin为最小复杂度,Fmax为最大复杂度;
步骤S623,根据有意义的变量和函数名的数量,计算得到代码有意义的变量和函数名得分,表达式为:
N_Score=100-(Nx-Nmin)/(Nmax-Nmin)×100;
式中,N_Score为代码有意义的变量和函数名的得分,Nx为有意义的变量和函数名的数量,Nmin为最小有意义的变量和函数名的数量,Nmax为最大有意义的变量和函数名的数量;
步骤S624,根据注释数量和代码行数,计算得到代码注释数量得分,表达式为:
Z_Score=Zx/Cn×100;
式中,Z_Score为代码注释数量得分,Zx为注释数量,Cn为代码总行数;
步骤S625,将代码长度得分、代码复杂度得分、代码有意义的变量和函数名得分和代码注释数量得分赋予相对应的权重,并计算得到可读性得分,表达式为:
T4_Score=L_Score×W1+F_Score×W2+N_Score×W3+Z_Score×W4;
式中,W1为代码长度得分的权重,W2为代码复杂度得分的权重,W3为代码有意义的变量和函数名得分的权重,W4为代码注释数量得分的权重;其中,W1、W2、W3和W4的和为1。
8.如权利要求5所述的基于代码语法树分析的评测方法,其特征在于:所述步骤S63中的性能得分是根据动态分析测试中测试代码的运行时间和资源消耗计算所得,表达式为:
式中,t1是运行时间,t2是最佳运行时间;s1是资源消耗数,s2是最佳资源消耗数。
9.如权利要求1所述的基于代码语法树分析的评测方法,其特征在于:所述步骤S6中的基于机器学习迭代训练评估推荐模型,将所有测试代码及测试结果输入评估推荐模型,获取相应的推荐学习方案,其中,基于机器学习的推荐模型使用深度神经网络进行分析,将测试代码数据作为输入,通过多层神经网络对数据进行特征提取建模,并根据测试出的代码缺陷输出相应的推荐学习方案。
10.如权利要求9所述的基于代码语法树分析的评测方法,其特征在于:还包括步骤S7,将用例测试结果、代码静态、动态测试结果和综合评测得分以及推荐学习方案数据存储到数据库中,并同步发送回客户端窗口供用户查看。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311331646.3A CN117331836A (zh) | 2023-10-16 | 2023-10-16 | 一种基于代码语法树分析的评测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311331646.3A CN117331836A (zh) | 2023-10-16 | 2023-10-16 | 一种基于代码语法树分析的评测方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117331836A true CN117331836A (zh) | 2024-01-02 |
Family
ID=89278936
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311331646.3A Pending CN117331836A (zh) | 2023-10-16 | 2023-10-16 | 一种基于代码语法树分析的评测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117331836A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117827684A (zh) * | 2024-03-05 | 2024-04-05 | 数翊科技(北京)有限公司武汉分公司 | 数据计算作业的预警方法、装置、电子设备及存储介质 |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107302475A (zh) * | 2017-07-06 | 2017-10-27 | 郑州云海信息技术有限公司 | 一种面向分布式存储集群的测试方法及装置 |
CN107688526A (zh) * | 2017-08-25 | 2018-02-13 | 上海壹账通金融科技有限公司 | 应用程序的性能测试方法、装置、计算机设备和存储介质 |
CN110765014A (zh) * | 2019-10-22 | 2020-02-07 | 北京理工大学 | 一种Python绘图程序题自动评测方法 |
CN112035337A (zh) * | 2020-05-29 | 2020-12-04 | 广州番禺职业技术学院 | 一种软件开发能力与测试能力分析方法及装置 |
US20210056211A1 (en) * | 2019-08-23 | 2021-02-25 | Praetorian | System and method for automatically detecting a security vulnerability in a source code using a machine learning model |
CN112596731A (zh) * | 2020-12-29 | 2021-04-02 | 中国科学技术大学 | 一种融合智能教育的编程教学系统及方法 |
CN113761444A (zh) * | 2021-09-08 | 2021-12-07 | 未鲲(上海)科技服务有限公司 | 基于代码评分的教程推荐方法、教程推荐装置及终端设备 |
CN114968788A (zh) * | 2022-05-27 | 2022-08-30 | 浙江大学 | 人工智能算法编程能力自动评估方法、装置、介质及设备 |
CN115268860A (zh) * | 2022-06-21 | 2022-11-01 | 北京浩泰思特科技有限公司 | 一种智能教学诊断方法及系统 |
CN115454841A (zh) * | 2022-09-02 | 2022-12-09 | 安徽中科国创高可信软件有限公司 | 基于程序测试和分析的多维度代码质量综合评价方法及系统 |
CN116797052A (zh) * | 2023-08-25 | 2023-09-22 | 之江实验室 | 基于编程学习的资源推荐方法、装置、系统和存储介质 |
-
2023
- 2023-10-16 CN CN202311331646.3A patent/CN117331836A/zh active Pending
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107302475A (zh) * | 2017-07-06 | 2017-10-27 | 郑州云海信息技术有限公司 | 一种面向分布式存储集群的测试方法及装置 |
CN107688526A (zh) * | 2017-08-25 | 2018-02-13 | 上海壹账通金融科技有限公司 | 应用程序的性能测试方法、装置、计算机设备和存储介质 |
US20210056211A1 (en) * | 2019-08-23 | 2021-02-25 | Praetorian | System and method for automatically detecting a security vulnerability in a source code using a machine learning model |
CN110765014A (zh) * | 2019-10-22 | 2020-02-07 | 北京理工大学 | 一种Python绘图程序题自动评测方法 |
CN112035337A (zh) * | 2020-05-29 | 2020-12-04 | 广州番禺职业技术学院 | 一种软件开发能力与测试能力分析方法及装置 |
CN112596731A (zh) * | 2020-12-29 | 2021-04-02 | 中国科学技术大学 | 一种融合智能教育的编程教学系统及方法 |
CN113761444A (zh) * | 2021-09-08 | 2021-12-07 | 未鲲(上海)科技服务有限公司 | 基于代码评分的教程推荐方法、教程推荐装置及终端设备 |
CN114968788A (zh) * | 2022-05-27 | 2022-08-30 | 浙江大学 | 人工智能算法编程能力自动评估方法、装置、介质及设备 |
CN115268860A (zh) * | 2022-06-21 | 2022-11-01 | 北京浩泰思特科技有限公司 | 一种智能教学诊断方法及系统 |
CN115454841A (zh) * | 2022-09-02 | 2022-12-09 | 安徽中科国创高可信软件有限公司 | 基于程序测试和分析的多维度代码质量综合评价方法及系统 |
CN116797052A (zh) * | 2023-08-25 | 2023-09-22 | 之江实验室 | 基于编程学习的资源推荐方法、装置、系统和存储介质 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117827684A (zh) * | 2024-03-05 | 2024-04-05 | 数翊科技(北京)有限公司武汉分公司 | 数据计算作业的预警方法、装置、电子设备及存储介质 |
CN117827684B (zh) * | 2024-03-05 | 2024-05-24 | 数翊科技(北京)有限公司武汉分公司 | 数据计算作业的预警方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Ullah et al. | The effect of automatic assessment on novice programming: Strengths and limitations of existing systems | |
US8875110B2 (en) | Code inspection executing system for performing a code inspection of ABAP source codes | |
US6058493A (en) | Logging and reproduction of automated test operations for computing systems | |
US10747641B2 (en) | System and method for cause point analysis for effective handling of static analysis alarms | |
CN117331836A (zh) | 一种基于代码语法树分析的评测方法 | |
WO2014207644A2 (en) | Method and system for grading a computer program | |
CN115687115A (zh) | 一种移动应用程序自动化测试方法及系统 | |
Binamungu et al. | Detecting duplicate examples in behaviour driven development specifications | |
Nabil et al. | Evalseer: an intelligent gamified system for programming assignments assessment | |
Venkatesh et al. | Enhancing comprehension and navigation in Jupyter notebooks with static analysis | |
Wrenn et al. | Using relational problems to teach property-based testing | |
Zougari et al. | Hybrid assessment method for programming assignments | |
Braught et al. | Core empirical concepts and skills for computer science | |
Hoq et al. | Detecting chatgpt-generated code in a cs1 course | |
Yoshizawa et al. | Logic error detection system based on structure pattern and error degree | |
de Campos et al. | Plagiarism detection based on blinded logical test automation results and detection of textual similarity between source codes | |
CN115830419A (zh) | 一种数据驱动式人工智能技术评测系统及方法 | |
Abd Rahman et al. | The design of an automated c programming assessment using pseudo-code comparison technique | |
CN115454841A (zh) | 基于程序测试和分析的多维度代码质量综合评价方法及系统 | |
Sakamoto et al. | POGen: A test code generator based on template variable coverage in gray-box integration testing for web applications | |
Hays et al. | Validation of software testing experiments: A meta-analysis of icst 2013 | |
Grilo | A case study of Reengineering of the CCCExplorer Tool | |
Faria et al. | Case studies of development of verified programs with Dafny for accessibility assessment | |
CN117216220B (zh) | 一种大语言模型的使用方法及装置 | |
Pelánek et al. | Towards design-loop adaptivity: identifying items for revision |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
CB02 | Change of applicant information |
Country or region after: China Address after: Unit 202, 3rd Floor, Building 9, West District, No. 9 Linglong Road, Haidian District, Beijing, 100000 RMB Applicant after: Zhongjiao Changxiang Technology Co.,Ltd. Address before: No. 55, Building 119, No. 12 Zhongguancun South Street, Haidian District, Beijing, 100000 Applicant before: Chinese Education Changxiang (Beijing) Technology Co.,Ltd. Country or region before: China |
|
CB02 | Change of applicant information |