CN102495802B - 测试软件系统的方法和装置以及计算机系统 - Google Patents

测试软件系统的方法和装置以及计算机系统 Download PDF

Info

Publication number
CN102495802B
CN102495802B CN201110441034.0A CN201110441034A CN102495802B CN 102495802 B CN102495802 B CN 102495802B CN 201110441034 A CN201110441034 A CN 201110441034A CN 102495802 B CN102495802 B CN 102495802B
Authority
CN
China
Prior art keywords
software systems
debug command
module
debug
debugging
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
CN201110441034.0A
Other languages
English (en)
Other versions
CN102495802A (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.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
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 Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CN201110441034.0A priority Critical patent/CN102495802B/zh
Publication of CN102495802A publication Critical patent/CN102495802A/zh
Application granted granted Critical
Publication of CN102495802B publication Critical patent/CN102495802B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明公开了一种测试软件系统的方法和装置以及计算机系统。该方法包括:基于该软件系统采用的编程语言的调试机制,与该软件系统建立调试通道;获取用于测试该软件系统内部的流程分支以及状态的调试指令输入和相应的调试指令输出;向该软件系统发送该调试指令输入,并接收该软件系统根据该调试指令输入返回的内部状态信息;通过将该内部状态信息与该调试指令输出进行比较,确定该软件系统运行是否正确。该装置包括建立模块、获取模块、发送模块、接收模块和确定模块。本发明实施例的方法和装置以及计算机系统,能够自动对软件系统在运行过程中的内部状态进行测试,并且能够以极低的成本实现软件系统的白盒测试。

Description

测试软件系统的方法和装置以及计算机系统
技术领域
本发明涉及计算机领域,尤其涉及计算机领域中测试软件系统的方法和装置。
背景技术
当开发中的软件系统可以集成起来运行时,每日的自动化集成或系统测试是保证后继的开发不会造成前期的开发逻辑被误改的重要手段。自动化集成或系统测试可以分为黑盒测试与白盒测试,目前业界的自动化集成或系统测试技术,绝大多数是黑盒测试。
现有的黑盒自动化集成或系统测试原理通常是,为被测试的软件系统提供测试输入,并检测该软件系统根据该测试输入而返回的测试输出是否在期待的范围内,该测试输出例如是被测试的软件系统的返回值或界面展示等。如果测试输出在期待的范围内或符合相应的要求,则认为该软件系统运行正确,否则认为该软件系统运行不正确。
然而,在自动化集成或系统测试中,仅检查被测试的软件系统的输出是不够的,因为被测试的软件系统在执行一次任务的过程中,该软件系统内部的状态值,例如全局变量、实例变量等,可能会被执行任务的代码所修改。因此存在这些状态值被错误地改动而本次的测试输出却是正确的情况,即软件系统的问题没有被发现。对于该情况,在后续的运行过程中,当代码的执行路径引用这些不正确的内部状态值时,会导致任务执行失败,从而可能最终导致软件系统运行错误。但此时距离该内部状态值出现错误的时间点已经很久,从而很难确定错误的原因。
因而,传统的黑盒集成或系统测试方法不容易发现软件系统的内部状态问题;或者需要进行超长时间的测试并且付出很高的成本,才能够发现这些内部状态问题,并且这类问题很容易随软件产品的正式版本流入市场,从而更加难以确定错误的原因。
因此,需要一种技术方案能够对软件系统的内部状态进行监控与检测。
发明内容
本发明实施例提供了一种测试软件系统的方法和装置以及计算机系统,能够对软件系统在运行过程中的内部状态进行测试。
一方面,本发明实施例提供了一种测试软件系统的方法,该方法包括:基于该软件系统采用的编程语言的调试机制,与该软件系统建立调试通道;获取用于测试该软件系统内部的流程分支以及状态的调试指令输入和相应的调试指令输出;向该软件系统发送该调试指令输入,并接收该软件系统根据该调试指令输入返回的内部状态信息;通过将该内部状态信息与该调试指令输出进行比较,确定该软件系统运行是否正确。
另一方面,本发明实施例提供了一种测试软件系统的装置,该装置包括:建立模块,用于基于该软件系统采用的编程语言的调试机制,与该软件系统建立调试通道;获取模块,用于获取用于测试该软件系统内部的流程分支以及状态的调试指令输入和相应的调试指令输出;发送模块,用于通过该建立模块建立的调试通道,向该软件系统发送该获取模块获取的该调试指令输入;接收模块,用于接收该软件系统根据该发送模块发送的该调试指令输入返回的内部状态信息;确定模块,用于通过将该接收模块接收的该内部状态信息与该获取模块获取的该调试指令输出进行比较,确定该软件系统运行是否正确。
再一方面,本发明实施例提供了一种计算机系统,该计算机系统包括:总线;与该总线相连的处理器;与该总线相连的存储器;其中,该处理器通过该总线,调用该存储器中存储的代码,以用于:基于输入的软件系统采用的编程语言的调试机制,与该软件系统建立调试通道;获取用于测试该软件系统内部的流程分支以及状态的调试指令输入和相应的调试指令输出;向该软件系统发送该调试指令输入,并接收该软件系统根据该调试指令输入返回的内部状态信息;通过将该内部状态信息与该调试指令输出进行比较,确定该软件系统运行是否正确。
基于上述技术方案,本发明实施例的测试软件系统的方法和装置以及计算机系统,通过基于该软件系统采用的编程语言的调试机制,并采用用于测试该软件系统内部的流程分支以及状态的调试指令输入,对该软件系统进行测试,从而能够自动对软件系统在运行过程中的内部状态进行测试,并且能够以极低的成本实现软件系统的白盒测试。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍,显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是根据本发明实施例的测试软件系统的方法的示意性流程图。
图2是根据本发明另一实施例的测试软件系统的方法的示意性流程图。
图3是根据本发明再一实施例的测试软件系统的方法的示意性流程图。
图4是根据本发明实施例的测试软件系统的装置的示意性框图。
图5是根据本发明另一实施例的测试软件系统的装置的示意性框图。
图6是根据本发明再一实施例的测试软件系统的装置的示意性框图。
图7是根据本发明实施例的确定模块的示意性框图。
图8是根据本发明实施例的计算机系统的示意性框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都应属于本发明保护的范围。
图1示出了根据本发明实施例的测试软件系统的方法100的示意性流程图。如图1所示,该方法100包括:
S110,基于该软件系统采用的编程语言的调试机制,与该软件系统建立调试通道;
S120,获取用于测试该软件系统内部的流程分支以及状态的调试指令输入和相应的调试指令输出;
S130,向该软件系统发送该调试指令输入,并接收该软件系统根据该调试指令输入返回的内部状态信息;
S140,通过将该内部状态信息与该调试指令输出进行比较,确定该软件系统运行是否正确。
对于需要测试的软件系统,根据本发明实施例的测试软件系统的装置,基于该被测试的软件系统采用的编程语言的调试(DEBUG)机制,与该软件系统建立调试通道,该装置通过向该软件系统发送调试指令输入,该调试指令输入用于测试该软件系统内部的流程分支以及状态,并通过该软件系统根据该调试指令输入返回的内部状态信息与相应于该调试指令输入的调试指令输出进行比较,可以确定该软件系统运行是否正确。
因此,本发明实施例的测试软件系统的方法,通过基于该软件系统采用的编程语言的调试机制,并采用用于测试该软件系统内部的流程分支以及状态的调试指令输入,对该软件系统进行测试,从而能够自动对软件系统在运行过程中的内部状态进行测试,并且能够以极低的成本实现软件系统的白盒测试。
在本发明实施例中,软件系统采用的编程语言可以是Java,也可以是C、C++等。为了描述方便,本发明实施例将以编程语言为Java为例进行说明,但本发明实施例并不限于此。可选地,软件系统采用的编程语言的集成开发环境IDE包括ECLIPSE、JBUILDER或VC。但应理解,本发明实施例仅以编程语言包括Java、C、C++为例进行说明,软件系统采用的编程语言还可以是其它编程语言,本发明实施例并不限于此。类似地,该编程语言的IDE并不仅仅限于ECLIPSE、JBUILDER或VC,还可以是其它编程语言的IDE,本发明实施例仅以此为例进行说明,但本发明实施例并不限于此。
在S110中,测试软件系统的装置基于软件系统采用的编程语言的调试机制,与该软件系统建立调试通道。对于Java编程语言而言,该装置与软件系统建立调试通道需要下面两个元素,一方面被调试的进程以调试模式启动,另一方面,调试者进程调用Java调试接口(Java Debug Interface,简称为“JDI”)的应用程序编程接口(Application Programming Interface,简称为“API”)API,也可以调用被Eclipse等IDE封装了的更易用的Java调试用途API,从而该装置可以与被测试软件系统的调试者进程建立调试通道。
以Java为例,具体而言,被测试Java虚拟机进程被设置成以调试模式启动,并且在启动后,立即暂停,等待调试者进程通过调试通道连接上来;被测试Java虚拟机进程由于是以调试模式启动的,所以会留有调试通道;调试者进程,例如集成了基于本发明实施例的装置的Eclipse插件,调用Java为调试器编写者提供的API-JDI,与被调试进程建立调试通道;从而调试者进程可以调用JDI,并通过调试通道向被调试进程发送如下类型的调试指令:
(1)要求被调试进程在执行到某个类的代码的某行时,暂停线程(假设为线程T1)对此行代码及后继代码的执行(即断点);同时,由被调试进程的调试支撑模块(Java虚拟机组成部分),向调试者进程发送通知,告知调试者进程,被调试进程中已经有线程执行到了指定的代码行位置。调试者进程收到通知后,往往会调用JDI API,通过调试通道,从被调试进程中获取关注的局部变量、实例变量、全局变量的值。待调试者进程进行完分析和/或录制后,解除对被调试进程中的线程T1的阻塞,被调试者进程中线程T1继续执行后继的代码;
(2)要求当被调试进程中的一个线程开始调用某个函数被时,被调试进程中的此线程被阻塞住,同时,被调试进程中的Java调试支撑模块(Java虚拟机组成部分)发一个通知给调试者进程。调试者进程在对此通知内容进行分析和/或录制后,解除阻塞,让被调试进程中的此线程继续执行;
(3)要求当被调试进程中的一个线程开始获取或者设置某个变量的值时,该变量例如为静态变量、实例变量、局部变量等,被调试进程中的此线程被阻塞住,同时,被调试进程中的Java调试支撑模块(Java虚拟机组成部分)向调试者进程发送通知。调试者进程在对此通知内容进行分析和/或录制后,解除阻塞,让被调试进程中的此线程继续执行;
(4)被调试者进程中的很多事件,都可以被调试者进程要求监听。如线程执行完一个函数、如有新的线程产生等。
应理解,本文中的术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
在S120中,调试指令输入用于测试软件系统内部的流程分支以及状态,可选地,该调试指令输入包括该编程语言的调试指令集合。
具体而言,调试指令输入不仅仅包括执行下一条语句、获取局部变量的值、获取实例变量的值、获取全局变量的值和获取函数调用的参数值中的至少一种,还可以包括编程语言的其它调试指令,例如,冻结某个线程的执行、获取当前线程个数、或者某个线程当前堆栈、动态执行一段在被测试程序内不存在的代码、动态修改被测试进程中各种变量的值,等等,即该调试指令输入可以包括如上所述的调试者进程通过调试通道向被调试进程发送的不同类型的调试指令。
在S140中,该通过将该内部状态信息与该调试指令输出进行比较,确定该软件系统运行是否正确,包括:在该内部状态信息与该调试指令输出相同时,确定该软件系统运行正确;以及在该内部状态信息与该调试指令输出不同时,确定该软件系统运行不正确。
因此,本发明实施例的测试软件系统的方法,通过基于该软件系统采用的编程语言的调试机制,并采用用于测试该软件系统内部的流程分支以及状态的调试指令输入,对该软件系统进行测试,从而能够自动对软件系统在运行过程中的内部状态进行测试,并且能够以极低的成本实现软件系统的白盒测试。
此外,编程语言的IDE提供了一个可视化的环境,从而使得程序调试者可以以可视化的方式,向被测试软件系统发送调试指令、查看被测试软件系统内部状态,因此本发明实施例的测试软件系统的方法,能够以可视化的方式对软件系统进行测试,并且能够使用IDE提供的可视化环境,对开发中的或刚刚完成的软件系统进行测试,缩短了软件系统的开发与测试之间的周期,利于软件系统中错误的检测,从而能够提高软件系统的测试质量和效率。
在本发明实施例中,如图2所示,根据本发明实施例的测试软件系统的方法100还可以包括:
S210,基于该软件系统采用的编程语言的调试机制,在该编程语言的集成开发环境与该软件系统之间建立的调试通道上,录制开发人员执行的调试操作,该调试操作包括该调试指令输入和该调试指令输出;
其中S120中的获取用于测试该软件系统内部的流程分支以及状态的调试指令输入和相应的调试指令输出,可以包括:
S220,根据录制的该调试操作,获取该调试指令输入和该调试指令输出。
应理解,在本发明的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
应理解,通常而言,开发人员在编写完一个代码模块后,一般会对这个模块进行单步跟踪调试,以便确认代码逻辑的正确性。在这个单步跟踪的过程中,会查看并确认各个关键点处的内部状态值。这个调试的过程(人工Debug)是典型的白盒测试过程,并且是非常有效的白盒测试过程,测试效果好,因为这个过程是由最熟悉被测试模块的模块开发者对自己的源代码进行逐条跟踪、确认。
下面将以Java为例,对开发人员执行的调试操作的录制进行详细描述。具体而言:
(1)调试者进程在与被调试进程建立调试通道后,通过JDI的API,注册当收到断点事件通知时的回调函数onBreakPoint(参数省略)、当收到指定的函数被开始执行的事件的回调函数onMethonEnter(参数省略)、当收到指定的函数被结束执行的事件的回调函数onMethondReture(参数省略);
(2)当被调试进程中的线程T2执行到断点时,被调试进程中的调试支撑模块(Java虚拟机组成部分)暂停T2的执行,同时通过调试通道发一个断点事件通知给调试者进程;
(3)调试者进程收到断点事件通知后,当初注册的函数onBreakPoint()被调试者进程中的调试支撑模块(Java虚拟机组成部分)回调。在onBreakPoint()函数内,调试者进程会调用JDI API,通过调试通道,向被调试进程发送指令,要求获取关注的此时的静态变量、实例变量、局部变量的值,也可以获取其他信息,如当前被调试进程中线程的个数、某个线程的当前堆栈等等。在获取到这些信息后,将其存入本地文件中。则录制下的在被调试进程执行到指定代码行位置时,被调试进程内的内部状态值,可以用于后继测试用例执行时的校验;
(4)当被调试进程中的线程T2开始调用周边模块的函数func1(参数省略)时,被调试进程中的调试支撑模块(Java虚拟机组成部分)暂停T2的执行,同时通过调试通道发一个函数即将进入事件通知给调试者进程;
(5)调试者进程收到函数即将进入事件通知后,当初注册的函数onMethonEnter()被调试者进程中的调试支撑模块(Java虚拟机组成部分)回调。在onMethonEnter()函数内,调试者进程会调用JDI API,获取被调试进程中调用func1()函数时,传递进的参数的值;根据需要,也可能会调用JDIAPI,获取此时被调试进程中的需要关注的静态变量、实例变量、局部变量的值。并将这些值都写入本地文件中,则录制了被调试进程中被调试模块调用被调试进程中其他模块中函数的过程的开始瞬间值;
(6)当被调试进程中的线程T2调用完毕周边模块的函数func1(参数省略),准备从此函数中退出时,被调试进程中的调试支撑模块(Java虚拟机组成部分)暂停T2的执行,同时通过调试通道发一个函数即将退出事件通知给调试者进程;
(7)调试者进程收到函数即将退出通知后,当初注册的函数onMethonReturn()被调试者进程中的调试支撑模块(Java虚拟机组成部分)回调。在onMethonReturn()函数内,调试者进程会调用JDI API,获取被调试进程中为func1()函数准备的返回值,以及出参的值(钩子参数的值)。根据需要,也可以通过JDI API,通过调试通道,从被调试进程中获取此时的静态变量、实例变量、局部变量的值,从而录制了被调试进程中被调试模块调用被调试进程中其他模块中函数的过程的结束瞬间值;这些值,在测试用例回放时,可以被用来自动生成桩,用以代替真实的被测试进程中会被被测试模块调用的被测试进程中的其他模块。
因此,本发明实施例的测试软件系统的方法,基于该软件系统采用的编程语言的调试机制,在该编程语言的集成开发环境与该软件系统之间建立的调试通道上,将开发人员执行的调试操作录制下来,进行复用,从而能够在后续的每日自动化测试中进行回放,由此能够以极低的成本构造出非常有力的集成或系统白盒自动化测试用例,在自动化测试过程中达到人工手动单步调试时所能达到的测试效果。即,本发明实施例的方法不仅能够对软件系统进行白盒测试,还能够显著降低测试成本,并提高测试效果和测试效率。
在本发明实施例中,根据本发明实施例的方法还可以通过生成与该软件系统的被测试模块交互的模块的桩,独立于被测试的软件系统生成时的外部环境,对该软件系统进行测试。如图3所示,可选地,根据本发明实施例的测试软件系统的方法100还可以包括:
S310,根据录制的该调试操作,生成与该软件系统的被测试模块交互的模块的桩;
其中S130中的接收该软件系统根据该调试指令输入返回的内部状态信息,包括:
S320,接收该软件系统根据该调试指令输入和生成的该桩返回的内部状态信息。
具体而言,本发明实施例的方法支持在测试用例执行时,自动生成与被测试进程中被测试模块交互的被测试进程中其他模块的桩。如被测试的模块为A,它会与模块B和C交互。本发明实施例的方法支持在运行时刻,当A调用B或C模块中的函数时,B或C模块中被调用的函数的内部逻辑在运行时被替换,将逻辑改为:
1)函数的返回值为当初录制用例时录制下的函数返回值;
2)函数的出参值改为当初录制用例时录制下的函数出参值;
3)如果需要,将静态变量、实例变量值改为当初录制用例时录制下静态变量、实例变量值。
因此,本发明实施例的测试软件系统的方法,还能够降低对测试的外部环境的要求,简化测试环境,从而能够提高软件系统测试的便利性,降低软件系统测试的成本。
本发明实施例在开发语言IDE与被测试软件系统之间建立的调试通道上,可以插入一个楔子,使得调试者进行的所有调试操作,包括向被测试软件系统发送的调试指令,以及可以从被测试软件系统接收到的内部状态信息,例如,传递给被测试模块入口函数调用的参数值;在被测试软件系统执行到的代码的第几行、各局部、实例、全局变量的值;被测试模块对周边模块调用的交互值等,都可以被录制下来;这些录制下来的信息,被自动构造成集成/系统自动化测试的用例,并在每日构造中,自动运行这些用例,步骤如下(如下步骤中使用术语测试框架表示基于本发明实施例实现的集成/系统自动化测试方法):
1、测试框架可以使用开发语言实现机制本身的调试机制(如Java的JPDA及调试工具开发包JDT),与被测试软件系统建立debug(调试)通道;
2、测试框架可以使用录制下来的传递给最顶层函数调用的参数,通过debug通道,传递给被测试软件系统的最顶层函数,并动态更改被测试模块与其他模块交互过程中传递的值,以便为被测试模块模拟出一个与当初测试用例录制时完全一样的外部环境;
3、测试框架可以从测试用例中读出当初调试者曾经在第几行代码处让被测试软件系统停止了下来的信息。通过debug通道,向被测试软件系统发送调试指令,让被测试软件系统在运行到指定行处停止下来;
4、测试框架可以从测试用例中读取出当初调试者曾经在被测试软件系统执行到此行后都观察了哪些局部、实例、全局变量的值。通过debug通道,向被测试软件系统发送调试指令,向被测试软件系统索取这些变量的值;
5、被测试软件系统可以将这些指定的变量的值发送给测试框架,测试框架从测试用例中读取出当初调试者在被测试软件系统运行到相同的代码行处,观察这些变量时,这些变量的值是多少。测试框架对这两份值进行对比,看是否相同(或者在一定的偏差范围允许内,或者更复杂的算法规则,通过测试框架可定制此规则),以便决定测试用例是否通过;至此,完成了一个白盒自动化测试用例的执行。
为了方便调试者在进行调试时,能够轻松地排除掉不需进行录制的调试操作,可将本发明实施例的技术方案实现,延伸到开发语言IDE中,可以让调试者在IDE界面上方便地开始/关闭调试动作的录制。
例如:步骤一、开发人员可以在被调试软件系统的源代码与被调试的软件系统之间构建Debug通道,对软件系统进行调试。
步骤二、启动基于本发明实施例实现的框架,在Debug通道上可以嵌入一个楔子,即调试信息监听组件。以Java语言为例,IDE通过Java虚拟机提供的JDT(Java Debug Toolkits)与被测试程序建立连接,并例如通过API向被测试程序所在JVM注册监听如下事件。
a.线程进入或退出指定名称的函数。此时可获取到函数入参和出参都是什么值,是哪个线程在执行此函数等;
b.指定名称的全局变量被修改或读取。此时可以获取变量原来值和新值是多少,是哪个线程做的修改或读取;
c.用户在IDE上添加了断点。此时可以获取断点在哪个类上,行号是多少;
d.线程执行到了指定的断点处。此时可以获取当前线程名、当前可见的局部变量的值、全局变量的值等。
同样,本发明实施例的实现框架也可以通过JDT通道,与被测试程序建立连接,监听这些调试事件。如果本方案实现与IDE集成的话,就可以使用IDE封装了的调试监听API,向被测试虚拟机注册监听这些调试事件。这个就是前面所述的“楔子”的实现方式。
步骤三、调试信息监听组件可以将调试过程中的调试指令(如在被测试软件系统执行到哪个代码行处应观察哪些变量)、被观察的变量的值(如:全局、实例、局部变量的值,被测试模块与其他模块交互的值)录制下来。
步骤四、自动化测试时,由基于本方案的自动化测试框架与被测试的软件系统建立Debug通道以Java语言为例,在自动化测试时,本方案的实现框架,可以通过调用JDT或者调用IDE提供的API,与被测试系统建立连接,进行调试事件监听,以及发送调试指令。
应理解,通过JDT,不仅仅可以监听被测试系统的调试事件,还可以发送调试指令,例如:指示被测试程序应运行到代码的第几行就暂停;指示被测试程序所在虚拟机中的当前线程,将全局变量或局部变量的值,修改为制定的值等。
步骤五:自动化测试框架可以读取当初录制下来的调试指令(如:要求被测试软件系统的运行到某代码行处,将指定变量的值发送回给自动化测试框架),发送给被测试的软件系统。
步骤六:被测试软件系统可以将指定的变量的值发送给自动化测试框架这里涉及到自动打桩的问题,即,被测试模块会与周边模块有交互。如果本次测试中,被测试模块调用周边模块的返回值与录制用例时,周边模块的返回值不一样,那么用例的执行就会就不正确了。
例如,可以通过如下手段解决此问题:a.录制用例时,就通过JDT调试通道,把被测试模块与周边模块之间的交互值(调用周边模块时传递的入参、出参、返回值,以及这段时间内,发生变化的全局变量的新值)录制下来;b.在执行测试用例时,被测试模块对周边模块的函数调用,其返回值、出参、全局变量的值变化,都由本方案的实现框架,根据当初录制下来的这些值,动态设置。
设置方式例如可以是:1)假设被测试类A中的a函数,调用周边类B中的b函数,此b函数返回值为整数。那么,在调用完b函数后,本方案的实现框架,通过JDT中提供的API,立即向被测试程序JVM进程中发送一条调试指令,要求其将b函数的返回值修改为当初录制下来的值;2)通过代码注入技术,当执行测试用例并且A类的a函数开始调用B类的b函数时,本方案的实现框架能够监听到此事件。此时,本方案实现框架会收到通知。收到通知后,本方案实现框架立即对被测试程序所在JVM进行代码注入,将B类b函数的代码逻辑全部情况,替换为只返回当初录制的返回值。
应理解,以上例子中仅仅举例了怎样动态修改周边模块函数调用的返回值,实际本方案还包括对周边模块函数调用的出参的动态修改,以及对全局变量值的动态修改。这些手段,最终达到了为被测试模块模拟出一个与当初录制用例时完全一样的周边环境,实现了非常低成本的打桩效果。
步骤七、自动化测试框架可以将被测试的软件系统返回的变量的值(以a表示),与录制载体中保存的在debug过程中录制的变量的值(以b表示)进行比较,以便判断a的值是否正确,进而当前被测试的软件系统运行是否正确。
应理解,在本发明实施例中,基于编程语言已有的debug机制,对调试过程中的信息进行录制,自动构建测试用例;基与编程语言已有的debug机制,在自动化测试时,向被测试软件系统发送指令,动态设置传递给被测试模块入口函数的入参、动态设置各模块与被测试模块交互值(装构建)、在被测试模块指定代码行处检测指定的变量的值是否与预期相符。其中,对调试过程中信息的录制,包括但不限于以下内容:
1、对调试过程中,被测试模块与其他模块的交互值(函数调用掺入参数,与函数返回值)进行录制,以便在自动化测试时,自动构建桩,让被测试模块在测试执行时,不再依赖其他模块;
2、对调试过程中,被测试模块的入口函数的传入参数的值进行录制,以便自动构建测试用例的入参;
3、对调试过程中,调试人员都关注了哪些代码行位置的哪些全局变量、局部变量,以及这些变量当时的值这进行录制,以便自动构建测试用例的校验逻辑;
手工单步调试的过程高成本的白盒测试实践、是高质量的白盒测试实践;手工单步调试是软件开发过程中的宝贵过程资产。因此,本发明实施例让手工单步调试这个过程资产,以测试用例的方式固化了下来,可供后继纳入到每日构造中。即本发明实施例的测试软件系统的方法,通过基于该软件系统采用的编程语言的调试机制,并采用用于测试该软件系统内部的流程分支以及状态的调试指令输入,对该软件系统进行测试,从而能够自动对软件系统在运行过程中的内部状态进行测试,并且能够以极低的成本实现软件系统的白盒测试。
上文中结合图1至图3,对本发明实施例的测试软件系统的方法进行了详细地描述,下面将结合图4至图7,详细描述根据本发明实施例的测试软件系统的装置。
如图4所示,根据本发明实施例的测试软件系统的装置500包括:
建立模块510,用于基于该软件系统采用的编程语言的调试机制,与该软件系统建立调试通道;
获取模块520,用于获取用于测试该软件系统内部的流程分支以及状态的调试指令输入和相应的调试指令输出;
发送模块530,用于通过该建立模块510建立的调试通道,向该软件系统发送该获取模块520获取的该调试指令输入;
接收模块540,用于接收该软件系统根据该发送模块530发送的该调试指令输入返回的内部状态信息;
确定模块550,用于通过将该接收模块540接收的该内部状态信息与该获取模块520获取的该调试指令输出进行比较,确定该软件系统运行是否正确。
因此,本发明实施例的测试软件系统的装置,通过基于该软件系统采用的编程语言的调试机制,并采用用于测试该软件系统内部的流程分支以及状态的调试指令输入,对该软件系统进行测试,从而能够自动对软件系统在运行过程中的内部状态进行测试,并且能够以极低的成本实现软件系统的白盒测试。
可选地,如图5所示,根据本发明实施例的装置500还包括:
录制模块560,用于基于该软件系统采用的编程语言的调试机制,在该编程语言的集成开发环境与该软件系统之间建立的调试通道上,录制开发人员执行的调试操作,该调试操作包括该调试指令输入和该调试指令输出;
该获取模块520还用于根据该录制模块560录制的该调试操作,获取该调试指令输入和该调试指令输出。
可选地,如图6所示,根据本发明实施例的装置500还包括:
生成模块570,用于根据该录制模块560录制的该调试操作,生成与该软件系统的被测试模块交互的模块的桩;
该接收模块540还用于接收该软件系统根据该调试指令输入和生成的该桩返回的内部状态信息。
在本发明实施例中,可选地,如图7所示,该确定模块550包括:
第一确定单元551,用于在该内部状态信息与该调试指令输出相同时,确定该软件系统运行正确;
第二确定单元552,用于在该内部状态信息与该调试指令输出不同时,确定该软件系统运行不正确。
在本发明实施例中,可选地,该录制模块560在ECLIPSE、JBUILDER或VC与该软件系统之间建立的调试通道上,录制开发人员执行的调试操作。可选地,该获取模块520获取的该调试指令输入包括该编程语言的调试指令集合。该调试指令输入不仅仅包括执行下一条语句、获取局部变量的值、获取实例变量的值、获取全局变量的值和获取函数调用的参数值中的至少一种,还例如包括冻结某个线程的执行、获取当前线程个数、或者某个线程当前堆栈、动态执行一段在被测试程序内不存在的代码、动态修改被测试进程中各种变量的值等。
应理解,根据本发明实施例的测试软件系统的装置500可对应于本发明实施例的方法中的装置,并且装置500中的各个模块的上述和其它操作和/或功能分别为了实现图1至图3中的各个方法的相应流程,为了简洁,在此不再赘述。
因此,本发明实施例的测试软件系统的装置,通过基于该软件系统采用的编程语言的调试机制,并采用用于测试该软件系统内部的流程分支以及状态的调试指令输入,对该软件系统进行测试,从而能够自动对软件系统在运行过程中的内部状态进行测试,并且能够以极低的成本实现软件系统的白盒测试。
此外,本发明实施例的装置重用软件开发人员在开发过程中的调试工作内容,一方面能够在自动化测试过程中达到人工手动单步调试时所能达到的测试效果,另一方面能够降低测试成本,并且能够缩短软件系统的开发与测试之间的周期,利于软件系统中错误的检测,从而能够提高软件系统的测试效率。
图8示出了根据本发明实施例的计算机系统的示意性框图。如图8所示,该计算机系统包括:总线610;与该总线610相连的处理器620(处理器620可以是一个或多个,图8中以一个处理器示意);与该总线610相连的存储器630;其中,该处理器620通过该总线610,调用该存储器630中存储的代码,以用于:基于输入的软件系统采用的编程语言的调试机制,与该软件系统建立调试通道;获取用于测试该软件系统内部的流程分支以及状态的调试指令输入和相应的调试指令输出;向该软件系统发送该调试指令输入,并接收该软件系统根据该调试指令输入返回的内部状态信息;通过将该内部状态信息与该调试指令输出进行比较,确定该软件系统运行是否正确。
因此,本发明实施例的计算机系统,通过基于该软件系统采用的编程语言的调试机制,并采用用于测试该软件系统内部的流程分支以及状态的调试指令输入,对该软件系统进行测试,从而能够自动对软件系统在运行过程中的内部状态进行测试,并且能够以极低的成本实现软件系统的白盒测试。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口、装置或单元的间接耦合或通信连接,也可以是电的,机械的或其它的形式连接。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本发明实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以是两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

Claims (11)

1.一种测试软件系统的方法,其特征在于,包括:
基于所述软件系统采用的编程语言的调试机制,与所述软件系统建立调试通道;
获取用于测试所述软件系统内部的流程分支以及状态的调试指令输入和相应的调试指令输出,所述调试指令输入和所述调试指令输出为录制的开发人员执行的调试指令输入和调试指令输出;
通过所述调试通道向所述软件系统发送所述调试指令输入,并接收所述软件系统根据所述调试指令输入返回的内部状态信息;
通过将所述内部状态信息与所述调试指令输出进行比较,确定所述软件系统运行是否正确。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
基于所述软件系统采用的编程语言的调试机制,在所述编程语言的集成开发环境与所述软件系统之间建立的调试通道上,录制开发人员执行的调试操作,所述调试操作包括所述调试指令输入和所述调试指令输出;
所述获取用于测试所述软件系统内部的流程分支以及状态的调试指令输入和相应的调试指令输出,包括:
根据录制的所述调试操作,获取所述调试指令输入和所述调试指令输出。
3.根据权利要求2所述的方法,其特征在于,所述方法还包括:
根据录制的所述调试操作,生成与所述软件系统的被测试模块交互的模块的桩;
所述接收所述软件系统根据所述调试指令输入返回的内部状态信息,包括:
接收所述软件系统根据所述调试指令输入和生成的所述桩返回的内部状态信息。
4.根据权利要求1所述的方法,其特征在于,所述通过将所述内部状态信息与所述调试指令输出进行比较,确定所述软件系统运行是否正确,包括:
在所述内部状态信息与所述调试指令输出相同时,确定所述软件系统运行正确;
在所述内部状态信息与所述调试指令输出不同时,确定所述软件系统运行不正确。
5.根据权利要求2所述的方法,其特征在于,所述集成开发环境IDE包括ECLIPSE、JBUILDER或VC。
6.根据权利要求1至5中任一项所述的方法,其特征在于,所述调试指令输入包括所述编程语言的调试指令集合。
7.一种测试软件系统的装置,其特征在于,包括:
建立模块,用于基于所述软件系统采用的编程语言的调试机制,与所述软件系统建立调试通道;
获取模块,用于获取用于测试所述软件系统内部的流程分支以及状态的调试指令输入和相应的调试指令输出,所述调试指令输入和所述调试指令输出为录制的开发人员执行的调试指令输入和调试指令输出;
发送模块,用于通过所述建立模块建立的调试通道,向所述软件系统发送所述获取模块获取的所述调试指令输入;
接收模块,用于接收所述软件系统根据所述发送模块发送的所述调试指令输入返回的内部状态信息;
确定模块,用于通过将所述接收模块接收的所述内部状态信息与所述获取模块获取的所述调试指令输出进行比较,确定所述软件系统运行是否正确。
8.根据权利要求7所述的装置,其特征在于,所述装置还包括:
录制模块,用于基于所述软件系统采用的编程语言的调试机制,在所述编程语言的集成开发环境与所述软件系统之间建立的调试通道上,录制开发人员执行的调试操作,所述调试操作包括所述调试指令输入和所述调试指令输出;
所述获取模块还用于根据所述录制模块录制的所述调试操作,获取所述调试指令输入和所述调试指令输出。
9.根据权利要求7所述的装置,其特征在于,所述装置还包括:
生成模块,用于根据所述录制模块录制的所述调试操作,生成与所述软件系统的被测试模块交互的模块的桩;
所述接收模块还用于接收所述软件系统根据所述调试指令输入和生成的所述桩返回的内部状态信息。
10.根据权利要求7所述的装置,其特征在于,所述确定模块包括:
第一确定单元,用于在所述内部状态信息与所述调试指令输出相同时,确定所述软件系统运行正确;
第二确定单元,用于在所述内部状态信息与所述调试指令输出不同时,确定所述软件系统运行不正确。
11.根据权利要求7至10中任一项所述的装置,其特征在于,所述获取模块获取的所述调试指令输入包括所述编程语言的调试指令集合。
CN201110441034.0A 2011-12-26 2011-12-26 测试软件系统的方法和装置以及计算机系统 Expired - Fee Related CN102495802B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201110441034.0A CN102495802B (zh) 2011-12-26 2011-12-26 测试软件系统的方法和装置以及计算机系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201110441034.0A CN102495802B (zh) 2011-12-26 2011-12-26 测试软件系统的方法和装置以及计算机系统

Publications (2)

Publication Number Publication Date
CN102495802A CN102495802A (zh) 2012-06-13
CN102495802B true CN102495802B (zh) 2015-03-18

Family

ID=46187627

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201110441034.0A Expired - Fee Related CN102495802B (zh) 2011-12-26 2011-12-26 测试软件系统的方法和装置以及计算机系统

Country Status (1)

Country Link
CN (1) CN102495802B (zh)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103019941B (zh) * 2012-12-28 2015-09-30 大唐微电子技术有限公司 程序调试方法和装置
CN103164306B (zh) * 2013-03-25 2015-05-20 北京经纬恒润科技有限公司 一种测试逻辑的生成方法及装置
CN104063311B (zh) * 2013-05-27 2016-02-03 深圳市腾讯计算机系统有限公司 一种应用测试方法及装置
CN105451258B (zh) * 2014-09-26 2019-10-25 优视科技有限公司 一种测试处理方法及装置
CN106155883B (zh) * 2015-03-30 2019-02-19 华为技术有限公司 一种虚拟机可靠性测试方法及装置
CN105573910B (zh) * 2015-12-11 2018-06-19 北京元心科技有限公司 受保护系统的应用程序调试方法及智能终端
CN109783342B (zh) 2017-11-10 2022-03-29 华为技术有限公司 脚本调试方法、设备及计算机存储介质
CN111142469B (zh) * 2019-12-27 2021-07-27 北京和利时智能技术有限公司 一种plc的组态程序的调试方法及调试系统
CN111209198A (zh) * 2019-12-31 2020-05-29 五八有限公司 基于jpda的调试方法、装置、电子设备及存储介质
CN112328226B (zh) * 2020-09-17 2022-03-04 北京中数科技术有限公司 一种嵌入式系统自动化测试代码生成方法及装置
CN115794639B (zh) * 2022-12-05 2023-09-26 北京领雁科技股份有限公司 基于流程的可视化测试及可视化仿真模拟测试系统和方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1873626A (zh) * 2005-06-01 2006-12-06 中兴通讯股份有限公司 一种自动生成桩和驱动函数的单元测试系统及方法
CN101241466A (zh) * 2007-02-08 2008-08-13 深圳迈瑞生物医疗电子股份有限公司 一种嵌入式软件的测试方法和系统
CN101266570A (zh) * 2007-03-15 2008-09-17 中兴通讯股份有限公司 软件系统的测试方法及装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
FR2872605B1 (fr) * 2004-06-30 2006-10-06 Meiosys Sa Procede de gestion d'un processus logiciel, procede et systeme de redistribution ou de continuite de fonctionnement dans une architecture multi-ordinateurs

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1873626A (zh) * 2005-06-01 2006-12-06 中兴通讯股份有限公司 一种自动生成桩和驱动函数的单元测试系统及方法
CN101241466A (zh) * 2007-02-08 2008-08-13 深圳迈瑞生物医疗电子股份有限公司 一种嵌入式软件的测试方法和系统
CN101266570A (zh) * 2007-03-15 2008-09-17 中兴通讯股份有限公司 软件系统的测试方法及装置

Also Published As

Publication number Publication date
CN102495802A (zh) 2012-06-13

Similar Documents

Publication Publication Date Title
CN102495802B (zh) 测试软件系统的方法和装置以及计算机系统
CN104461894B (zh) 安卓软件的操作录制装置和方法
Muccini et al. Using software architecture for code testing
US8645912B2 (en) System and method for use in replaying software application events
CN109840207B (zh) 一种基于autosar网络管理自动化测试系统及测试方法
US8205120B2 (en) Intelligent test framework
CN103049371A (zh) Android应用程序测试方法和测试装置
CN113392025B (zh) 对可重构fpga软件进行过程监控的方法
CN106547687A (zh) 应用测试方法、装置及系统
Roehm et al. Monitoring user interactions for supporting failure reproduction
TWI566090B (zh) Debugging firmware / software to produce tracking systems and methods, recording media and computer program products
CN110688313B (zh) 一种VxWorks操作系统下软件测试的故障注入方法
CN106354629A (zh) 一种基于多级服务器的iOS系统移动应用自动测试系统的架构方法
CN104731566A (zh) 集成开发环境测试装置、方法及系统
CN105279196A (zh) 测试脚本的生成方法和装置
US9117018B2 (en) Method of debugging software and corresponding computer program product
CN107622017A (zh) 一种通用自动化软件测试的解析方法
CN108228454B (zh) 一种基于环境故障注入的机电产品软件可靠性评价方法
KR101792864B1 (ko) 애플리케이션 검증 시스템 및 방법
CN114003451A (zh) 一种接口测试方法、装置、系统及介质
Aho et al. Evolution of automated regression testing of software systems through the graphical user interface
CN117214561A (zh) 一种自动测试运行系统的测试方法及信息共享平台
CN111176995A (zh) 一种基于大数据测试用例的测试方法和测试系统
CN115422033A (zh) 一种分布交互式仿真时序验证方法和系统
KR20220091897A (ko) 패턴 기반 SoS 내 실패 유발 상호작용 분석 방법 및 장치

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

Granted publication date: 20150318

Termination date: 20171226