CN110543331B - 一种基于测试代码片段相似性的测试程序抄袭检测方法 - Google Patents

一种基于测试代码片段相似性的测试程序抄袭检测方法 Download PDF

Info

Publication number
CN110543331B
CN110543331B CN201810561223.3A CN201810561223A CN110543331B CN 110543331 B CN110543331 B CN 110543331B CN 201810561223 A CN201810561223 A CN 201810561223A CN 110543331 B CN110543331 B CN 110543331B
Authority
CN
China
Prior art keywords
test
tested
similarity
program
executing
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.)
Active
Application number
CN201810561223.3A
Other languages
English (en)
Other versions
CN110543331A (zh
Inventor
陈振宇
孙伟松
王兴亚
段定
巫浩然
赵源
孙泽嵩
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Original Assignee
Nanjing University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Nanjing University filed Critical Nanjing University
Priority to CN201810561223.3A priority Critical patent/CN110543331B/zh
Publication of CN110543331A publication Critical patent/CN110543331A/zh
Application granted granted Critical
Publication of CN110543331B publication Critical patent/CN110543331B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • G06F8/751Code clone detection

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明涉及一种基于测试代码片段相似性的测试程序抄袭检测方法。该方法针对待测试程序中各个待测方法,首先,基于类名、方法名、参数序列计算出唯一方法标识;其次,从测试程序中提取所有测试代码片段集合,每个测试片段与一个待测方法相对应;然后,分析测试片段间相似性得到相似性分析报告,由此计算出片段之间的相似度值;最后,利用测试片段相似度值计算测试程序整体相似程度值,利用测试程序整体相似程度值即可更加精确的判断测试程序之间抄袭情况。本发明目的在于填补针对测试代码相似性检测技术的空白,解决目前测试代码相似性分析的低精度和测试代码抄袭检测主要靠人工操作的低效率问题,从而提高测试代码相似性检测的效率和精度。

Description

一种基于测试代码片段相似性的测试程序抄袭检测方法
技术领域
本发明属于软件测试与代码相似度检测领域,尤其适用于软件测试代码抄袭检测领域,解决了软件测试竞赛中开发者测试选手提交的测试代码之间存在抄袭难以检测的问题。通过更加精准地检测出测试代码片段的相似程度,以判断测试程序之间整体抄袭成程度,免去耗时耗力的人工检测操作,提高测试代码抄袭检测的效率与精度。
背景技术
拷贝和粘贴源代码是软件工程中常见的活动。代码的拷贝和粘贴既存在有益的地方,也存在有害的地方。一方面,软件复用可以快速的提高编码效率,这是大多数软件开发者认同的观点。因此,在软件开发过程中也就会使用代码的拷贝和粘贴,然后做适当的修改即可。另一方面,代码的拷贝和粘贴、以及随后的或多或少的修改,增加了软件抄袭检测的难度。因此,给软件版权的保护也带来了巨大的难度。代码相似性度量是检测代码抄袭的常用方法,在诸如程序理解、代码克隆、抄袭检测、代码复用领域具有广泛的应用。通常情况下研发人员不会按原样直接复制粘贴代码,而是会出于不同的目的进行修改,例如重构、Bug修复,甚至软件抄袭。这些修改在一定程度上会影响代码相似度分析器的性能,影响代码克隆、抄袭检查器工具的分析准确率。
在软件开发过程中,软件质量主要通过单元测试、集成测试、系统测试等软件测试阶段保障。众所周知,错误发现越晚软件的修复成本越高。因此,作为测试早期的单元测试对软件测试以及软件研发的整体成本有着重要的影响。不同于其他阶段的测试,单元测试属于编程的一部分,通常由软件测试人员、开发人员以及产品经理三方协作完成,这显著增加了单元测试的难度。编写单元测试用例代码是一个乏味、耗时的工作。因此,开发人员在编写单元测试用例代码的过程中也会大量的拷贝和粘贴代码,并进行简单的修改,以提高编写效率。如果能提高测试用例代码相似度的检测能力,既可以帮助一些自动化测试用例生成工具快速生成相似测试用例,也可以帮助测试代码抄袭检测工具更高效、更精准的判断抄袭,减少了测试代码抄袭检测的人力、物力投入。
目前,针对源代码相似性度量方法,学术界和工业界已有了较为成熟的研究和应用,有大量的克隆检测器、抄袭检测器和代码相似度检测器(如,NiCad、CoP、Simian)被许多企业、高校广泛采用。然而,这些方法和工具都是针对源代码进行相似度检测,并没有专门的方法或工具用于测试用例代码相似性检测。单元测试用例之间是没有依赖的,而源码中的方法之间是有依赖的,这是最明显的区别之一。测试用例之间的独立性,使得测试用例代码抄袭比源码抄袭更难检测。这个问题显著增加了测试代码相似性检测的难度。
对此,本发明提出一种基于测试代码片段相似性的测试程序抄袭检测方法。本发明的基本思想为:以待测方法为核心,最小化与待测方法相对应的测试代码片段,通过分析每个待测方法对应的测试代码片段的相似性,来判断不同参赛者提交的测试代码的相似性,提升测试代码相似性检测的精度,从而提高抄袭检测判断的准确率。对此,针对待测试程序源码中的每一个待测方法MUT,首先,计算出待测方法的唯一标识MID,通过MID找出每位选手提交的测试代码中与MUT相关的测试代码片段;然后,使用Text-based、Token-based或是String matching based相似性分析技术度量测试代码片段的相似性,并给出相似性分析报告;最后,通过分析相似性分析报告计选手测试程序之间的相似度来判断抄袭,从而提高抄袭检测的准确率。
通过该方法,可以更加精准地检测出测试程序代码的相似程度。除此之外,还可以帮助软件测试大赛评分组织快速的检测参赛选手之间的作弊抄袭行为,不仅减轻了人工检测抄袭的工作,而且提高了抄袭检测的效率和精度。
发明内容
本发明通过提供一种基于测试代码片段相似性的测试程序抄袭检测方法,来提高测试程序代码相似性检测的精度,填补了针对测试代码相似性检测技术的空白;用于解决检测软件测试竞赛选手作弊抄袭难以检测的问题,帮助测试大赛组织方减轻人工检测作弊抄袭的工作量,也提高了作弊检测的效率,保证软件测试竞赛更加公平。
为达成上述目标,本发明提出一种基于测试代码片段相似性的测试程序抄袭检测方法。该方法通过使用静态扫描分析技术,从待测试的程序中提取出所有待测试方法集合MUTS(Method Under Test set);然后,通过静态分析和自然语言处理NLP技术提取参赛选手所提交的测试代码中的测试片段集合TFS(Test Fragment Set);基于MUTS和TFS,使用Text-based、Token-based或是String matching based相似性分析技术来分析不同测试片段之间的相似性并生成相似性分析报告;最后,通过分析相似性分析报告计算测试代码片段的相似度,从而判断抄袭行为,提高作弊抄袭检测的效率与精准率。具体而言,该方法包含下列步骤:
1)待测程序分析。给定待测试项目源程序PUT(Program Under Test);首先,通过静态分析技术依次分析PUT中待测试文件FUT(File Under Test)、待测试类CUT(ClassUnder Test)、待测试方法MUT(Method Under Test),从中提取出待测试类的名称CN(ClassName)、待测试方法的名称MN(Method Name)和待测试方法的参数序列ARGS(Arguments);然后,将CN、MN、ARGS进行字符串拼接并计算出拼接字符串的Hash值作为每个待测试方法的唯一标识MID(Method ID);最后,用二元组<MID,MUT>表示一个待测试的方法,构建出所有待测试方法的集合MUT_ALL。
2)测试程序分析。给定所有选手提交的测试程序集合TPS(Test Program Set)和步骤1)获得的所有待测试方法的集合MUT_ALL;首先,通过静态分析技术依次分析每个TP中的测试文件TFile(Test File)、测试类TClass(Test Class)、测试用例TCase(Test Case),从中提取出所有调用的方法集合IMS(Invoke Method Set),每个IM由三个部分构成:MN、ARGS、OBJ,分别表示IM的名称、参数序列和调用该方法的对象;其次,基于MN、ARGS、OBJ计算出Hash值作为该IM的唯一标识MID,从选手提交的代码中提取测试代码片段;最后,判断每个IM的MID是否存在于集合MUT_ALL中,如果是则从TFile中提取出所有与IM相关的代码语句组成测试片段集合TFS,否则判断IM不是待测的方法。用二元组<CID,TFS>表示选手的测试片段集合,其中CID(Contestant ID)表示选手的编号,从而构建所有选手的测试片段集合TFS_ALL。
3)测试代码片段分类。给定步骤1)获得的所有待测试方法的集合MUT_ALL和步骤2)获得的测试片段集合TFS_ALL;以MUT_ALL中所有待测方法为分类的类别选项,将TFS_ALL中所有测试片段分类,从而得到每个MUT被哪些选手的哪些测试片段测试,用三元组<MID,CID,TF>表示,从而构建出所有MUT的测试片段分类集合M_TFS,方便后续针对测试片段的相似性分析。
4)测试代码片段相似性分析。给定步骤3)获得的所有MUT的测试片段分类集合M_TFS;遍历分析M_TFS中每一个类别mTFS=<MID,C_TFS>,其中C_TFS表示所有测试了编号为MID方法的测试片段集合,C_TFS的每个元素为<CID,TF>二元组,每次取C_TFS中两个选手的TF进行对比,使用Text-based、Token-based或是String matching based相似性分析技术得到两个TF的相似性分析报告SimReport;然后,分析所有SimReports计算出不同相似片段间相似度值SimValue,用三元组CSim=(CID1,CID2,SimValue)表示不同片段之间度相似值,其中CID1、CID2表示不同选手的ID,从而构成所有测试片段之间相似度值的集合CSim_ALL;用二元组mSim=<MID,CSim_ALL>表示方法MID的所有选手之间的相似度值集合,最终构建出所有方法的测试片段相似度值集合MSimS。
5)测试代码整体相似性分析。给定选手测试方法集合C_MIDS和步骤4)得到的相似度值集合MSimS,C_MIDS是所有选手测试的方法集合的集合,C_MIDS集合中每个元素cMIDS表示一个选手测试的方法集合;遍历分析C_MIDS,每次取出两位选手测试方法集合,用Ci:{m1,m2,m3…}和Cj:{m1,m2,m3…}表示,其中m1,m2,m3…表示选手测试的方法;首先,计算Ci和Cj的测试代码整体相似值权重W=Weight(Ci,Cj),计算公式如下:
Figure GSB0000193598570000041
其中,SimMCount表示Ci和Cj的测试代码中相似的测试片段数量,Ci.MCount和Cj.MCount分别表示Ci和Cj测试的方法数量,Max{Ci.MCount,Cj.MCount}表示取二者之间的最大值。然后,遍历分析MSimS中所有子集mSim的CSim_ALL,查找出所有满足如下条件的CSim元素SimValue的集合SVS:
Ci.CID==CSim.CID1&&Cj.CID==CSim.CID2
或者:Ci.CID==CSim.CID2&&Cj.CID==CSim.CID1
最后,基于集合SVS计算出选手Ci和Cj的测试代码整体相似度值S=Sim(Ci,Cj),计算公式如下:
Figure GSB0000193598570000042
其中,W是公式1由公式(1)计算得到,|SVS|表示集合SVS的大小。
通过上述过程可以计算出所有选手之间的测试程序TP的相似度值Sim_ALL。
6)测试程序抄袭判断。给定步骤5)得到的所有选手之间的测试程序相似度值Sim_ALL和抄袭判断域值T;遍历集合Sim_ALL中每个元素<Ci,Cj,S>,如果相似度值S大于给定的域值T,则判断选手Ci和Cj的测试程序之间存在抄袭。
进一步,其中上述步骤1)的具体步骤如下:
步骤1)-1:起始状态;
步骤1)-2:输入待测试程序源代码PUT=<PN,FUTS>,其中PN表示程序名称,FUTS是待测程序中所有待测文件集合;
步骤1)-3:初始化集合MUT_ALL为空;
步骤1)-4:判断集合FUTS是否为空,如果是则执行步骤1)-13,否则执行步骤1)-5;
步骤1)-5:从FUTS中取出一个待测试文件FUT=<FN,CUTS>,其中FN表示文件的名称,CUTS是文件中所有待测类的集合;
步骤1)-6:从CUTS中取出一个待测试类CUT=<CN,MUTS>,其中CN表示类的名称,MUTS
是类中所有待测方法的集合;
步骤1)-7:从MUTS中取出一个待测试方法MUT=<MN,ARGS>,其中MN表示方法的名称,
ARGS表示方法的参数类型序列;
步骤1)-8:基于CN和MUT计算待测方法的唯一标识MID,将CN、MN和ARGS字符串拼接后计算Hash值,用公式表示为:MID=Hash(Append(CN+MN+ARGS));
步骤1)-9:将<MID,MUT>添加到集合MUT_ALL中;
步骤1)-10:判断MUTS中所有MUT是否遍历完毕,若是则执行步骤1)-11,否则执行步骤1)-7;
步骤1)-11:判断CUTS中所有CUT是否遍历完毕,若是则执行步骤1)-12,否则执行步骤1)-6;
步骤1)-12:判断FUTS中所有FUT是否遍历完毕,若是则执行步骤1)-13,否则执行步骤1)-5;
步骤1)-13:输出集合MUT_ALL;
步骤1)-14:结束状态。
进一步,其中上述步骤2)的具体步骤如下:
步骤2)-1:起始状态;
步骤2)-2:输入选手提交的测试程序TPS以及步骤1)得到的MUT_ALL;
步骤2)-3:初始化所有选手的测试片段集合TFS_ALL为空;
步骤2)-4:判断TPS(Test Program Set)中待分析测试程序数量是否大于0,如果是则执行步骤2)-5,否则执行步骤2)-23;
步骤2)-5:从TPS取出一个测试程序TP=<CID,PN,TFileS>,其中CID表示选手ID,PN表示测试程序到名称,TFileS(Test File Set)表示测试文件集合;
步骤2)-6:初始化TP的测试片段集合TFS为空;
步骤2)-7:判断TP中待分析测试文件数量是否大于0,如果是则执行步骤2)-8,否则执行步骤2)-23;
步骤2)-8:从TFiieS中取出一个测试文件TFile=<FN,TClassS>,其中FN表示测试文件名称,TClassS(Test Class Set)表示测试类集合;
步骤2)-9:从TClassS中取出一个测试类TClass=<CN,TCaseS>,其中CN表示测试类名称,TCaseS(Test Case Set)表示测试用例集合;
步骤2)-10:从TCaseS中取出一个测试用例TCase=<CaseN,IMS>,其中CaseN表示测试用例名称,IMS(Invoke Method Set)表示调用方法集合;
步骤2)-11:从IMS中取出一个调用方法IM=<MN,ARCS,OBJ>,其中MN表示被调用方法的名称,ARGS表示方法调用时传递的参数序列,OBJ表示调用该方法的实例名称或者静态类的名称;
步骤2)-12:在TFile中查找OBJ所属类的名称TCN(Test Class Name);
步骤2)-13:计算被调用方法的唯一ID,用公式表示为:
ID=Hash(Append(TCN+MN+ARGS));
步骤2)-14:判断ID是否存在于MUT_ALL的MID集合中,如果是则执行步骤2)-15,否则执行步骤2)-17;
步骤2)-15:再次扫描TestFile,在TestFile提取出所有与IM有关的语句,构成测试片段TF。
步骤2)-16:将<ID,TF>添加到集合TFS;
步骤2)-17:判断IMS中IM是否遍历完毕,如果是则执行步骤2)-18,否则执行步骤2)-11;
步骤2)-18:判断TCaseS中TCase是否遍历完毕,如果是则执行步骤2)-19,否则执行步骤2)-10;
步骤2)-19:判断TClassS中TClass是否遍历完毕,如果是则执行步骤2)-20,否则执行2)-9;
步骤2)-20:判断TFileS中TFile是否遍历完毕,如果是则执行步骤2)-21,否则执行步骤2)-8;
步骤2)-21:将<CFD,TFS>添加到集合TFS_ALL中;
步骤2)-22:判断TPS中TP是否遍历分析完毕,如果是则执行步骤2)-23,否则执行步骤2)-5;
步骤2)-23:输出集合TFS_ALL;
步骤2)-24:结束状态。
进一步,其中上述步骤3)的具体步骤如下:
步骤3)-1:起始状态;
步骤3)-2:输入步骤1)得到的MUT_ALL和步骤2)得到的TFS_ALL;
步骤3)-3:初始化所有方法的测试片段分类集合M_TFS;
步骤3)-4:判断MUTS中待分析MUT数量是否大于0,如果是则执行步骤3)-5,否则执行步骤3)-15;
步骤3)-5:判断All_TFS中TFS数量是否大于0,如果是则执行步骤3)-6,否则执行步骤3)-15;
步骤3)-6:从MUT_ALL中取出一个待分析MUT的标识MID;
步骤3)-7:初始化选手测试片段集合C_TFS为空;
步骤3)-8:从TFS_ALL取出一个测试片段集合TFS中所有方法标识MIDs;
步骤3)-9:判断MIDs中是否包含步骤3)-6取出的MID,如果是那么执行步骤3)-10,否则执行步骤3)-14;
步骤3)-10:从TFS中取出测试片段<MID,TF>;
步骤3)-11:将<MID,CID,TF>添加到集合C_TFS中;
步骤3)-12:判断TFS_ALL中TFS是否遍历完毕,如果是则执行步骤3)-13,否则执行步骤3)-8;
步骤3)-13:将C_TFS并添加到集合M_TFS;
步骤3)-14:判断MUT_ALL中MUT是否遍历完毕,如果是则执行步骤3)-15,否则执行步骤3)-6;
步骤3)-15:输出集合M-TFS;
步骤3)-16:结束状态。
进一步,其中上述步骤4)的具体步骤如下:
步骤4)-1:起始状态;
步骤4)-2:输入步骤3)得到的M_TFS;
步骤4)-3:初始化测试片段相似值集合MSimS为空;
步骤4)-4:判断M_TFS中待分析方法数量是否大于0,如果是则执行步骤4)-5,否则执行步骤4)-16;
步骤4)-5:从M_TFS取出一个待分析的mTFS=<MID,C_TFS>;
步骤4)-6:取出mTFS中选手集合C_TFS;
步骤4)-7:判断C_TFS中cTFS数量是否大于1,如果是则执行步骤4)-8,否则执行步骤4)-15;
步骤4)-8:初始化不同选手测试片段相似值集合CSim_ALL为空;
步骤4)-9:取出C_TFS中的两个cTF,分析生成相似性分析报告SimReport;
步骤4)-10:分析SimReport计算两个cTFS之间的相似值SimValue;
步骤4)-11:将所有相似值以CSim=<CID1,CID2,SimValue>三元组格式存储;
步骤4)-12:将CSim添加到结合CSim_ALL中;
步骤4)-13:判断C_TFS中所有cTF之间相似值是否计算完毕,如果是则执行步骤4)-14,否则执行步骤4)-9;
步骤4)-14:将<MID,CSim_ALL>添加到集合MSimS中;
步骤4)-15:判断M_TFS中所有mTFS是否分析完毕,如果是则执行步骤4)-16,否则执行步骤4)-5;
步骤4)-16:输出集合MSimS;
步骤4)-17:结束状态。
进一步,其中上述步骤5)的具体步骤如下:
步骤5)-1:起始状态;
步骤5)-2:输入选手测试方法集合C_MIDS和步骤4)得到的MSimS;
步骤5)-3:初始化选手之间的相似值集合Sim_ALL为空;
步骤5)-4:判断C_MIDS中选手数量是否大于2,如果是则执行步骤5)-5,否则执行步骤5)-18;
步骤5)-5:判断MSimS中mSim数量是否大于0,如果是则执行步骤5)-6,否则执行步骤5)-18;
步骤5)-6:从C_MIDS中取出两位选手的测试方法集合Ci:{m1,m2,…},Cj:{m1,m2...};
步骤5)-7:初始化Ci和Cj所有相似值集合SVS为空;
步骤5)-8:计算相似值权重W,公式如下:
Figure GSB0000193598570000081
其中SimMCount是Ci和Cj中相似方法的数量,Ci.MCount和Cj.MCount分别表示Ci测试方法数量和Cj测试方法的数量,Max{Ci.MCount,Ci.MCount}表示去二者之间最大值。
步骤5)-9:从MSimS中取出一个待分析的mSim=<MID,CSim_ALL>;
步骤5)-10:判断CSim_ALL集合中CSim数量是否大于0,如果是则执行步骤5)-11,否则执行步骤5)-9;
步骤5)-11:遍历集合CSim_ALL,查找符合下列条件的SimValue:
Ci.CID==CSim.CID1&&Cj.CID==CSim.CID2;
步骤5)-12:判断步骤5是否查找到符合条件的SimValue,如果是则执行步骤步骤5)-13,否则执行步骤5)-9;
步骤5)-13:将SimValue添加到集合SVS中;
步骤5)-14:判断MSimS中mSim是否遍历完毕,如果是则执行步骤5)-15,否则执行步骤5)-9;
步骤5)-15:基于SVS计算Ci和Cj的测试代码整体相似度S,计算公式如下;
Figure GSB0000193598570000082
其中W是步骤5)-8得到的相似值权重,|SVS|表示集合SVS的大小。
步骤5)-16:将<Ci,Cj,S>添加到集合Sim_ALL中;
步骤5)-17:判断C_MIDS中所有选手间相似度是否计算完毕,如果是则执行步骤5)-18,否则执行步骤5)-6;
步骤5)-18:输出集合Sim_ALL;
步骤5)-19:结束状态。
进一步,其中上述步骤6)的具体步骤如下:
步骤6)-1:起始状态;
步骤6)-2:输入步骤5)得到的Sim_ALL和抄袭判断域值T;
步骤6)-3:初始化抄袭选手集合PCS为空;
步骤6)-4:判断集合Sim_ALL中元素数量是否大于0,如果是则执行步骤6)-5,否则执行步骤6)-9;
步骤6)-5:从Sim_ALL中取出一个元素<Ci,Cj,S>;
步骤6)-6:判断相似度值S大于抄袭判断域值T,如果是则执行步骤6)-7,否则执行步骤6)-10;
步骤6)-7:将<Ci,Cj,S>添加到PCS集合;
步骤6)-8:判断Sim_ALL中元素是否遍历完毕,如果是则执行步骤6)-9,否则执行步骤6)-5;
步骤6)-9:输出集合PCS;
步骤6)-10:结束状态。
附图说明
图1为本发明实施中的一种基于测试代码片段相似性的测试程序抄袭检测方法的流程图。
图2为图1中待测源程序分析的流程图。
图3为图1中测试程序分析的流程图。
图4为图1中测试代码片段分类的流程图。
图5为图1中测试代码片段相似性分析的流程图。
图6为图1中测试代码整体相似性分析的流程图。
图7为图1中测试程序抄袭判断的流程图。
具体实施方式
为了更了解本发明的技术内容,特举具体实施例并配合所附图式说明如下。
图1为本发明实施的一种基于测试代码片段相似性的测试程序抄袭检测方法的整体框架图。
一种基于测试代码片段相似性的测试程序抄袭检测方法,其特征在于,包括下列步骤。
Step1待测试程序分析:给定待测试项目源程序,通过静态分析技术依次分析待测程序中待测试文件、待测试类、待测试方法,从中提取待测试类的名称、待测试方法的名称和参数序列;然后,基于类名、方法名和参数序列计算每个待测试方法的唯一标识MID;从而,构建出所有待测试方法集合。
Step2测试程序分析:给定选手提交的测试程序集合和待测试方法的集合,通过静态分析技术依次分析每个测试方法中的测试文件、测试类、测试用例,从中提取出所有调用方法集合,每个调用方法三个部分构成:方法名、参数序列、对象名,并计算出该调用方法的唯一标识MID;然后,基于MID判断每个调用方法是否是待测方法,如果是则从测试文件中提取出所有与其相关的代码语句组成测试片段集合,从而构建所有选手的测试片段集合。
Step3测试代码片段分类:给定所有待测试方法的集合和测试片段集合,以所有待测方法为分类的类别选项,将测试片段集合中所有测试片段分类,从而得到每个待测方法被哪些选手的哪些测试片段测试,从而构建出所有待测方法的测试片段分类集合。
Step4测试代码片段相似性分析:给定所有测试片段集合,遍历分析集合中每一个类别,每次取两个选手的测试片段进行对比,使用Text-based、Token-based或是Stringmatching based相似性分析技术得到相似性分析报告;然后,基于相似性分析报告计算出不同相似片段间相似度值,从而构成所有测试片段之间相似度值的集合。
Step5测试代码整体相似性分析:给定选手测试方法集合和所有待测方法的测试片段相似度值集合,遍历分析选手测试方法集合,每次取出两位选手测试方法集合。首先,计算两位选手测试代码整体相似值权重W,然后,遍历分析测试片段之间相似度值的集合,找出两位选手所有相似测试片段的相似值集合;最后,基于相似值集合计算出两位选手测试代码整体相似度值S,从而可以计算出所有选手之间的测试程序的相似度值。
Step6测试程序抄袭判断;给定所有选手之间的测试程序相似度值集合和抄袭判断域值T,遍历集合中每个元素中两位选手测试代码相似度值S,如果相似度值S大于给定的域值T,则判断选手度测试程序之间存在抄袭,从而可以判断所有选手之间的抄袭情况。
图2为待测源程序分析的流程图。静态分析测试程序,提取出测试程序中所有测试代码片段集合。具体步骤如下:
步骤1:起始状态;步骤2:输入待测试程序源代码PUT=<PN,FUTS>,其中PN表示程序名称,FUTS是待测程序中所有待测文件集合;步骤3:初始化集合MUT_ALL为空;步骤4:判断集合FUTS是否为空,如果是则执行步骤13,否则执行步骤5;步骤5:从FUTS中取出一个待测试文件FUT=<FN,CUTS>,其中FN表示文件的名称,CUTS是文件中所有待测类的集合;步骤6:从CUTS中取出一个待测试类CUT=<CN,MUTS>,其中CN表示类的名称,MUTS是类中所有待测方法的集合;步骤7:从MUTS中取出一个待测试方法MUT=<MN,ARGS>,其中MN表示方法的名称,ARGS表示方法的参数类型序列;步骤8:基于CN和MUT计算待测方法的唯一标识MID,将CN、MN和ARGS字符串拼接后计算Hash值;步骤9:将<MID,MUT>添加到集合MUT_ALL中;步骤10:判断MUTS中所有MUT是否遍历完毕,若是则执行步骤11,否则执行步骤7;步骤11:判断CUTS中所有CUT是否遍历完毕,若是则执行步骤12,否则执行步骤6;步骤12:判断FUTS中所有FUT是否遍历完毕,若是则执行步骤13,否则执行步骤5;步骤13:输出集合MUT_ALL;步骤14:结束状态。
图3为测试程序分析的流程图。具体步骤如下:
步骤1:起始状态;步骤2:输入选手提交的测试程序TPS以及步骤1)得到的MUT_ALL;步骤3:初始化所有选手的测试片段集合TFS_ALL为空;步骤4:判断TPS中待分析测试程序数量是否大于0,如果是则执行步骤5,否则执行步骤23;步骤5:从TPS取出一个测试程序TP=<CID,PN,TFileS>,其中CID表示选手ID,PN表示测试程序到名称,TFileS(Test FileSet)表示测试文件集合;步骤6:初始化TP的测试片段集合TFS为空;步骤7:判断TP中待分析测试文件数量是否大于0,如果是则执行步骤8,否则执行步骤23;步骤8:从TFileS中取出一个测试文件TFile=<FN,TClassS>,其中FN表示测试文件名称,TClassS(Test Class Set)表示测试类集合;步骤9:从TClassS中取出一个测试类TClass=<CN,TCaseS>,其中CN表示测试类名称,TCaseS(Test Case Set)表示测试用例集合;步骤10:从TCaseS中取出一个测试用例TCase=<CaseN,IMS>,其中CaseN表示测试用例名称,IMS(Invoke Method Set)表示调用方法集合;步骤11:从IMS中取出一个调用方法IM=<MN,ARGS,OBJ>,其中MN表示被调用方法的名称,ARGS表示方法调用时传递的参数序列,OBJ表示调用该方法的实例名称或者静态类的名称;步骤12:在TFile中查找OBJ所属类的名称TCN(Test Class Name);步骤13:计算被调用方法的唯一MID;步骤14:判断MID是否存在于MUT_ALL的MID集合中,如果是则执行步骤15,否则执行步骤17;步骤15:再次扫描TestFile,在TestFile提取出所有与IM有关的语句,构成测试片段TF。步骤16:将<ID,TF>添加到集合TFS;步骤17:判断IMS中IM是否遍历完毕,如果是则执行步骤18,否则执行步骤11;步骤18:判断TCaseS中TCase是否遍历完毕,如果是则执行步骤19,否则执行步骤10;步骤19:判断TClassS中TClass是否遍历完毕,如果是则执行步骤20,否则执行9;步骤20:判断TFileS中TFile是否遍历完毕,如果是则执行步骤21,否则执行步骤8;步骤21:将<CID,TFS>添加到集合TFS_ALL中;步骤22:判断TPS中TP是否遍历分析完毕,如果是则执行步骤23,否则执行步骤5;步骤23:输出集合TFS_ALL;步骤24:结束状态。
图4为测试代码片段分类的流程图。具体步骤如下:
步骤1:起始状态;步骤2:输入MUT_ALL和TFS_ALL;步骤3:初始化所有方法的测试片段集合M_TFS;步骤4:判断MUTS中待分析MUT数量是否大于0,如果是则执行步骤5,否则执行步骤15;步骤5:判断All_TFS中TFS数量是否大于0,如果是则执行步骤6,否则执行步骤15;步骤6:从MUT_ALL中取出一个待分析MUT的标识MID;步骤7:初始化选手测试片段集合C_TFS为空;步骤8:从TFS_ALL取出一个测试片段集合TFS中所有方法标识MIDs;步骤9:判断MIDs中是否包含步骤6取出的MID,如果是那么执行步骤10,否则执行步骤14:步骤10:从TFS中取出测试片段<MID,TF>;步骤11:将<MID,CID,TF>添加到集合C_TFS中;步骤12:判断TFS_ALL中TFS是否遍历完毕,如果是则执行步骤13,否则执行步骤8;步骤13:将C_TFS并添加到集合M_TFS;步骤14:判断MUT_ALL中MUT是否遍历完毕,如果是则执行步骤15,否则执行步骤6;步骤15:输出集合M_TFS;步骤16:结束状态。
图5为测试代码片段相似性分析的流程图。具体步骤如下:
步骤1:起始状态;步骤2:输入M_TFS;步骤3:初始化测试片段相似值集合MSimS为空;步骤4:判断M_TFS中待分析方法数量是否大于0,如果是则执行步骤5,否则执行步骤16;步骤5:从M_TFS取出一个待分析的mTFS=<MID,C_TFS>;步骤6:取出mTFS中选手集合C_TFS;步骤7:判断C_TFS中cTFS数量是否大于1,如果是则执行步骤8,否则执行步骤15;步骤8:初始化不同选手测试片段相似值集合CSim_ALL为空;步骤9:取出C_TFS中的两个cTF,分析生成相似性分析报告SimReport;步骤10:分析SimReport计算两个cTFS之间的相似值SimValue;步骤11:将所有相似值以CSim=<CID1,CID2,SimValue>三元组格式存储;步骤12:将CSim添加到结合CSim_ALL中;步骤13:判断C_TFS中所有cTF之间相似值是否计算完毕,如果是则执行步骤14,否则执行步骤9;步骤14:将<MID,CSim_ALL>添加到集合MSimS中;步骤15:判断M_TFS中所有mTFS是否分析完毕,如果是则执行步骤16,否则执行步骤5;步骤16:输出集合MSimS;步骤17:结束状态。
图6为测试代码整体相似性分析的流程图。具体步骤如下:
步骤1:起始状态;步骤2:输入选手测试方法集合C_MIDS和MSimS;步骤3:初始化选手之间的相似值集合Sim_ALL为空;步骤4:判断C_MIDS中选手数量是否大于2,如果是则执行步骤5,否则执行步骤18;步骤5:判断MSimS中mSim数量是否大于0,如果是则执行步骤6,否则执行步骤18;步骤6:从C_MIDS中取出两位选手的测试方法集合Ci:{m1,m2,…},Cj:{m1,m2...};步骤7:初始化Ci和Cj所有相似值集合SVS为空;步骤8:计算相似值权重W。步骤9:从MSimS中取出一个待分析的mSim=<MID,CSim_ALL>;步骤10:判断CSim_ALL集合中CSim数量是否大于0,如果是则执行步骤11,否则执行步骤9;步骤11:遍历集合CSim_ALL,查找符合下列条件的SimValue:Ci.CID==CSim.CID1&&Cj.CID==CSim.CID2;步骤12:判断步骤5是否查找到符合条件的SimValue,如果是则执行步骤步骤13,否则执行步骤9;步骤13:将SimValue添加到集合SVS中;步骤14:判断MSimS中mSim是否遍历完毕,如果是则执行步骤15,否则执行步骤9;步骤15:基于SVS计算Ci和Cj的测试代码整体相似度S;步骤16:将<Ci,Cj,S>添加到集合Sim_ALL中;步骤17:判断C_MIDS中所有选手间相似度是否计算完毕,如果是则执行步骤18,否则执行步骤6;步骤18:输出集合Sim_ALL;步骤19:结束状态。
图7为测试程序抄袭判断的流程图。具体步骤如下:
步骤1:起始状态;步骤2:输入Sim_ALL和抄袭判断域值T;步骤3:初始化抄袭选手集合PCS为空;步骤4:判断集合Sim_ALL中元素数量是否大于0,如果是则执行步骤5,否则执行步骤9;步骤5:从Sim_ALL中取出一个元素<Ci,Cj,S>;步骤6:判断相似度值S大于抄袭判断域值T,如果是则执行步骤7,否则执行步骤10;步骤7:将<Ci,Cj,S>添加到PCS集合;步骤8:判断Sim_ALL中元素是否遍历完毕,如果是则执行步骤9,否则执行步骤5;步骤9:输出集合PCS;步骤10:结束状态。
综上所述,本发明用于填补了针对测试代码相似性检测技术的空白,解决目前测试代码相似性分析的精度低和测试代码抄袭检测主要靠人工操作的低效率问题,从而提高测试代码相似性检测的效率和精度。

Claims (1)

1.一种基于测试代码片段相似性的测试程序抄袭检测方法,其特征在于,针对待测试程序,首先,使用静态扫描分析技术,从待测试的程序中提取出所有待测试方法集合MUTS;然后,通过静态分析和自然语言处理NLP技术提取参赛选手所提交的测试代码中的测试片段集合TFS;基于MUTS和TFS,使用Text-based、Token-based或是String matching based相似性分析技术来分析不同测试片段之间的相似性并生成相似性分析报告;最后,通过分析相似性分析报告计算测试代码片段的相似度,从而判断抄袭行为,提高作弊抄袭检测的效率与精准率;该方法包含下列步骤:
1)待测程序分析,给定待测试项目源程序;首先,通过静态分析技术依次分析待测程序中待测试文件、待测试类、待测试方法,从中提取出待测试类的名称CN、待测试方法的名称MN和参数序列ARGS;然后,将CN、MN、ARGS进行字符串拼接并计算出拼接字符串的Hash值作为每个待测试方法的唯一标识MID;最后,用二元组<MID,MUT>表示一个待测试的方法,构建出所有待测试方法的集合;
2)测试程序分析,给定所有选手提交的测试程序集合TPS和步骤1)获得的所有待测试方法的集合;首先,通过静态分析技术依次分析每个测试方法中的测试文件、测试类、测试用例,从中提取出所有调用方法集合,每个调用方法三个部分构成:MN、ARGS、OBJ;其次,基于MN、ARGS、OBJ计算出Hash值作为该方法的唯一标识,从选手提交的代码中提取测试代码片段;最后,判断每个调用方法是否是待测方法,如果是则从测试文件中提取出所有与其相关的代码语句组成测试片段集合;用二元组<CID,TFS>表示选手的测试片段集合,其中CID表示选手的编号,从而构建所有选手的测试片段集合;
3)测试代码片段分类,给定步骤1)获得的所有待测试方法的集合和步骤2)获得的测试片段集合;以所有待测方法为分类的类别选项,将测试片段集合中所有测试片段分类,从而得到每个待测方法被哪些选手的哪些测试片段测试,从而构建出所有待测方法的测试片段分类集合;
4)测试代码片段相似性分析,给定步骤3)获得的所有测试片段分类集合;遍历分析集合中每一个类别mTFS=<MID,C_TFS>,每次取C_TFS中两个选手的TF进行对比,使用Text-based、Token-based或是String matching based相似性分析技术得到两个TF的相似性分析报告;然后,分析所有片段相似性分析报告计算出不同相似片段间相似度值,从而构成所有测试片段之间相似度值的集合;最终构建出所有待测方法的测试片段相似度值集合;
5)测试代码整体相似性分析,给定选手测试方法集合C_MIDS和步骤4)得到的所有待测方法的测试片段相似度值集合,遍历分析C_MIDS,每次取出两位选手测试方法集合,用Ci:{m1,m2,m3…}和Cj:{m1,m2,m3…}表示,其中m1,m2,m3…表示选手测试的方法;首先,计算Ci和Cj的测试代码整体相似值权重W=Weight(Ci,Cj),计算公式如下:
Figure FSB0000193598560000021
其中,SimMCount表示Ci和Cj的测试代码中相似的测试片段数量,Ci.MCount和Cj.MCount分别表示Ci和Cj测试的方法数量,Max{Ci.MCount,Cj.MCount}表示取二者之间的最大值;然后,遍历分析MSimS中所有子集mSim的CSim_ALL,查找出所有满足如下条件的CSim元素SimValue的集合SVS:
Ci.CID==CSim.CID1&&Cj.CID==CSim.CID2
或者:Ci.CID==CSim.CID2&&Cj.CID==CSim.CIDt
最后,基于集合SVS计算出选手Ci和Cj的测试代码整体相似度值S=Sim(Ci,Cj),计算公式如下:
Figure FSB0000193598560000022
其中,W是公式1由公式(1)计算得到,|SVS|表示集合SVS的大小;
通过上述步骤可以计算出所有选手之间的测试程序TP的相似度值Sim_ALL;
6)测试程序抄袭判断,给定步骤5)得到的所有选手之间的测试程序相似度值Sim_ALL和抄袭判断域值T;遍历集合Sim_ALL中每个元素<Ci,Cj,S>,如果相似度值S大于给定的域值T,则判断选手Ci和Cj的测试程序之间存在抄袭。
CN201810561223.3A 2018-05-29 2018-05-29 一种基于测试代码片段相似性的测试程序抄袭检测方法 Active CN110543331B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810561223.3A CN110543331B (zh) 2018-05-29 2018-05-29 一种基于测试代码片段相似性的测试程序抄袭检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810561223.3A CN110543331B (zh) 2018-05-29 2018-05-29 一种基于测试代码片段相似性的测试程序抄袭检测方法

Publications (2)

Publication Number Publication Date
CN110543331A CN110543331A (zh) 2019-12-06
CN110543331B true CN110543331B (zh) 2021-07-06

Family

ID=68701205

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810561223.3A Active CN110543331B (zh) 2018-05-29 2018-05-29 一种基于测试代码片段相似性的测试程序抄袭检测方法

Country Status (1)

Country Link
CN (1) CN110543331B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112433756B (zh) * 2020-11-24 2021-09-07 北京京航计算通讯研究所 基于加权递归自编码器的快速代码克隆检测方法及装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6282698B1 (en) * 1998-02-09 2001-08-28 Lucent Technologies Inc. Detecting similarities in Java sources from bytecodes
CN103678528A (zh) * 2013-12-03 2014-03-26 北京建筑大学 基于段落抄袭检测的电子作业反抄袭系统和方法
CN104063322A (zh) * 2014-06-30 2014-09-24 广州视源电子科技股份有限公司 一种基于通道切换的测试方法及装置
CN106294786A (zh) * 2016-08-12 2017-01-04 北京创新乐知信息技术有限公司 一种代码搜索方法和系统

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6282698B1 (en) * 1998-02-09 2001-08-28 Lucent Technologies Inc. Detecting similarities in Java sources from bytecodes
CN103678528A (zh) * 2013-12-03 2014-03-26 北京建筑大学 基于段落抄袭检测的电子作业反抄袭系统和方法
CN104063322A (zh) * 2014-06-30 2014-09-24 广州视源电子科技股份有限公司 一种基于通道切换的测试方法及装置
CN106294786A (zh) * 2016-08-12 2017-01-04 北京创新乐知信息技术有限公司 一种代码搜索方法和系统

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
基于XML的C代码抄袭检测算法;钟美 等;《计算机工程与应用》;20111231;全文 *
数值稳定性相关漏洞隐患的自动化检测方法;沈维军 等;《软件学报》;20180109;全文 *
自动化单元测试框架NUnit的改进设计与实现;王桐;《电脑与信息技术》;20130430;全文 *

Also Published As

Publication number Publication date
CN110543331A (zh) 2019-12-06

Similar Documents

Publication Publication Date Title
CN101866317B (zh) 一种基于聚类分析的回归测试用例选择方法
CN105955889B (zh) 一种图形界面自动化测试方法
CN107193739B (zh) 一种黑盒回归测试方法
CN106407809B (zh) 一种Linux平台恶意软件检测方法
CN110543421B (zh) 基于测试用例自动生成算法的单元测试自动执行方法
CN105608003B (zh) 基于控制流分析和数据流分析的Java程序静态分析方法
CN113127339B (zh) 一种Github开源平台数据的获取方法及源代码缺陷修复系统
CN115687115B (zh) 一种移动应用程序自动化测试方法及系统
CN105302719A (zh) 一种变异测试方法及装置
CN109408385B (zh) 一种基于缺陷规则和分类反馈的缺陷发现方法
CN110543331B (zh) 一种基于测试代码片段相似性的测试程序抄袭检测方法
Taherkhani et al. Automatic recognition of students' sorting algorithm implementations in a data structures and algorithms course
Fulop et al. Towards a benchmark for evaluating design pattern miner tools
CN104750608A (zh) 一种程序中基于动态符号执行的自动错误定位方法
CN112380120B (zh) 单元测试代码结构自动解析与路径分析方法
CN108228232B (zh) 一种针对程序中循环问题的自动修复方法
CN104536880B (zh) 基于符号执行的gui程序测试用例扩增方法
JP4245530B2 (ja) 言語モデル作成装置及び方法並びにプログラム
CN111859539A (zh) 基于Tcl或者Tk二次开发的有限元自动赋属性和材料参数方法
CN109408114B (zh) 一种程序错误自动修正方法、装置、电子设备及存储介质
CN111459788A (zh) 一种基于支持向量机的测试程序抄袭检测方法
CN113282495B (zh) 一种基于轨迹监控的Java软件故障定位方法
CN109542496A (zh) 增量代码确定方法、装置及系统
JP5075695B2 (ja) プロパティ記述のカバレッジ測定装置及びプログラム
CN106095663B (zh) 基于切片模型的程序回归错误定位方法

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
GR01 Patent grant
GR01 Patent grant