CN102436417A - 代码与功能覆盖映射***及其覆盖映射方法 - Google Patents

代码与功能覆盖映射***及其覆盖映射方法 Download PDF

Info

Publication number
CN102436417A
CN102436417A CN2011102957593A CN201110295759A CN102436417A CN 102436417 A CN102436417 A CN 102436417A CN 2011102957593 A CN2011102957593 A CN 2011102957593A CN 201110295759 A CN201110295759 A CN 201110295759A CN 102436417 A CN102436417 A CN 102436417A
Authority
CN
China
Prior art keywords
code
control
function
covering
module
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.)
Granted
Application number
CN2011102957593A
Other languages
English (en)
Other versions
CN102436417B (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.)
China Software Evaluation Center
Original Assignee
Individual
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 Individual filed Critical Individual
Priority to CN201110295759.3A priority Critical patent/CN102436417B/zh
Publication of CN102436417A publication Critical patent/CN102436417A/zh
Application granted granted Critical
Publication of CN102436417B publication Critical patent/CN102436417B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种代码与功能覆盖映射***,其结构包括白盒测试工具、代码覆盖信息提取模块、代码与控件映射处理模块和代码覆盖与功能覆盖映射模块。本发明还公开了一种代码与功能覆盖映射方法。本发明技术方案能够搭建白盒测试与黑盒测试之间桥梁,充分发挥白盒测试与黑盒测试各自特长,提高测试充分性和效率。

Description

代码与功能覆盖映射***及其覆盖映射方法
技术领域
本发明涉及软件功能测试领域,特别涉及一种代码与功能覆盖映射***及其覆盖映射方法。
背景技术
白盒测试与黑盒测试是软件测试采用的两种主要方法。在白盒测试领域,为了准确掌握测试用例对代码的覆盖情况,陆续推出了商业化的测试工具,有代表性的有TestBed工具、CodeTest工具等。这些工具采用程序插装技术,能够准确显示出测试用例所覆盖的语句、分支和路径等信息,根据这些信息,测试人员可以设计新的测试用例覆盖那些未被当前测试用例所覆盖的代码,从而满足测试充分性要求。这种方法的优点是能够直观显示测试用例对代码的覆盖情况,其缺点是在设计新的测试用例覆盖未被覆盖的代码时,需要测试人员阅读代码,只有对代码进行分析,才能设计出新的测试用例。这一方面要求测试人员具有较高的程序设计水平,另一方面需要花费大量的精力和时间。
与白盒测试方法相对应的是黑盒测试方法,这种方法只关注软件的功能而不考虑程序代码结构,在测试时只考虑测试用例对软件功能的覆盖情况而不关心其对底层程序代码的覆盖情况。这种方法的优点是直观、便捷,其缺点表现在三个方面,一是覆盖粒度较粗。满足功能覆盖标准的测试不一定能够满足代码覆盖标准;二是无法通过代码覆盖信息获取与其对应的功能覆盖情况。尽管测试人员通过白盒测试工具获取了未覆盖的代码信息,但如何从功能角度设计新的测试用例覆盖这些代码仍然是一个难题;三是无法识别那些底层程序代码发生了变化而软件功能未发生变化的软件功能。目前,测试用例对软件功能的覆盖信息只能靠人工统计,无商业化的辅助工具。
白盒测试和黑盒测试是软件测试中不可或缺的两种方法,但由于缺乏有效的方法,这两种测试方法一直处于割裂状态,严重影响了测试充分性和效率。
发明内容
本发明所解决的技术问题是提供一种代码与功能覆盖映射***,能够搭建白盒测试与黑盒测试之间桥梁,充分发挥白盒测试与黑盒测试各自特长,提高测试充分性和效率。
技术方案如下:
一种代码与功能覆盖映射***,包括白盒测试工具,所述白盒测试工具用于提取并显示出测试用例所覆盖的代码,还包括代码覆盖信息提取模块、代码与控件映射处理模块和代码覆盖与功能覆盖映射模块,其中,
代码覆盖信息提取模块,用于接收从所述白盒测试工具发送的代码覆盖信息,并从所述代码覆盖信息中提取出所覆盖的程序语句,并将所述程序语句发送给所述代码覆盖与功能覆盖映射模块;
代码与控件映射处理模块,用于分析程序语句中源程序代码、构建语法树和符号表,在此基础上实现源程序代码与软件界面控件的映射,并将映射关系发送给代码覆盖与功能覆盖映射模块;
代码覆盖与功能覆盖映射模块,用于根据所述源程序代码与软件界面控件的映射关系将所述程序语句转换为功能覆盖信息。
进一步:所述代码与控件映射处理模块进行词法和语法分析时,所述词法和语法分析采用类编译原理技术,对被测软件源代码进行词法和语法分析,通过分析得到所述抽象语法树和符号表。
进一步:所述代码与控件映射处理模块在图形用户界面GUI控件辨识过程中采用深度优先搜索技术,遍历所述抽象语法树和符号表,得到源代码中所有的GUI控件。
进一步:所述代码与控件映射处理模块用于生成被测程序的源代码与GUI控件的代码控件映射表,通过分析代码中对GUI控件的定义和使用的语句,得到代码控件映射表。
进一步:所述代码覆盖与功能覆盖映射模块根据输入的未覆盖代码信息,通过对代码控件映射表进行搜索,得到相关未覆盖的图形用户界面GUI控件列表,通过遍历未覆盖代码并扫描代码控件映射表生成未覆盖GUI控件列表。
本发明所解决的另一个技术问题是提供一种代码与功能覆盖映射方法,能够搭建白盒测试与黑盒测试之间桥梁,充分发挥白盒测试与黑盒测试各自特长,提高测试充分性和效率。
技术方案如下:
一种代码与功能覆盖映射方法,包括:
白盒测试工具用于提取并显示出测试用例的代码覆盖信息,并发送给代码覆盖信息提取模块;
代码覆盖信息提取模块接收从所述白盒测试工具发送的代码覆盖信息,并从所述代码覆盖信息中提取出所覆盖的程序语句,并将所述程序语句发送给所述代码覆盖与功能覆盖映射模块;
代码与控件映射处理模块分析程序语句中源程序代码、构建语法树和符号表,在此基础上实现源程序代码与软件界面控件的映射,并将映射关系发送给代码覆盖与功能覆盖映射模块;
代码覆盖与功能覆盖映射模块根据所述源程序代码与软件界面控件的映射关系将所述程序语句转换为功能覆盖信息。
进一步:所述代码与控件映射处理模块进行词法和语法分析时,词法和语法分析采用类编译原理技术,对被测软件源代码进行词法和语法分析,通过分析得到抽象语法树和符号表。
进一步:所述代码与控件映射处理模块在图形用户界面GUI控件辨识过程中采用深度优先搜索技术,遍历所述抽象语法树和符号表,得到源代码中所有的GUI控件。
进一步:所述代码与控件映射处理模块用于生成被测程序的源代码与GUI控件的代码控件映射表,通过分析代码中对GUI控件的定义和使用的语句,得到代码控件映射表。
进一步:所述代码覆盖与功能覆盖映射模块根据输入的未覆盖代码信息,通过对代码控件映射表进行搜索,得到相关未覆盖的图形用户界面GUI控件列表,通过遍历未覆盖代码并扫描代码控件映射表生成未覆盖GUI控件列表。
技术效果包括:
1、本发明主要解决如何将代码覆盖信息转换为功能覆盖信息技术问题,提供一种将代码覆盖信息转换为功能覆盖信息的方法,从而搭建白盒测试与黑盒测试之间桥梁,充分发挥白盒测试与黑盒测试各自特长,提高测试充分性和效率。
2、本发明采用代码与软件功能映射方法,通过代码控件映射表,将代码覆盖转换为功能覆盖,测试人员通过功能覆盖信息,可以简单、直观地设计出新的测试用例,这也是本发明最突出的特点。
附图说明
图1是本发明中代码与功能覆盖映射***的结构框图;
图2是本发明中代码与功能覆盖映射方法的主流程图;
图3是本发明中代码与控件映射处理模块的工作流程图;
图4是本发明中词法和语法分析流程图;
图5是本发明中控件辨识方法的工作流程图;
图6是本发明中代码控件映射分析的主要工作流程图;
图7是本发明中代码覆盖与功能覆盖映射的工作流程图;
图8是本发明中第6行至第8行代码的抽象语法树;
图9是本发明中第22行到第24行代码的抽象语法树;
图10是本发明中示例代码所对应的实际软件主界面示意图;
图11是本发明示例代码中“测试菜单项1”引导的弹出窗口界面示意图。
具体实施方式
下面参考附图和优选实施例对本发明技术方案作详细描述。
如图1所示,是本发明中代码与功能覆盖映射***的结构框图。
代码与功能覆盖映射***包括:白盒测试工具101、代码覆盖信息提取模块102、代码与控件映射处理模块103和代码覆盖与功能覆盖映射模块104四部分。
其中,白盒测试工具101用于提取并显示出测试用例对代码的覆盖信息,并发送覆盖信息给代码覆盖信息提取模块102,代码覆盖信息包括所覆盖的语句、分支和路径等信息。代码覆盖信息提取模块102用于从代码覆盖信息(能够引起程序执行路径发生变化的语句)中提取所覆盖的程序语句,并将程序语句发送给代码覆盖与功能覆盖映射模块104。代码与控件映射处理模块103用于实现源程序代码与软件界面控件的映射,通过分析源程序代码,构建语法树和符号表,在此基础上,找出源程序代码与软件界面控件的映射关系,并将映射关系发送给代码覆盖与功能覆盖映射模块104。代码覆盖与功能覆盖映射模块104根据源程序代码与软件界面控件的映射关系将程序语句转换为功能覆盖信息。
如图2所示,是本发明的主流程图。
步骤201:对源程序代码进行语法和词法分析;
通过分析,找出代码中能够引起程序执行路径发生变化的语句,构建语法树和符号表。
步骤202:对于这些语句,采用插装的方法设置特殊的标记,作为所覆盖的程序语句;
步骤203:重新进行二次编译,并将编译好的代码下载到目标机中运行;
步骤204:在软件运行过程中,以文件方式记录测试用例所覆盖的程序语句;
步骤205:根据语法树和符号表,建立源代码与界面控件映射关系;
步骤206:根据测试用例所覆盖的程序语句以及源代码与界面控件映射关系,给出测试用例对软件功能的覆盖信息。
代码与控件映射处理模块103用于实现源程序代码与软件界面控件的映射。
如图3所示,代码与控件映射处理模块103的工作流程图。图中表示了代码与控件映射处理模块103的工作流程和各阶段中间结果。
步骤301:代码与控件映射处理模块103进行词法和语法分析。词法和语法分析采用类编译原理技术,对被测软件源代码进行词法和语法分析,通过分析,得到抽象语法树和符号表。
如图4所示,是本发明中词法和语法分析流程图。此项分析的主要目的是得到被测软件源代码的抽象语法树和符号表。
定义1:抽象语法树是一棵树T=<V,E>,其中:V是树的节点,由源代码中的各种语法结构组成;E是树的边,负责连接各种语法结构。
定义2:符号表是一个表形数据结构,词法分析过程中产生的标识符作为符号表的入口,后续分析得到的信息,如:标识符的类型、使用方式、存储空间等都可以根据需要加入到表中。
词法和语法分析是生成代码与界面控件映射关系的基础。本方案采用通用的方法对被测软件的源代码进行词法和语法分析,由算法2描述。
算法2.Lexical_Syntax_Analyze(P)
输入P:源代码
输出(AST,SymTable):P的抽象语法树和符号表
1.TokenStream<-Lexical_Analyze(P)
2.(AST,SymTable)<-Syntax_Analyze(TokenStream)
3.Return(AST,SymTable)
源代码在经过词法和语法分析后,将得到其抽象语法树和符号表。算法2的第1步对源代码P进行词法分析,得到P的标记流TokenStream;第2步以标记流为基础进行语法分析,得到P的抽象语法树AST和符号表SymTable;第3步将AST和SymTable返回。
步骤302:GUI(Graphical User Interface,简称GUI,图形用户界面又称图形用户接口)控件辨识。采用深度优先搜索技术,遍历抽象语法树和符号表,得到源代码中所有的GUI控件(如:窗口、按钮等)。
GUI控件是软件功能的具体体现,软件功能通过控件来实现。GUI控件辨识的目的是找出程序中所设计的所有GUI控件,即:通过对抽象语法树和符号表的分析,辨识出所有的GUI控件。这一步主要通过对抽象语法树的遍历和对符号表的查找来完成。主要方法是:以深度优先方法遍历抽象语法树,如果某个叶子节点是变量,这时通过查找符号表,可以得到该变量的类型;如果该类型是GUI控件类型,则说明该变量所描述的是一个GUI控件。
程序编译和本方案中的GUI控件辨识都使用了抽象语法树和符号表,但两者的目的不同,前者的目的是生成并优化目标代码,而后者的目的是找出源代码中所有的GUI控件。
1、控件类型
编程语言不同,其所包含的控件类型也不同,以Java Swing为例,其所包含的控件可以分为如下几类:
(1)窗口和窗框类:JWindow,JColorChooser,JComponent,JDesktopPane,JDialog,JEditorPane,JFileChooser,JFrame,JInternalFrame,JLayeredPane,JOptionPane,JRootPane,JScrollPane,JSplitPane,JTabbedPane;
(2)按钮类:JButton,JToggleButton,JCheckBox,JCheckBoxMenuItem,JComboBox,JRadioButton,JRadioButtonMenuItem;
(3)菜单类:JMenu,JMenuBar,JMenuItem,JPopupMenu;
(4)文本输入类:JTextArea,JTextComponent,JTextField,JPasswordField;
(5)其它:JTree,JViewPort,JScrollBar,JSeparator,JSlider,JSpinner,JTable,JTableHeader,JToolBar,JToolTip,JLabel,JList,JProgressBar。
虽然这些控件有各自的使用方法,但是,将某个变量定义为某种控件的方式是由语言本身的规范确定的,因此,可以根据这些规范,采用统一的方法辨识这些控件。
2、变量定义方式
对控件变量的定义方式主要有2种:
(1)变量声明
在程序设计语言中,变量声明负责指出某变量的存在以及其相关的性质,但并不对其进行初始化。
例如:private javax.swing.JButton computeButton;该语句定义了类型为javax.swing.JButton的变量computeButton。
(2)变量定义
在程序设计语言中,变量定义不仅负责指出某变量的存在以及其相关的性质,还需要对其进行初始化。
例如:javax.swing.JMenu fileMenu=newjavax.swing.JMenu();
该语句定义了类型为javax.swing.JMenu的变量fileMenu并使用new语句对其进行了初始化。
3、控件辨识方法
通过在抽象语法树中对上述两种定义方式进行搜索,同时结合符号表中的内容,就可以辨识出源代码中所有的控件及其变量。
如图5所示,是本发明中控件辨识方法的工作流程图。
通过遍历抽象语法树和查找符号表,可以生成GUI控件列表,可以采用算法3进行表达。
算法3.GEL_AST_SymTable(AST,SymTable)描述了GUI控件辨识算法。
算法3.GEL_AST_SymTable(AST,SymTable)
输入AST:源代码的抽象语法树
输入SymTable:源代码的符号表
输出GEL:源代码中的GUI控件列表
1.GEL<-[];
2.遍历AST的所有叶子节点Node
3.if(LookUpType(SymTable,Node)=GUI控件类型)
4.GEL<-Node::GEL
5.Return GEL
算法3的第1步初始化返回值GEL为空列表;第2步至第4步开始遍历抽象语法树AST;其中第3步调用函数LookUpType(SymTable,Node)判断叶子节点Node是否为GUI控件类型,如果是,则在第4步将该节点加入返回值GEL列表;抽象语法树AST遍历完成后,第5步将GUI控件列表GEL返回。
步骤303:代码控件映射分析。采用深度优先搜索技术,遍历抽象语法树和GUI控件列表,生成代码控件映射表。
代码与控件映射处理模块103用于生成被测程序的源代码与GUI控件的代码控件映射表。通过分析代码中对GUI控件的定义和使用的语句,得到代码控件映射表,工作流程可以使用算法1描述。
算法1.GetGUICodeMap(P)
输入P:源代码
输出T:代码控件映射表
1.(AST,SymTable)<-Lexical_Syntax_Analyze(P)
2.GUIEmtList<-GEL_AST_SymTable(AST,SymTable)
3.T<-GCM_AST_GEL(AST,GUIEmtList)
4.Return T
算法1的第1步以P(被测软件的源代码)为参数调用函数Lexical_Syntactax_Analyze,得到P的抽象语法树AST和符号表SymTable;第2步以AST和SymTable为参数调用算法GEL_AST_SymTable,得到P的GUI控件列表GUIEmtList;第3步以AST和GUIEmtList为参数调用算法GCM_AST_GEL,得到代码控件映射表T;第4步将结果返回。
1.GUI控件声明和定义
在使用一个GUI控件之前,需要通过声明和定义一个控件类型的对象来定义该控件。例如:在下面的代码中,首先声明一个MenuBar类型的对象menuBar,然后使用一个new语句对该对象进行定义。
Figure BDA0000095618470000091
2.GUI控件使用
对GUI控件的使用是通过对控件对象的方法的调用来实现的。以常用的JButton类型的按钮控件为例,当按钮被按下时,通常会执行某个用户定义的函数。用户通过向按钮的addActionListener函数传递一个ActionLisener函数来完成上述的功能。在ActionListener函数中,用户需要实现actionPerformed函数,该函数就是按钮被按下时执行的动作,如果用户希望执行自己定义的某个函数,则可以将该函数加入到actionPerformed函数中。
例如,在下面的代码中    □
Figure BDA0000095618470000101
openButton是一个JButton类型的按钮,通过将openButtonActionPerformed函数加入到ActionListener函数中的actionPerformed函数体中,可以实现当openButton按钮被按下时调用openButtonActionPerformed函数。
如图6所示,是本发明中代码控件映射分析的主要工作流程图,过程由算法4描述。
算法4.GCM_AST_GEL(AST,GUIEmtList)
输入AST:源代码的抽象语法树
输入GUIEmtList:源代码中的GUI控件列表
输出T:代码控件的双向映射表
1.T<-Null
2.遍历GUIEmtList中的所有GUI控件GEmt1
3遍历AST
4.GCode<-AST中与GEmt1对应的代码段
5.T<-T::[GEmt1,GCode]
6.Return T
算法4的工作过程是:第1步将返回值T初始化为空;第2步遍历GUIEmtList中的所有GUI控件GEmt1;第3步遍历抽象语法树AST;第4步找到GEmt1控件对应的源代码段;第5步将GEmt1和GCode的映射加入到T中;第6步将结果返回。
代码覆盖与功能覆盖映射模块104用于将代码覆盖信息转换为功能覆盖信息。在运行过程中,白盒测试工具101能够获取测试用例所覆盖的源程序代码,这些覆盖信息以文件方式保存,不同的工具其文件格式不同,本优选实施例中使用常用的Codetest工具,通过分析其idb文件,获取代码覆盖信息。
如图7所示,是本发明中代码覆盖与功能覆盖映射的工作流程图,代码覆盖与功能覆盖映射模块104根据输入的未覆盖代码信息,通过对代码控件映射表进行搜索,得到相关未覆盖的GUI控件列表。通过遍历未覆盖代码并扫描代码控件映射表,可以生成未覆盖GUI控件列表。
算法5.NCGL_NCC_T(NCC,T)描述了未覆盖GUI控件列表生成算法。
算法5.NCGL_NCC_T(NCC,T)
输入NCC:未覆盖代码行号
输入T:代码控件映射表
输出NCGL:未覆盖GUI控件列表
1.NCGL<-[];
2.遍历NCC中的所有代码片段
3.NCG<-T中与NCC对应的GUI控件
4.NCGL<-NCG::NCGL
5.Return NCGL
算法5的第1步初始化返回值NCGL为空列表;第2步至第4步开始遍历NCC;其中第3步从T中寻找对应的GUI控件;第4步将该GUI控件加入返回值NCGL列表;NCC遍历完成后,第5步将未覆盖GUI控件列表NCGL返回。
下面以一个具体实施例,对本发明技术方案作进一步验证。利用本发明,根据测试用例所覆盖的代码信息,生成其对应的功能覆盖。
1 public class AnaSwingFirstView extends FrameView{
2 private void initComponents(){
3 menuBar=newjavax.swing.JMenuBar(),定义了一个菜单条manuBar;
4 javax.swing.JMenu fileMenu=new javax.swing.JMenu(),定义了一个菜单fileMenu;
5 javax.swing.JMenuItem exitMenuItem=new javax.swing.JMenuItem(),定义了一个菜单项exitMenuItem;
6 testMenu=newjavax.swing.JMenu(),定义了菜单testMenu;
7 popTestMenuItem1=new javax.swing.JMenuItem(),定义了菜单项popTestMenuItem1;
8 popTestMenuItem2=new javax.swing.JMenuItem(),定义了菜单项popTestMenuItem2;
9 menuBar.setName(″menuBar″);设定menuBar的显示字符;
10 fileMenu.add(exitMenuItem),将exitMenuItem加入到fileMenu作为其菜单项;
11 fileMenu.setText(resourceMap.getString(″fileMenu.text″)),将fileMenu的显示字符设置为fileMenu.text(文件);
12 exitMenuItem.setText(resourceMap.getString(″exitMenuItem.text″)),将exitMenuItem的显示字符设置为exitMenuItem.text(退出);
13 menuBar.add(fileMenu),将fileMenu加入到menuBar作为其菜单;
14 testMenu.setText(resourceMap.getString(″testMenu.text″)),将testMenu的显示字符设置为testMenu.text(测试菜单);
15
popTestMenuItem1.setText(resourceMap.getString(″popTestMenuItem1.text″)),将popTestMenuItem1的显示字符设置为popTestMenuItem1.text(测试菜单项1);
16 popTestMenuItem1.addActionListener(newjava.awt.event.ActionListener(){,定义了当popTestMenuItem1被点击时所执行的操作;
17 public void actionPerformed(java.awt.event.ActionEvent evt){
18 popTestMenuItem1 ActionPerPermed(evt);
19 }
20 });
21
popTestMenuItem2.setText(resourceMap.getString(″popTestMenuItem2.text″)),将popTestMenuItem2的显示字符设置为popTestMenuItem2.text(测试菜单项2);
22 testMenu.add(popTestMenuItem1),将popTestMenuItem1加入到testMenu作为其菜单项;
23 testMenu.add(popTestMenuItem2),将popTestMenuItem2加入到testMenu作为其菜单项;
24 menuBar.add(testMenu),将testMenu加入到menuBar作为其菜单;
25 }
26 private void
popTestMenuItem1ActionPerformed(java.awt.event.ActionEvent evt){,定义了popTestMenuItem 1ActionPerformed函数;
27 openTest(evt);
28 }
29 private Void openTest(java.awt.event.ActionEvent evt){,定义了openTest函数;
30 JFrame popFrame=new JFrame(″弹出窗口″),定义了弹出窗口(popFrame);
31 JButton pfButton1=new JButton(″测试按钮″),定义了按钮testButton,并将其显示字符设置为测试按钮;
32 popFrame.add(pfButton1),将pfButton1加入到popFrame中;
33 popFrame.setVisible(true),将popFrame设为可见。
34 }
35 }
如图8所示,是本发明中第6行至第8行代码的抽象语法树,如图9所示,是本发明中第22行到第24行代码的抽象语法树。首先,使用本方案中的算法2对以上示例代码进行词法和语法分析,得到其抽象语法树(图8,图9)和符号表(表1)。
表1:示例代码片段的符号表
  标识符   类型   定义所在行号
  menuBar   JMenuBar   3
  fileMenu   JMenu   4
  exitMenuItem   JMenuItem   5
  testMenu   JMenu   6
  popTestMenuItem 1   JMenuItem   7
  popTestMenuItem 2   JMenuItem   8
  popFrame   JFrame   30
  pfButton 1   JButton   31
表1给出了示例代码片段的符号表。其中,共有8个符号,符号表中记录了它们的类型以及在源代码中被定义时的行号。
根据示例代码片段的抽象语法树和符号表,使用本方案中的算法3进行GUI控件辨识,从而得到其GUI控件列表,如表2所示。
表2:GUI控件列表
  标识符  显示字符   类型
  menuBar  无   JMenuBar
  fileMenu  文件   JMenu
  exitMenuItem  退出   JMenuItem
  testMenu  测试菜单   JMenu
  popTestMenuItem 1  测试菜单项1   JMenuItem
  popTestMenuItem 2  测试菜单项2   JMenuItem
  popFrame  弹出窗口   JFrame
  pfButton 1  测试按钮   JButton
如图10所示,是本发明中示例代码所对应的实际软件主界面示意图。如图11所示,是本发明示例代码中“测试菜单项1”引导的弹出窗口界面示意图。在点击“测试菜单项1”之后,将弹出一个窗口,该窗口中具有一个“测试按钮”。
根据其抽象语法树和GUI控件列表,使用本方案中的算法4生成代码控件映射表,如表3所示。
表3:代码控件映射表
Figure BDA0000095618470000151
使用白盒测试工具101进行代码覆盖率测试时,在执行点击除“测试菜单项1”之外的其它控件后,白盒测试工具101给出的代码覆盖率结果如下面的代码段所示。
1 public class AnaSwingFirstView extends FrameView{
2 private void initComponents(){
3 menuBar=newjavax.swing.JMenuBar(),定义了一个菜单条manuBar;
4 javax.swing.JMenu fileMenu=new javax.swing.JMenu(),定义了一个菜单fileMenu;
5 javax.swing.JMenuItem exitMenuItem=new javax.swing.JMenuItem(),定义了一个菜单项exitMenuItem;
6 testMenu=newjavax.swing.JMenu(),定义了菜单testMenu;
7 popTestMenuItem1=new javax.swing.JMenuItem(),定义了菜单项popTestMenuItem1;
8 popTestMenuItem2=new javax.swing.JMenuItem(),定义了菜单项popTestMenuItem2;
9 menuBar.setName(″menuBar″);设定menuBar的显示字符;
10 fileMenu.add(exitMenuItem),将exitMenuItem加入到fileMenu作为其菜单项;
11 fileMenu.setText(resourceMap.getString(″fileMenu.text″)),将fileMenu的显示字符设置为fileMenu.text(文件);
12 exitMenuItem.setText(resourceMap.getString(″exitMenuItem.text″)),将exitMenuItem的显示字符设置为exitMenuItem.text(退出);
13 menuBar.add(fileMenu),将fileMenu加入到menuBar作为其菜单;
14 testMenu.setText(resourceMap.getString(″testMenu.text″)),将testMenu的显示字符设置为testMenu.text(测试菜单);
15
popTestMenuItem1.setText(resourceMap.getString(″popTestMenuItem1.text″)),将popTestMenuItem1的显示字符设置为popTestMenuItem1.text(测试菜单项1);
16 popTestMenuItem1.addActionListener(newjava.awt.event.ActionListener(){,定义了当popTestMenuItem1被点击时所执行的操作;
17 public void actionPerformed(java.awt.event.ActionEvent evt){
18 popTestMenuItem1ActionPerformed(evt);
19 }
20 });
21
popTestMenuItem2.setText(resourceMap.getString(″popTestMenuItem2.text″)),将popTestMenuItem2的显示字符设置为popTestMenuItem2.text(测试菜单项2);
22 testMenu.add(popTestMenuItem1),将popTestMenuItem1加入到testMenu作为其菜单项;
23 testMenu.add(popTestMenuItem2),将popTestMenuItem2加入到testMenu作为其菜单项;
24 menuBar.add(testMenu),将testMenu加入到menuBar作为其菜单;
25 }
26 private voidpopTestMenuItem1ActionPerformed(java.awt.event.ActionEvent evt){,定义了popTestMenuItem1ActionPerformed函数;
27 openTest(evt);
28 }
29 private void openTest(java.awt.event.ActionEvent evt){,定义了openTest函数;
30 JFrame popFrame=new JFrame(″弹出窗口″),定义了弹出窗口(popFrame);
31 JButton pfButton1=new JButton(″测试按钮″),定义了按钮testButton,并将其显示字符设置为测试按钮;
32 popFrame.add(pfButtonl),将pfButton1加入到popFrame中;
33 popFrame.setVisible(true),将popFrame设为可见。
34 }
35 }
通过白盒测试工具101,测试人员能够直观掌握测试用例所覆盖的代码。其中第1-28行标为绿色(本文中用正体表示),表示已经覆盖;而第29-34行标为红色(本文中用斜体表示),表示尚未覆盖。在此基础上,根据覆盖率要求,通过人工分析代码,设计新的测试用例覆盖那些没有被覆盖的代码,由于需要对代码进行人工分析,因此,这种方法一是对测试人员的要求高,二是效率低。为了解决这些问题,本发明采用代码与软件功能映射方法,通过之前得到的代码控件映射表,将代码覆盖转换为功能覆盖,测试人员通过功能覆盖信息,可以简单、直观地设计出新的测试用例设计,这也是本发明最突出的特点。
实现上述方案的步骤如下。
步骤1:通过查询代码控件映射表(表3),使用算法5,可以得到:第29-34行代码对应于“测试菜单项1”。即:已经执行的测试用例没有覆盖到“测试菜单项1”的某些功能,因此,需要针对该控件设计新的测试用例。
步骤2:要覆盖“测试菜单项1”,需要的新的测试用例为:测试菜单->测试菜单项1->弹出按钮。即:首先点击“测试菜单”,然后点击“测试菜单项1”,然后点击“弹出按钮”。
综上所述,通过对源代码的词法和语法分析、GUI控件辨识和代码控件映射分析3个步骤,就可以得到代码控件映射表;然后,根据白盒测试工具给出的未覆盖的代码信息以及本方案中给出的代码控件映射表,就可以得到未覆盖的软件功能,据此,测试人员可以方便地设计出覆盖这些功能的新的测试用例。

Claims (10)

1.一种代码与功能覆盖映射***,包括白盒测试工具,所述白盒测试工具用于提取并显示出测试用例的代码覆盖信息,其特征在于:还包括代码覆盖信息提取模块、代码与控件映射处理模块和代码覆盖与功能覆盖映射模块,其中,
代码覆盖信息提取模块,用于接收从所述白盒测试工具发送的代码覆盖信息,并从所述代码覆盖信息中提取出所覆盖的程序语句,并将所述程序语句发送给所述代码覆盖与功能覆盖映射模块;
代码与控件映射处理模块,用于分析程序语句中源程序代码、构建语法树和符号表,在此基础上实现源程序代码与软件界面控件的映射,并将映射关系发送给代码覆盖与功能覆盖映射模块;
代码覆盖与功能覆盖映射模块,用于根据所述源程序代码与软件界面控件的映射关系将所述程序语句转换为功能覆盖信息。
2.如权利要求1所述的代码与功能覆盖映射***,其特征在于:所述代码与控件映射处理模块进行词法和语法分析时,所述词法和语法分析采用类编译原理技术,对被测软件源代码进行词法和语法分析,通过分析得到所述抽象语法树和符号表。
3.如权利要求2所述的代码与功能覆盖映射***,其特征在于:所述代码与控件映射处理模块在图形用户界面GUI控件辨识过程中采用深度优先搜索技术,遍历所述抽象语法树和符号表,得到源代码中所有的GUI控件。
4.如权利要求3所述的代码与功能覆盖映射***,其特征在于:所述代码与控件映射处理模块用于生成被测程序的源代码与GUI控件的代码控件映射表,通过分析代码中对GUI控件的定义和使用的语句,得到代码控件映射表。
5.如权利要求1所述的代码与功能覆盖映射***,其特征在于:所述代码覆盖与功能覆盖映射模块根据输入的未覆盖代码信息,通过对代码控件映射表进行搜索,得到相关未覆盖的图形用户界面GUI控件列表,通过遍历未覆盖代码并扫描代码控件映射表生成未覆盖GUI控件列表。
6.一种代码与功能覆盖映射方法,包括:
白盒测试工具用于提取并显示出测试用例的代码覆盖信息,并发送给代码覆盖信息提取模块;
代码覆盖信息提取模块接收从所述白盒测试工具发送的代码覆盖信息,并从所述代码覆盖信息中提取出所覆盖的程序语句,并将所述程序语句发送给所述代码覆盖与功能覆盖映射模块;
代码与控件映射处理模块分析程序语句中源程序代码、构建语法树和符号表,在此基础上实现源程序代码与软件界面控件的映射,并将映射关系发送给代码覆盖与功能覆盖映射模块;
代码覆盖与功能覆盖映射模块根据所述源程序代码与软件界面控件的映射关系将所述程序语句转换为功能覆盖信息。
7.如权利要求6所述的代码与功能覆盖映射方法,其特征在于:所述代码与控件映射处理模块进行词法和语法分析时,词法和语法分析采用类编译原理技术,对被测软件源代码进行词法和语法分析,通过分析得到抽象语法树和符号表。
8.如权利要求7所述的代码与功能覆盖映射方法,其特征在于:所述代码与控件映射处理模块在图形用户界面GUI控件辨识过程中采用深度优先搜索技术,遍历所述抽象语法树和符号表,得到源代码中所有的GUI控件。
9.如权利要求8所述的代码与功能覆盖映射方法,其特征在于:所述代码与控件映射处理模块用于生成被测程序的源代码与GUI控件的代码控件映射表,通过分析代码中对GUI控件的定义和使用的语句,得到代码控件映射表。
10.如权利要求6所述的代码与功能覆盖映射方法,其特征在于:所述代码覆盖与功能覆盖映射模块根据输入的未覆盖代码信息,通过对代码控件映射表进行搜索,得到相关未覆盖的图形用户界面GUI控件列表,通过遍历未覆盖代码并扫描代码控件映射表生成未覆盖GUI控件列表。
CN201110295759.3A 2011-09-28 2011-09-28 代码与功能覆盖映射***及其覆盖映射方法 Active CN102436417B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201110295759.3A CN102436417B (zh) 2011-09-28 2011-09-28 代码与功能覆盖映射***及其覆盖映射方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201110295759.3A CN102436417B (zh) 2011-09-28 2011-09-28 代码与功能覆盖映射***及其覆盖映射方法

Publications (2)

Publication Number Publication Date
CN102436417A true CN102436417A (zh) 2012-05-02
CN102436417B CN102436417B (zh) 2014-08-06

Family

ID=45984492

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201110295759.3A Active CN102436417B (zh) 2011-09-28 2011-09-28 代码与功能覆盖映射***及其覆盖映射方法

Country Status (1)

Country Link
CN (1) CN102436417B (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102831057A (zh) * 2012-08-13 2012-12-19 于秀山 一种用功能图分析软件功能变更及其影响的方法
CN104657256A (zh) * 2013-11-19 2015-05-27 阿里巴巴集团控股有限公司 一种收集用例与代码之间映射关系的方法和装置
CN106371999A (zh) * 2016-10-20 2017-02-01 腾讯科技(深圳)有限公司 程序代码测试方法及装置
CN109977030A (zh) * 2019-04-26 2019-07-05 北京信息科技大学 一种深度随机森林程序的测试方法及设备

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101436128A (zh) * 2007-11-16 2009-05-20 北京邮电大学 软件测试用例自动生成方法及***
US20100146340A1 (en) * 2008-12-09 2010-06-10 International Business Machines Corporation Analyzing Coverage of Code Changes
CN101916225A (zh) * 2010-09-02 2010-12-15 于秀山 图形用户界面软件功能覆盖测试方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101436128A (zh) * 2007-11-16 2009-05-20 北京邮电大学 软件测试用例自动生成方法及***
US20100146340A1 (en) * 2008-12-09 2010-06-10 International Business Machines Corporation Analyzing Coverage of Code Changes
CN101916225A (zh) * 2010-09-02 2010-12-15 于秀山 图形用户界面软件功能覆盖测试方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
许彤等: "嵌入式处理器在片调试功能的验证", 《计算机辅助设计与图形学学报》 *
隋颖等: "GUI软件测试文档辅助工具的设计与实现", 《计算机技术与发展》 *

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102831057A (zh) * 2012-08-13 2012-12-19 于秀山 一种用功能图分析软件功能变更及其影响的方法
CN102831057B (zh) * 2012-08-13 2015-02-11 于秀山 一种用功能图分析软件功能变更及其影响的方法
CN104657256A (zh) * 2013-11-19 2015-05-27 阿里巴巴集团控股有限公司 一种收集用例与代码之间映射关系的方法和装置
CN104657256B (zh) * 2013-11-19 2018-07-31 阿里巴巴集团控股有限公司 一种收集用例与代码之间映射关系的方法和装置
CN106371999A (zh) * 2016-10-20 2017-02-01 腾讯科技(深圳)有限公司 程序代码测试方法及装置
CN106371999B (zh) * 2016-10-20 2019-08-06 腾讯科技(深圳)有限公司 程序代码测试方法及装置
CN109977030A (zh) * 2019-04-26 2019-07-05 北京信息科技大学 一种深度随机森林程序的测试方法及设备
CN109977030B (zh) * 2019-04-26 2022-04-19 北京信息科技大学 一种深度随机森林程序的测试方法及设备

Also Published As

Publication number Publication date
CN102436417B (zh) 2014-08-06

Similar Documents

Publication Publication Date Title
CN112100054B (zh) 一种面向数据管控的程序静态分析方法和***
CN102831057B (zh) 一种用功能图分析软件功能变更及其影响的方法
CN100487667C (zh) 一种软件单元测试自动化***及其方法
US10831456B1 (en) External code integrations within a computing environment
CN106709356A (zh) 基于静态污点分析和符号执行的安卓应用漏洞挖掘方法
US9747190B2 (en) Analysis system, analysis method, and computer program product
CN102243586B (zh) 一种软件功能图自动获取方法
CN108614707A (zh) 静态代码检查方法、装置、存储介质和计算机设备
US20180314519A1 (en) Method and apparatus for analyzing impact of software change
CN109508298B (zh) 图形化的脚本测试方法及***
CN109308289A (zh) 一种日志解析模板及基于该模板的日志解析方法
CN104035873A (zh) 测试代码生成方法及生成装置
CN102436417B (zh) 代码与功能覆盖映射***及其覆盖映射方法
CN103150200A (zh) 一种计算机语言转换***及c语言到msvl语言的转换方法
CN103914379A (zh) 故障自动注入与故障检测的方法及其***
CN105243018A (zh) 一种面向对象的类测试数据生成方法
CN115270131A (zh) 一种Java反序列化漏洞检测方法及***
CN108563561B (zh) 一种程序隐性约束提取方法及***
CN106295346A (zh) 一种应用漏洞检测方法、装置及计算设备
CN102681932B (zh) 一种检测软件异常输入处理正确性的方法
CN103235757B (zh) 基于自动化造数对输入域测试对象进行测试的装置和方法
CN102087629A (zh) 一种基于Agent嵌入式软件的不变量测试方法与工具
Pan et al. Class structure refactoring of object-oriented softwares using community detection in dependency networks
CN109491884A (zh) 代码性能检测方法、装置、计算机设备和介质
US10642714B2 (en) Mapping dynamic analysis data to source code

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
TR01 Transfer of patent right

Effective date of registration: 20230418

Address after: No. 66, Zizhuyuan Road, Haidian District, Beijing 100048

Patentee after: China Software Evaluation Center

Address before: 4101, Building 3, Yard 6, Wanshou Road, Haidian District, Beijing, 100036

Patentee before: Yu Xiushan

TR01 Transfer of patent right