自动化软件调测方法及系统的制作方法

文档序号:6464381阅读:227来源:国知局
专利名称:自动化软件调测方法及系统的制作方法
技术领域
本发明涉及软件调测技术,尤其涉及一种能够自动生成测试用例并通过模 拟器自动恢复执行现场进行软件调测的方法及系统。
背景技术
当开发人员需要对初步完成的软件进行自测的时候,往往会根据用户使用 系统的步骤, 一步一步地验证系统是否按预计的方式运行,但这种测试方式比 较繁瑣,特别对于较大的、环节步骤较多的软件系统来说,要发现和解决一个
缺陷(BUG)往往需要模拟很多次,在时间和精力上造成很大的浪费。
一些比较高级的自测方法可以对函数构建测试用例,然后通过测试用例对 函数进行单元测试,然而,这种测试方法往往会因为类成员函数涉及了多个其 他对象的数据而导致构建测试用例十分困难。例如,对于一个在函数体内部使 用了成员变量以及依赖其他运行对象的函数来说,在构建该函数的测试用例时, 不仅仅需要构建输入参数,而且还需要对其中的成员变量、所依赖的运行对象 进行初始化。 一个函数涉及的变量越多,构建起来会越复杂,需要花费很多时 间和精力。
不仅如此,有时设计测试用例时往往会忽略一些比较隐晦的问题,例如忽 略了某些边界值、忽略了其他模块的数据对当前测试模块的影响、忽略了某些 特珠值导致的问题、忽略了网络状态不好的情况等,而当这些问题发生后使软 件产生BUG时,开发人员却不能即时的将产生BUG的现场保存下来形成一个 测试用例,用于以后对该BUG进行测试,如果要复现这个BUG又非常困难, 给软件日后的使用造成隐患。此外,当测试用例很多的时候,测试人员对每个 测试用例手工进行测试的效率很低,非常浪费时间的精力。发明内容有鉴于此,本发明的目的之一在于提供一种自动化软件调测方法及系统, 以解决人工构建测试用例、人工模拟验证所带来的效率低下,自动化程度不高 等技术问题。为实现上述发明目的,本发明的主要技术方案为一种自动化软件调测系统,该系统包括程序模块以及如下模块消息接口模块,用于记录所述程序模块所执行的系统消息及测试数据,并生成测试用例;用例存储单元,用于存储测试用例;模拟器,用于根据测试用例模拟被调测程序模块的运行过程并恢复程序的 执行现场;所述消息接口模块将获取的所述程序模块所执行的系统消息及测试数据形 成测试用例后存储于所述用例存储单元,所述模拟器读取存储在所述用例存储 单元中的测试用例,自动恢复执行现场,并配合调试器对所述程序模块进行调基于上述方案,当系统包括多个程序模块时,则所述消息接口模块置于两 个程序模块之间,用于记录驱动所述程序模块的系统消息,以及所述程序模块 之间的交互消息,并生成测试用例存储于所述用例存储单元;所述模拟器读取 存储在所述用例存储单元中的测试用例,可分别对所述两个程序模块进行执行 现场的恢复,并配合调试器所述程序模块进行调测。基于上述方案,为了了解系统产生的断言信息,所述系统还进一步包括断 言统计接口,用于获取所述程序模块产生的断言的位置及个数信息。本发明针对客户服务器结构的软件系统,提出了如下技术方案所述程序模块包括客户端子程序模块和服务端子程序模块,分别位于客户 端和服务端;所述消息接口模块包括客户端消息接口模块及服务端消息接口模 块,分别位于客户端和服务端;所述用例存储单元包括客户端用例存储单元及服务端用例存储单元,分别位于客户端和服务端;所述模拟器包括客户端模拟
器及服务端模拟器,分别位于客户端和服务端;
客户端网络接口模块,用于为所述客户端子程序模块提供与服务端进行网
络消息交互的通讯接口;服务端网络接口模块,用于为所述服务端子子程序模 块提供与客户端进行网络消息交互的通讯接口 ;所述客户端消息接口模块连接 所述客户端子程序模块及所述客户端网络接口模块,获取与服务端的交互消息 并形成测试用例,存储在客户端用例存储单元中;所述服务端消息接口模块连 接所述服务端子程序模块及所述服务端网络接口模块,获取与客户端的交互消 息并形成测试用例,存储在服务端用例存储单元中。
本发明的另一目的在于提供一种自动化软件调测方法,为实现该目的,本 发明釆用了如下的技术方案
一种自动化软件调测方法,该方法包括以下步骤
A、 记录驱动程序运行的消息,并将其形成测试用例存储;
B、 通过调用接口启动待调测的程序;
C、 读取所述测试用例,并根据用户所选待调测消息位置通过调用接口自 动恢复执行现场;
D、 对所述待调测程序进行调测。
基于上述方案,若是对单程序进行测试,则所述消息包括系统消息及测试 数据;若是对存在消息交互的多个程序中的程序进行测试,则所述消息包括系 统消息及程序之间的交互消息。
基于上述方案,步骤B和步骤C中,所述接口为组件对象模型COM接 口、或普通函数接口,所述接口由所述程序或所述程序之间附加的消息接口提 供。
基于上述方案,步骤C中所述自动恢复执行现场具体包括 Cl、选择待调测消息位置;
C2、按照所述交互消息及系统消息产生的时间顺序,通过模拟接口控制所 述待调测程序自动运行到所述待调测消息位置。基于上述方案,步骤A中还包括使用系统钩子获取所述程序产生断言的 位置及个数信息。步骤C和步骤D中,还进一步包括获取所述待调测程序所 产生的断言的位置及个数信息,在运行完测试用例后与在步骤A中所获得的所 述断言的位置及个数信息进行比对,判断对所述待调测程序的修改是否正确。基于上述方案,步骤A中,通过系统钩子获取在执行所述程序某函数之前 的所有交互消息及系统消息,从而形成所述函数的测试用例。由于本发明通过接口自动将程序模块间的交互消息、程序模块响应用户的 系统消息记录下来形成测试用例,然后通过模拟器读取测试用例,根据测试用 例中存储的交互消息、系统消息模拟程序模块的运行,执行自动的现场恢复, 从而使得开发测试人员在对测试用例进行重复验证时省去了手工的重复劳动, 提高了调测的效率。本发明通过系统钩子对特定函数构建测试用例,能够在自动化的基础上更 精确的定位程序BUG的位置,缩小调试范围。本发明通过系统钩子在构建测 试用例时和调测时获取断言的位置和数量,从而可以为调测人员提供一个简单 而直观的判断依据来判别对程序BUG修改的效果。


图1A为本发明所述系统的第一具体实施例的系统结构图;图1B为本发明第一具体实施例在调试状态下的系统结构图;图1C为本发明第一具体实施例在调测状态下另一种系统结构图;图2A为本发明所述系统的第二具体实施例的系统结构图;图2B为本发明第二具体实施例在调试状态下的系统结构图;图3A为本发明所述系统的第三具体实施例的系统结构图;图3B为本发明第三具体实施例分别对客户端子程序模块及服务端子程序模块进行调试时系统结构图;图3C为本发明第三具体实施例通过服务端模拟器对客户端子程序模块进行调试的系统结构图;图4为本发明所述方法的流程图。
具体实施方式
下面通过具体实施例和附图对本发明做进一步详细说明。图1A为本发明所述系统的第一具体实施例的系统结构图。第一程序模块 与第二程序模块代表具有一定逻辑功能的程序模块,第一程序模块与第二程序 模块在未添加实现自动化调测系统模块的情况下,直接通过组件对象模型(COM, Component Object Model)接口 、标准网络通信协议接口等方式进行 消息交互。为了实现对程序模块的自动化的调测,本发明加入了消息接口模块、用例 存储单元、模拟器三个部分,其中消息接口模块用于记录所述程序模块之间的 交互消息并生成测试用例;用例存储单元,用于存储测试用例数据;模拟器, 用于调用所述测试用例对所述程序模块进行调测。在测试用例的构建阶段,不 需要模拟器的参与,但模拟器可分别对第一程序模块与第二程序模块进行调测。图IB为本发明第一具体实施例在调测状态下的系统结构图,在调测状态下,模拟器读取存储在用例存储单元中的测试用例,并通过调用程序模块提供的用于消息交互的COM接口或非COM的普通函数接口模拟与其它程序模块间 的消息交互,以自动进行执行现场的恢复,并配合调试器对待测试程序模块进 行调测。图1C为本发明第一具体实施例在调测状态下另一种系统结构图,与 图1B不同的是,此结构下,模拟器直接调用消息接口模块所提供的消息交互 接口来进行模拟及进行执行现场的恢复。对于对实时性要求不高的单程序模块,例如单机版棋牌类小游戏,来说, 没有程序模块间的消息交互,要实现自动测试需通过消息接口模块记录驱动该 程序模块运行的鼠标、键盘等系统消息以及程序模拟时需要的一些测试数据, 开发人员需自己定义存储测试数据的事件,消息接口模块需提供测试数据存储 接口供开发人员在认为需要测试的程序位置调用该接口函数以存储相关测试数 据。开发人员在程序模块中需开放一个公用模拟接口给模拟器。当模拟器执行测试用例时,如果遇到存储相关测试数据,模拟器调用所述公用模拟接口,开 发人员在公用模拟接口里根据存储的测试数据执行对应的模拟操作。多程序模 块的技术方案相对于单程序模块技术方案而言,由于主要关注于程序模块间的 消息交互接口,因此其实现复杂程度较低,实用性更强。图2A为本发明所述系统的第二具体实施例的系统结构图,与所述系统的 第一具体实施例相比,其增加了断言统计接口,用于捕获所述程序模块产生异 常时触发的断言,并获取断言的位置及个数信息,断言统计接口可将断言的位BUG修改的经过,也可以不存储,只是输出显示在屏幕上告知调测人员即可。图2B为本发明所述系统的第二具体实施例在调试状态下的系统结构图, 在测试用例的构建状态和调试状态下分别通过断言统计接口获取被调测程序模 块所产生断言的位置及个数信息,其目的在于进行前后比对,以判断对程序模 块中BUG的修改的效果。图3A为本发明所述系统第三具体实施例系统结构图,此具体实施例的特 点在于包括客户端和服务端两个部分,客户端与服务端分别拥有自己的消息接 口模块、用例存储单元及模拟器,客户端和服务端分别可包括多个实现不同功 能的子程序模块,客户端各子程序模块通过客户端消息接口模块与客户端网络 接口模块连接,客户端网络接口模块负责所有客户端子程序模块与服务端之间 的消息交互;服务端各子程序模块通过服务端消息接口模块与服务端网络接口 模块连接,服务端网络接口模块负责所有服务端子程序模块与客户端之间的消 息交互,服务端各子程序模块通过服务端网络接口模块与客户端进行消息交互。图3B为分别对客户端子程序模块及服务端子程序模块进行本端调试的系 统结构图,服务端与客户端进行本端调测只需要从本端的用例存储单元中调用 本端的测试用例即可。图3C为进行远端调测的系统结构图,利用服务端模拟器调用服务端的测 试用例对客户端子程序模块进行调测,同样地,也可以利用客户端模拟器调用 客户端的测试用例来对服务端子程序进行调测。以服务端为例,服务端模拟器可通过远程COM接口启动客户端子程序模块,在分布式环境下,当测试用例 包含多个客户端的交互消息时,服务端模拟器还可同时启动多个客户端上的多个子程序模块。图4为本发明所述方法的具体实施例的流程图,以下结合附图对本发明所 述方法的各步骤进行详细描述步骤A、在程序模块运行过程中,由消息接口模块记录驱动程序运行的消 息,并将其存储形成测试用例;此步骤为测试用例的构建步骤,为了构造一个测试用例,需要在原有系统 的上附加一个或多个中间的调用接口,当用户在使用原有系统的过程中,通过 中间接口记录程序模块间的网络消息及系统消息,对于单程序模块情况下,需 记录用于模拟的测试数据及系统消息,从而创建相应的测试用例。例如要创建 用户登录和退出的测试用例,则只需要使用带有消息接口模块客户端和服务端 执行一下登录和退出的操作,即可生成相应的测试用例。以图1A系统结构为例,程序模块之间通过COM接口相互通信, 一般用于通信的接口数量比较少,所以只需要在原有程序模块的基础上做少量的修改, 附加上消息接口模块的调用即可将程序模块之间的网络消息及系统消息保存为 测试用例。以图3A系统结构为例,对于客户服务器结构,测试用例的构建主要分为 两部分 一个是基于客户端用例构建;另一个是基于服务端的用例构建。通常 客户端子程序模块主要是通过网络消息及鼠标、键盘等输入设备产生的系统消 息驱动的;服务端子程序模块主要通过网络消息驱动,因此,在进行系统使用 的时候,可以在客户端子程序模块与客户端网络接口模块之间附加的消息接口 模块中将网络消息及系统消息的触发时间和触发内容存储下来,形成 一个事件 驱动的客户端测试用例。也可以在服务端子程序模块与服务端网络接口模块之 间附加的消息接口模块中将网络消息存储下来,形成 一个服务端的测试用例。 这样做的好处是通过保存事件的测试用例就可以保存开发人员进行自测时所执 行过的所有函数的测试用例,以便以后随时对某个函数进行测试。更重要的是当开发人员在自测的时候遇到一个比较隐晦的问题时,实际上他已经保存了这 个很难重现的必现用例,方便以后的调试和验证。由于服务端是与各个客户端通讯的中心,保存服务端的网络消息作为测试 用例时,实际上是保存了所有客户端的测试用例。客户端与其他客户端通讯的 时候通常都需要经过服务端的验证和处理然后通过网络消息转发给其它客户 端,当其它客户端收到该网络消息的时候才做相应的处理。而服务端也只有在收到通过客户端网络接口模块和服务端网络接口模块透明传输过来客户端的网 络消息后才做相应的逻辑搡作,因此保存服务端网络通信的用例可以恢复该用 例情况下所有客户端和服务端的执行现场。通常客户端子程序模块与客户端网络接口模块之间的用于通信的COM接 口数量很少,因此只需要开发少数中间接口就可以将客户端子程序模块通过客 户端网络接口模块公布的通信接口所传输的网络消息存储下来,而其它鼠标、键盘的输入设备产生的系统消息可通过另外的COM接口存储。为了实现输入 时间和输入内容相绑定,可以使用如下的数据结构来储存这些消息时间、模块标识、消息分类标识符、长度、内容。其中模块标识用于标识消息的发送者, 消息分类标识符用于识别程序模块间的消息类型以及识别系统消息的类型,如 鼠标、键盘消息等。在服务器端,由于服务端子程序模块与服务端网络接口模 块是通过接口进行通讯的,而服务端子程序模块端不需要直接与客户端进行消 息交互,因此基于服务端子程序模块构造测试用例只需要开发相应的接口来记 录进入过某个接口的网络消息即可,消息记录格式可借用客户端的消息记录数 据结构进行存储,只是消息分类标识符的作用有区别,服务端的消息分类标识 符只是用来识别服务端网络接口模块调用服务端子程序模块的某一个接口。步骤B、由模拟器通过接口启动待调测的程序模块;此步骤开始进入对程序模块的调测状态,在调测开始之前需启动模拟器, 由模拟器通过调用接口启动待调测的程序模块。步骤C、由所述模拟器读取所述测试用例并根据用户所选的待调测消息位 置自动恢复执行现场;以图3A的系统结构为例,实际上,将客户端子程序模块接收到的网络消 息、鼠标和键盘事件的触发时间和内容保存下来,形成测试用例,这个测试用 例就已经保存了客户端子程序模块运行后所有函数的执行现场。通过执行测试 用例,就可以恢复每个函数的执行现场,实现对某个函数的调试和验证。由于 客户端已经保存了某轮测试中所有的网络消息,相当于模拟了客户端网络接口 模块、服务端网络接口模块和服务端子程序模块的处理。因此,仅仅使用客户 端的测试用例就可以完成对客户端的测试。同理,在进行服务端子程序模块的 测试用例时,实际上已经模拟了所有客户端子程序模块、客户端网络接口模块 和服务端网络接口模块的处理。因此,仅仅使用服务端子程序模块的测试用例 也可以单独对服务端子程序模块进行测试。通常所有客户端的网络消息都通过服务端子程序模块处理再转发,相当于 服务端子程序模块是所有客户端的中心,客户端之间的数据通讯都需要通过服 务端子程序模块。因此,在使用服务端子程序模块测试用例对服务端子程序模 块进行测试的同时,也可以对客户端进行测试。当保存了服务端子程序模块的测试用例后,服务端模拟器通过COM的方 式将开发人员所关心的一个或多个客户端启动起来,将测试用例记录下来的数 据形成一个向所有客户端或某个客户端发送的网络消息的列表,开发人员可通 过选择窗口随机选择某条网络消息进行测试。在拥有多个客户端的情况下,开 发人员可以先对客户端的进行选择,然后开发人员根据自己的需要选择某个网 络事件,例如,是希望对服务端子程序模块还是对客户端的某个消息触发后进 行测试,服务端模拟器会通过接口控制服务端子程序模块自动恢复到发生这个网络消息时的现场。这时,开发人员就可以直接使用集成开发调试环境,如vc或WinDBG等直接跟踪和测试。自动恢复执行现场的步骤主要是,模拟器通过模拟接口将记录的网络消息 顺序的执行到需要调试的某个网络消息或某个函数位置,这时发生某个网络消 息或某个函数被调用的现场即被恢复。对于客户端或如图1A的简单系统结构 来说还包括系统消息的按时间顺序的执行。通过模拟器自动恢复执行现场可以大大节省开发人员复现BUG的操作时间,提高调测效率。步骤D、在调试器的配合下对所述待调测程序模块进行调测。 为了对程序模块中的BUG进行调试,需使用集成开发调试环境来配合进 行,开发人员可将程序模块的源程序与其执行程序绑定,在所述程序模块的执 行程序被启动之后,即可在集成开发调试环境中为程序设置端点。以VC( Visual Studio C++)为例,在编译的时候可生成pdb文件,然后可以用Windbg或VC 将该pdb文件关联到该程序模块的执行程序上,这样就可以在代码中设置断点。 为了进一步缩小调试范围,本发明还可以使用系统钩子技术(APIHook) 来记录测试用例执行过的函数。还可以将多个测试用例中相同的函数用例提取 出来,形成函数的单元测试用例。即可以通过API函数枚举某个EXE或某个 DLL的所有函数,使用钩子钩取开发人员关心的函数,记录当时已执行过的网 络消息、系统消息,形成某个函数的测试用例。然后根据这个方法获取该函数 的其他测试用例。当开发人员选择对某个函数进行测试的时候,该函数发生之 前的所有的络消息、系统消息会被模拟器自动触发,从而恢复了进入该函数前 的现场,使真实的环境得到模拟,最终形成了自动化的测试用例。为了能够对在程序修改前后BUG的位置和数量进行比对,从而直观的获 得修改效果,本发明还使用API Hook的技术,在测试用例的构建状态和调测状 态下捕获软件系统运行时产生的断言。还可以作为以后对软件系统是否正常运 行的验证用例。本系统主要统计了某个测试用例断言的个数和断言发生在程序 的位置,在开发人对系统进行自测的时候,本系统就收集了系统发生断言的数 据,并将其附加在测试用例里,当开发人员根据这些修改好BUG以后,就可 以再运行一次已经记录好的测试用例来检查断言还有没有发生。甚至,当开发 人员对系统做了某些方面的修改后,可能会产生新的错误,导致原有的测试用 例发生断言,这时,只需要重新运行一次所有的测试用例就可以判断当前的修 改有没有生成新的问题。以上所述,仅为本发明较佳的具体实施方式
,但本发明的保护范围并不局 限于此,任何熟悉该技术的人在本发明所揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内,
权利要求
1、一种自动化软件调测系统,包括程序模块,其特征在于,该系统还包括消息接口模块,用于记录所述程序模块所执行的系统消息及测试数据,并生成测试用例;用例存储单元,用于存储测试用例;模拟器,用于根据测试用例模拟被调测程序模块的运行过程并恢复程序的执行现场;所述消息接口模块将获取的所述程序模块所执行的系统消息及测试数据形成测试用例后存储于所述用例存储单元,所述模拟器读取存储在所述用例存储单元中的测试用例,自动恢复执行现场,并配合调试器对所述程序模块进行调测。
2、 根据权利要求l所述的系统,其特征在于,包括多个程序模块,所述消 息接口模块位于两个程序模块之间,用于记录驱动所述程序模块的系统消息, 以及所述程序模块之间的交互消息,并生成测试用例存储于所述用例存储单元; 所述模拟器读取存储在所述用例存储单元中的测试用例,可分别对所述两个程 序模块进行执行现场的恢复,并配合调试器所述程序模块进行调测。
3、 根据权利要求2所述的系统,其特征在于,所述系统还进一步包括断言 统计接口,用于获取所述程序模块产生的断言的位置及个数信息。
4、 根据权利要求3所述系统,其特征在于,所述系统釆用客户服务器结构,所述程序模块包括客户端子程序模块和服务端子程序模块,分别位于客户端和服务端;所述消息接口模块包括客户端消息接口模块及服务端消息接口模块,分别 位于客户端和服务端;所述用例存储单元包括客户端用例存储单元及服务端用例存储单元,分别 位于客户端和服务端;所述模拟器包括客户端模拟器及服务端模拟器,分别位于客户端和服务端;该系统还包括客户端网络接口模块,用于为所述客户端子程序模块提供与服务端进行网 络消息交互的通讯接口;服务端网络接口模块,用于为所述服务端子子程序模块提供与客户端进行 网络消息交互的通讯接口;所述客户端消息接口模块连接所述客户端子程序模块及所述客户端网络接 口模块,获取与服务端的交互消息并形成测试用例,存储在客户端用例存储单 元中;所述服务端消息接口模块连接所述服务端子程序模块及所述服务端网络 接口模块,获取与客户端的交互消息并形成测试用例,存储在服务端用例存储 单元中。
5、 一种自动化软件调测方法,其特征在于,该方法包括以下步骤A、 记录驱动程序运行的消息,并将其形成测试用例存储;B、 通过调用接口启动待调测的程序;C、 读取所述测试用例,并根据用户所选待调测消息位置通过调用接口自 动恢复执行现场;D、 对所述待调测程序进行调测。
6、 根据权利要求5所述的方法,其特征在于,步骤A中,若是对单程序 进行测试,则所述消息包括系统消息及测试数据。
7、 根据权利要求5所述的方法,其特征在于,步骤A中,若是对存在消 息交互的多个程序中的程序进行测试,则所述消息包括系统消息及程序之间的 交互消息。
8、 根据权利要求5所述的方法,其特征在于,步骤B和步骤C中,所述 接口为组件对象模型COM接口、或普通函数接口,所述接口由所述程序或 所述程序之间附加的消息接口提供。
9、 根据权利要求7所述的方法,其特征在于,步骤C中所述自动恢复执 行现场具体包括Cl、选择待调测消息位置;C2、按照所述交互消息及系统消息产生的时间顺序,通过模拟接口控制所 述待调测程序自动运行到所述待调测消息位置。
10、 根据权利要求5所述的方法,其特征在于,步骤A中还包括使用系统钩子获取所述程序产生断言的位置及个数信息。
11、 根据权利要求IO所述的方法,其特征在于,步骤C和步骤D中,还进一步包括获取所述待调测程序所产生的断言的位置及个数信息,在运行完 测试用例后与在步骤A中所获得的所述断言的位置及个数信息进行比对,判断对所述待调测程序的修改是否正确。
12、 根据权利要求7所述的方法,其特征在于,步骤A中,所述测试用例为函数的测试用例,通过系统钩子获取在执行所述程序某函数之前的所有交互 消息及系统消息,形成所述函数的测试用例。
全文摘要
本发明涉及一种自动化软件调测的方法和系统,尤其涉及一种能够自动生成测试用例并通过模拟器进行软件调测的方法和系统,本发明通过在进行消息交互的程序模块之间附加消息记录接口记录交互消息及系统消息,从而在程序运行过程中自动化形成测试用例,并通过模拟器读取并执行所存储的测试用例以进行自动化的现场恢复,从而很大程度上提高了程序调测的效率。
文档编号G06F11/36GK101295280SQ20081011519
公开日2008年10月29日 申请日期2008年6月18日 优先权日2008年6月18日
发明者陈亮锋 申请人:腾讯科技(深圳)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1