法律状态公告日
法律状态信息
法律状态
2023-04-28
专利权的转移 IPC(主分类):G06F11/36 专利号:ZL2011102957593 登记生效日:20230418 变更事项:专利权人 变更前权利人:于秀山 变更后权利人:中国软件评测中心(工业和信息化部软件与集成电路促进中心) 变更事项:地址 变更前权利人:100036 北京市海淀区万寿路6号院3号楼4101 变更后权利人:100048 北京市海淀区紫竹院路66号
专利申请权、专利权的转移
2014-08-06
授权
授权
2012-06-27
实质审查的生效 IPC(主分类):G06F11/36 申请日:20110928
实质审查的生效
2012-05-02
公开
公开
技术领域
本发明涉及软件功能测试领域,特别涉及一种代码与功能覆盖映射系统 及其覆盖映射方法。
背景技术
白盒测试与黑盒测试是软件测试采用的两种主要方法。在白盒测试领域, 为了准确掌握测试用例对代码的覆盖情况,陆续推出了商业化的测试工具, 有代表性的有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语句对该对象进行定义。
2.GUI控件使用
对GUI控件的使用是通过对控件对象的方法的调用来实现的。以常用的 JButton类型的按钮控件为例,当按钮被按下时,通常会执行某个用户定义的 函数。用户通过向按钮的addActionListener函数传递一个ActionLisener函数 来完成上述的功能。在ActionListener函数中,用户需要实现actionPerformed 函数,该函数就是按钮被按下时执行的动作,如果用户希望执行自己定义的 某个函数,则可以将该函数加入到actionPerformed函数中。
例如,在下面的代码中 □
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(new java.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:示例代码片段的符号表
表1给出了示例代码片段的符号表。其中,共有8个符号,符号表中记 录了它们的类型以及在源代码中被定义时的行号。
根据示例代码片段的抽象语法树和符号表,使用本方案中的算法3进行 GUI控件辨识,从而得到其GUI控件列表,如表2所示。
表2:GUI控件列表
如图10所示,是本发明中示例代码所对应的实际软件主界面示意图。如 图11所示,是本发明示例代码中“测试菜单项1”引导的弹出窗口界面示意 图。在点击“测试菜单项1”之后,将弹出一个窗口,该窗口中具有一个“测 试按钮”。
根据其抽象语法树和GUI控件列表,使用本方案中的算法4生成代码控 件映射表,如表3所示。
表3:代码控件映射表
使用白盒测试工具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(new java.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 void popTestMenuItem1ActionPerformed(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个步骤,就可以得到代码控件映射表;然后,根据白盒测试工具 给出的未覆盖的代码信息以及本方案中给出的代码控件映射表,就可以得到 未覆盖的软件功能,据此,测试人员可以方便地设计出覆盖这些功能的新的 测试用例。
机译: 用于产生正交码(OCC)的代码覆盖范围的设备和方法,以及用于映射occ的设备和方法
机译: 用于调试包含内存映射的调试方法,该方法能够使引导加载程序不被覆盖在操作系统的加载终端的便携式终端中
机译: 用于广播频道覆盖增强的资源映射的系统和方法