CN103365775B - 基于内部状态检查的单元测试方法 - Google Patents

基于内部状态检查的单元测试方法 Download PDF

Info

Publication number
CN103365775B
CN103365775B CN201310250702.0A CN201310250702A CN103365775B CN 103365775 B CN103365775 B CN 103365775B CN 201310250702 A CN201310250702 A CN 201310250702A CN 103365775 B CN103365775 B CN 103365775B
Authority
CN
China
Prior art keywords
constraint
code
test method
pitching pile
unit test
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.)
Expired - Fee Related
Application number
CN201310250702.0A
Other languages
English (en)
Other versions
CN103365775A (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.)
Peking University
Original Assignee
Peking 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 Peking University filed Critical Peking University
Priority to CN201310250702.0A priority Critical patent/CN103365775B/zh
Publication of CN103365775A publication Critical patent/CN103365775A/zh
Application granted granted Critical
Publication of CN103365775B publication Critical patent/CN103365775B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

一种基于内部状态检查的单元测试方法,其特征在于,用户在测试用例中编写内部状态约束,所述约束为执行到被测代码的目标位置时,相关变量应满足的算术或逻辑约束,从而最终实现对被测代码内部状态进行检查。通过本发明,软件开发者可以在测试用例中添加对被测代码中间状态的检查,使开发者可以只编写较少的测试用例就能发现更多的错误,而且帮助开发者更快地排查错误,提高了开发者进行的测试的效率。

Description

基于内部状态检查的单元测试方法
技术领域
本发明提供一种单元测试方法,具体涉及一种针对内部状态的测试预言,属于软件测试领域。
背景技术
软件测试是保证软件质量和可靠性的一种重要技术,开销在整个软件开发成本中占很大比重。随着测试驱动开发的流行,开发者需要花大量时间在测试和调试工作上。对于开发者,编写测试用例和根据测试的失败信息进行调试是一个非常耗费精力和时间的任务。如何有效地进行测试,减轻开发人员的负担,成为测试领域的一个重要问题。
现有的单元测试工具的测试用例通常包含两个部分:测试输入和测试预言。测试输入包含变量的初始化和对被测代码的一系列调用。测试预言是用来验证一个测试用例是运行通过还是失败。开发者编写好测试用例后,测试框架就能自动运行这些测试用例,完成对被测代码的测试。对于开发者,手动编写测试用例是一个非常繁重的工作,往往不能编写足够的测试用例对被测代码进行彻底的测试。有些测试用例虽然能够通过,但其中间状态是不合法的,这些不合法的中间状态往往代表着错误的存在。这样就可能漏掉很多错误。
开发者根据失败单元测试用例去分析定位错误是一个非常复杂耗时的过程。测试用例运行失败后,开发者看到的只是错误的征兆,但这些错误的外部表现和内在原因没有明显的联系。在组成程序的众多元素中,每个元素都有可能导致错误的产生。开发者往往只能根据经验一个一个地去排查这些可能导致测试用例失败的因素,而这是一个非常耗时的过程。如果在测试用例中能检查被测代码的中间状态,就能将被测代码进行切分,帮助开发者更快的排查错误。
发明内容
针对单元测试中的上述不足,本发明提供了一种基于内部状态检查的单元测试方法。通过本发明,开发者可以只编写较少测试用例,而发现更多的错误;还能在调试阶段更快地排查错误。
本发明的基本原理:使用者在测试用例中添加被测代码中间状态的约束,约束形如,在运行到目标位置(如,classA的代码中第i行)时,须满足“a+b==5”,a、b可以是在目标位置有效的局部变量和属性等。
本发明的技术方案如下:
一种基于内部状态检查的单元测试方法,其特征在于,用户在测试用例中编写内部状态约束,所述约束为执行到被测代码的目标位置时,相关变量应满足的算术或逻辑约束,从而最终实现对被测代码内部状态进行检查。
优选的,所述的单元测试方法,包括如下步骤:
A.使用者在测试用例中添加被测代码中间状态的约束;
B.根据用户添加的约束生成插桩代码(如,Java字节码),插桩代码的功能是:获取所关心的变量的值,并将其传出,调用验证方法对约束进行验证;
C.从执行环境(如JVM)中获取目标类的字节码;
D.对目标字节码进行插桩;
E.将插桩后的字节码装载进执行环境中,替换原来的可执行代码;
F.运行测试用例,完成验证。
所述的单元测试方法,其特征在于,所述步骤A包括:
A1.确定约束的内容,约束形如,在运行到目标位置(如,classA的代码中第i行)时,须满足“a+b==5”,a、b可以是在目标位置有效的局部变量和属性等;
A2.在测试用例中调用工具的添加约束的接口,添加上述约束的内容。
所述的单元测试方法,其特征在于,所述步骤B包括:
B1.对约束的主体部分解析,提取出相关的变量;
B2.根据提取的相关变量,生成插桩的字节码。
所述的单元测试方法,其特征在于,所述步骤B包括:不提取相关变量,直接获取目标位置有效的全部变量和属性,简化实现时的工作和简化了插桩代码。
所述的单元测试方法,其特征在于,所述步骤D包括:
D1.在目标字节码中找到目标位置(如,目标代码中第15行);
D2.在目标位置插入上面生成的插桩代码;
D3.修改目标字节码,使整体保持合法性。
所述的单元测试方法,其特征在于,所述步骤F包括:
F1.运行到目标位置时,运行插桩代码,获取相关变量的值;
F2.调用验证函数,结合获取的变量值和约束主体判断约束是否满足;
F3.运行结束,展示运行结果。所述的运行结果包括:测试用例的通过、失败数,以及失败用例的错误路径等。
通过本发明,软件开发者可以在测试用例中添加对被测代码中间状态的检查,使开发者可以只编写较少的测试用例就能发现更多的错误,而且帮助开发者更快地排查错误,提高了开发者进行的测试的效率。
附图说明
图1是实施例中未添加中间状态约束的输出结果。
图2是实施例中添加中间状态约束的输出结果。
表1是实施例中的被测代码。
表2是实施例中的未添加中间状态检查的测试用例的示意代码。
表3是实施例中的添加对中间状态的约束的测试用例的示意代码。
具体实施方式
实施例:
针对如表1所示的被测代码,被测方法的作用是,计算3个输入(a,b,c)中最大值和最小值的公约数。
表1
使用如表2所示,未添加中间状态检查的测试用例进行测试,
表2
表2测试结果如图1所示。结果显示,有一个测试用例运行失败,开发人员需要根据这条失败的测试用例进行调试,找出错误并修正,但这是一项非常困难的任务。
利用本发明,在测试用例中添加对中间状态的约束,测试用例如表3。
表3
对约束的说明:在测试方法cal1中:Controller.addCheck(8,1,cal,2,”max”)表示的约束是,在第1次运行到cal对象代码中第8行(max=getMax(a,b,c))后,max的值应该是2(其余约束语句的含义与此雷同)。执行以上测试用例,运行结果如图2所示。发现与前面的结果不同,第3、4个测试用例都运行失败。查看失败用例的错误路径,都是在max处的约束没能满足。
对于cal3中的约束Controller.addCheck(8,1,cal,6,“max”),max的期望值是6,但实际运行时的值是2。
对于cal4中的约束Controller.addCheck(8,1,cal,6,“max”),max的期望值是6,但实际运行时的值是4。
根据上面的情况,基本确定是方法getMax的问题。检查getMax的代码发现,getMax其实实现的找出最小值的功能,才导致了以上错误。通过使用本发明,软件开发者能更快地确定出错位置是方法getMax,提高了开发者测试的效率。
以上所述实施例仅表达了本发明的一种实施方式,其描述较为具体和详细,但不能因此理解为对本发明专利范围的限制。

Claims (7)

1.一种基于内部状态检查的单元测试方法,其特征在于,用户在测试用例中编写内部状态约束,所述约束为执行到被测代码的目标位置时,相关变量应满足的算术或逻辑约束,从而最终实现对被测代码内部状态进行检查,具体包括如下步骤:
A.使用者在测试用例中添加被测代码中间状态的约束;
B.根据用户添加的约束生成插桩代码,插桩代码的功能是:获取所关心的变量的值,并将其传出,调用验证方法对约束进行验证;
C.从执行环境中获取目标类的字节码;
D.对目标字节码进行插桩;
E.将插桩后的字节码装载进执行环境中,替换原来的可执行代码;
F.运行测试用例,完成验证。
2.如权利要求1所述的单元测试方法,其特征在于,所述步骤A包括:
A1.确定约束的内容;
A2.在测试用例中调用工具的添加约束的接口,添加上述约束的内容。
3.如权利要求1所述的单元测试方法,其特征在于,所述步骤B包括:
B1.对约束的主体部分解析,提取出相关的变量;
B2.根据提取的相关变量,生成插桩的字节码。
4.如权利要求1所述的单元测试方法,其特征在于,所述步骤B包括:不提取相关变量,直接获取目标位置有效的全部变量和属性,简化实现时的工作和简化了插桩代码。
5.如权利要求1所述的单元测试方法,其特征在于,所述步骤D包括:
D1.在目标字节码中找到目标位置;
D2.在目标位置插入上面生成的插桩代码;
D3.修改目标字节码,使整体保持合法性。
6.如权利要求1所述的单元测试方法,其特征在于,所述步骤F包括:
F1.运行到目标位置时,运行插桩代码,获取相关变量的值;
F2.调用验证函数,结合获取的变量值和约束主体判断约束是否满足;
F3.运行结束,展示运行结果。
7.如权利要求6所述的单元测试方法,其特征在于,步骤F3所述的运行结果包括:测试用例的通过、失败数,以及失败用例的错误路径。
CN201310250702.0A 2013-06-21 2013-06-21 基于内部状态检查的单元测试方法 Expired - Fee Related CN103365775B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201310250702.0A CN103365775B (zh) 2013-06-21 2013-06-21 基于内部状态检查的单元测试方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201310250702.0A CN103365775B (zh) 2013-06-21 2013-06-21 基于内部状态检查的单元测试方法

Publications (2)

Publication Number Publication Date
CN103365775A CN103365775A (zh) 2013-10-23
CN103365775B true CN103365775B (zh) 2016-04-06

Family

ID=49367180

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201310250702.0A Expired - Fee Related CN103365775B (zh) 2013-06-21 2013-06-21 基于内部状态检查的单元测试方法

Country Status (1)

Country Link
CN (1) CN103365775B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108959079B (zh) * 2018-06-27 2021-08-20 郑州云海信息技术有限公司 一种以自动化测试为主导的软件敏捷开发方法及系统
US10776249B2 (en) 2018-07-06 2020-09-15 International Business Machines Corporation Flexible and in-line register comparison for bug analysis

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0817048A1 (en) * 1996-07-01 1998-01-07 Sun Microsystems, Inc. Method and system for testing software using a finite state machine
CN101408862A (zh) * 2007-10-12 2009-04-15 李周 一种嵌入式系统测试方法
CN102053906A (zh) * 2009-10-30 2011-05-11 国际商业机器公司 用于收集程序运行时信息的系统和方法
CN102346710A (zh) * 2011-10-13 2012-02-08 北京航空航天大学 一种基于动态插桩技术的数据包处理时延分析方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP0817048A1 (en) * 1996-07-01 1998-01-07 Sun Microsystems, Inc. Method and system for testing software using a finite state machine
CN101408862A (zh) * 2007-10-12 2009-04-15 李周 一种嵌入式系统测试方法
CN102053906A (zh) * 2009-10-30 2011-05-11 国际商业机器公司 用于收集程序运行时信息的系统和方法
CN102346710A (zh) * 2011-10-13 2012-02-08 北京航空航天大学 一种基于动态插桩技术的数据包处理时延分析方法

Also Published As

Publication number Publication date
CN103365775A (zh) 2013-10-23

Similar Documents

Publication Publication Date Title
US8756460B2 (en) Test selection based on an N-wise combinations coverage
Carzaniga et al. Cross-checking oracles from intrinsic software redundancy
Laghari et al. Fine-tuning spectrum based fault localisation with frequent method item sets
US9239773B1 (en) Method and system for debugging a program that includes declarative code and procedural code
US20080313602A1 (en) Bounded program failure analysis and correction
CN107329889B (zh) 一种c编译器自动化测试的方法
US8990622B2 (en) Post-silicon validation using a partial reference model
US10592703B1 (en) Method and system for processing verification tests for testing a design under test
US10936474B2 (en) Software test program generation
US9274925B2 (en) Programmable symbolic execution based dynamic checker
JP2018532169A (ja) 失敗したテストスクリプトについてのデバッグ情報を生成、収集、格納、およびロードするための方法および装置
Donaldson et al. Putting randomized compiler testing into production (experience report)
CN111897711A (zh) 代码中bug的定位方法、装置、电子设备及可读存储介质
CN103365775B (zh) 基于内部状态检查的单元测试方法
CN100336032C (zh) 基于边界条件和自检查随机测试的cpu约束生成验证法
US10579761B1 (en) Method and system for reconstructing a graph presentation of a previously executed verification test
Jianming et al. PVDF: An automatic patch-based vulnerability description and fuzzing method
US10586014B1 (en) Method and system for verification using combined verification data
US20140289712A1 (en) Effective Lifetime Dependency Analysis and Typestate Analysis
Höller et al. Evaluation of diverse compiling for software-fault detection
CN110471829B (zh) 软件代码测试覆盖率的检查方法及装置
Wahba et al. Expediting Design Bug Discovery in Regressions of x86 Processors Using Machine Learning
CN105718375A (zh) 嵌入式系统的可恢复性度量方法
US20140173539A1 (en) Method and Apparatus for Isolating and/or Debugging Defects in Integrated Circuit Designs
Laghari et al. Unit tests and component tests do make a difference on fault localisation effectiveness

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
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20160406

CF01 Termination of patent right due to non-payment of annual fee