单元测试方法及系统的制作方法_3

文档序号:9200305阅读:来源:国知局
别进行的控制,因此如果支持某一种语言,那么真正意义上的"完整支持"所有这 一语言已经支持的CPU体系架构。
[0072] 同时,对于任何还不支持的语言,对其实现新的支持,仅需要采用开源编译器的现 有代码,或者采用类似Lex/Yacc这种通用的词法/语法分析器,就可以较现有技术容易得 多地实现控制代码的注入。同时可靠性和正确性是这一新语言的编译器所保证的,出错的 概率很低。实践中,采用Clang这一开源的编译器的前端,就简单实现了针对C语言的控制 代码的插入功能。同时,这对像Bash Script这类脚本语言,本发明的方案从理论上不存在 实现的障碍。
[0073] 图3是示出了根据本发明的一方面的在注入了控制代码后单个单元被调用时的 执行流程图300。被测文件由各个单元组成,对于被测文件中的每个单元而言,该单元可能 被其他单元所调用,也可能调用其他单元。在执行被测文件的测试过程中,某一单元的角色 可能会改变,例如该单元可能是当前正在测试的被测单元的角色,也可能是被测单元所调 用的单元的角色。
[0074] 如前文所述,本发明的控制代码是统一格式的指令,可以实现统一定义的控制目 的。即,对于被测文件中的每个单元都注入统一的控制指令。在测试的执行过程中,当某个 单元作为被调用单元被当前的被测单元调用时,该单元中注入的控制代码就会起作用,即 在注册表中记录该单元被调用的执行信息,然后对该单元的行为进行控制。然而,当该单元 是被测单元的角色并且调用了其他单元时,则注入到该单元的所调用单元中的控制代码就 会对该单元的所调用单元的行为进行控制。图3中正是示出了在测试过程中当某一单元被 当前被测单元所调用时,该单元受控制代码的控制所执行的流程。
[0075] 步骤301,单元被调用。在测试执行中,该单元被被测单元所调用。
[0076] 步骤302,在注册表中记录执行信息。在该步骤中,在注册表中记录下该单元被调 用的执行信息,以在后续的验证阶段依据验证逻辑进行验证。在一实例中,记录执行信息可 包括但不限于记录该单元的本次调用,和/或记录该单元调用的参数。
[0077] 步骤303,判断该单元是否需要被替换为替换单元,若是,则进入步骤304,否则进 入步骤305。
[0078] 步骤304,将参数代入替换单元执行以返回执行结果,进入步骤310。
[0079] 步骤305,判断是否需要修改该单元的参数,若是,则进入步骤306,否则进入步骤 307。
[0080] 步骤306,将该单元的参数修改为指定值,并进入步骤307。
[0081] 步骤307,判断是否需要为该单元返回指定值,若是,则进入步骤308,否则进入步 骤 309。
[0082] 步骤308,直接为该单元返回指定值,进入步骤310。
[0083] 步骤309,执行该单元的原始逻辑。即,该单元的调用实际并未被修改,从而执行自 身原始的逻辑。
[0084] 步骤310,结束该单元调用。
[0085] 以下用一个简单的C语言函数举例:
[0086]
[0087] 其中,外部函数bar首先通过语法分析被识别,自动替换为桩函数
[0088]
[0089] 在注入器对其进行测试控制语句的注入后,代码变为:
[0090]
[0091] 以下是针对以上流程的BashScript语言实施例:
[0092]
[0093]
[0094] 其中,函数bar〇被注入器注入后,代码变为:
[0095]
[0096]
[0097] 图4是示出了根据本发明的一方面的测试逻辑设置过程的序列图400。如图4所 示,测试/集成环境410可调用测试脚本420以定义所需要的测试逻辑。测试脚本420是 测试逻辑的体现,可由设置脚本105、验证脚本106和被测语言所支持的其他语句构成。测 试逻辑是在软件程序完成之前或之后,按照需要实现或者已经实现的逻辑功能,一并结合 测试目的、测试强度等需要,综合归纳出的。
[0098] 相应地,测试逻辑可包括控制逻辑,验证逻辑可由设置脚本420登记在注册表450 中。控制逻辑可用于根据测试目的在测试执行中对每个单元被调用时的行为进行设置。在 一实例中,根据测试需要,对每个单元被调用时的行为的设置可包括但不限于,用替换单元 来替代该单元的执行,将该单元的参数修改为指定值,以及为该单元强制返回指定值。这些 行为均由设置脚本430在测试逻辑设置阶段写入注册表中,以供程序执行阶段由注入器注 入的控制代码读取并实现。
[0099] 另外,测试逻辑还可包括验证逻辑,验证脚本440可用原生语句的方式提供验证 逻辑。在一实例中,在测试逻辑设置阶段,出于性能的考虑,验证脚本440可在注册表450 中登记验证逻辑,以声明哪些信息是需要被记录的,以供验证时使用。相应地,控制代码在 测试执行中可根据注册表中的验证逻辑向注册表中记录必要的执行信息。在一实例中,根 据测试需要,可能需要记录以待验证的信息可包括但不限于,需要记录其调用顺序的单元, 以及在单元被调用时需要记录其值的参数。这些信息均被保存在注册表450中,待执行测 试以及验证时,这些信息将作为测试依据被动态提取调用。
[0100] 如上文所述,本发明的测试逻辑可以在软件程序完成之后、也可以在软件程序完 成之前就定义。换言之,本发明的测试逻辑可以是测试人员通过通读被测单元后,总结归纳 出的;也可以是事先设计的,程序还未完成,就可以写出的测试用例,因此可应用于回归测 试和测试驱动开发。
[0101] 而且,本发明中采用了与被测文件相同的编程语言来定义测试脚本,因此现有编 辑器依然可以对测试脚本进行语法检测,高亮和提示,极大提高开发效率。同时本方案可以 和同语言的其他测试框架无缝集成,类似JMock对应于JUnit,由其他测试框架负责测试脚 本的执行和测试结果数据的收集,而本方案则专注于具体测试逻辑本身的控制。
[0102] 图5是示出了根据本发明的一方面的测试执行过程的序列图500。如图所示,测试 /集成环境510可按原有的顺序被执行。当执行到被测文件520时,被测文件520中的当前 被测单元的原有逻辑(被测逻辑)被执行。另外,该被测单元可能调用了其他单元(称之为被 调用单元),此时,在先前控制代码注入阶段注入到该被调用单元中的控制代码530也被执 行。具体地,该控制代码530可使得首先向注册表540中记录该被调用单元的执行信息,随 后可从注册表540中读取并执行控制逻辑。在本发明中,通过注入的控制代码530,使得能 够交替地执行被测单元的原始逻辑和该被测单元所调用单元的控制逻辑。而且,通过注入 的控制代码530,被测单元的所调用单元的执行信息被记录在注册表540中,从而可在后续 验证阶段进行验证。
[0103] 图6是示出了根据本发明的一方面的验证过程的序列图600。如图6所示,在验证 阶段,测试/集成环境610可调用测试脚本620,后者可执行验证逻辑。具体地,验证脚本 630可从注册表640中读取执行信息,并依据验证逻辑和读取的执行信息来执行验证。
[0104] 在软件开发过程中,特别是在需要进行回归测试或者由测试驱动开发的场合,需 要使用单元测试来保证程序预期逻辑的正确性。例如,对于被测单元而言,希望验证的预期 逻辑可包括但不限于,被测单元的所调用单元是否按照预期的调用顺序被执行,被测单元 的所调用单元每次被调用时的参数是否为预期值,以及被测单元是否返回了预定值,等等。 通过本发明的方案,能够很好地对软件程序的逻辑进行验证。
[0105] 例如,如果需要验证一函数被被测函数进行调用的调用顺序,那么需要被验证的 该函数由验证脚本630在定义验证逻辑时登记在注册表640中。测试执行阶段,在每次该 函数被调用时,如果控制代码通过读取注册表640,发现此函数被登记,则向注册表640中 记录这一调用的执行信息。在程序执行后,注册表640中就按照时间的先后,保留了所登记 的函数依次被调用的顺序。验证脚本630进行验证时,可将这一顺序作为执行信息从注册 表640中读出,从而和需要验证的顺序进行比对,实现验证。
[0106] 图7是示出了根据本发明的一方面的单元测试方法的流程图700。如图7所示,流 程图700包括以下步骤:
[0107] 步骤702,向被测文件中的每个单元注入用于测试目的的控制代码。这里,单元可 包括但不限于函数、方法、过程中的任意一者。
[0108] 在一实例中,注入该控制代码可包括对被测文件执行词法分析和语法分析以生成 抽象语法树,对作为该抽象语法树上的每个单元的节点注入控制代码,以及将注入了控制 代码的抽象语法树转换回被测文件。该控制代码可以是由被测文件语言编写的统一格式的 指令。
[0109] 在一实例中,控制代码可用于在测试执行中按需将每个单元被调用时的执行信息 首先记录在所述注册表中,并对该单元被调用时的行为进行控制。向注册表中记录每个单 元被调用时的执行信息可包括但不限于记录该单元的本次调用,和/或记录该单元的参 数。
[0110] 在一实例中,对每个单元被调用时的行为进行控制可包括但不限于:单元替换判 断、参数修改判断和指定值返回判断。在单元替换判断中,判断该单元是否需要被替换为替 换单元,若是,则将参数代入替换单元执行以返回执行结果,并结束该单元的调用;在参数 修改判断中,判断是否需要修改该单元的参数,若是,则将该单元的参数修改为指定值并进 入指定值返回判断,若否,则进入指定值返回判断;在指定值返回判断中,判断是否需要为 该单元返回指定值,若是,则直接返回指定值并结束该单元的调用,若否,则执行该单元的 原始逻辑。
[0111] 步骤704,定义测试逻辑,该测试逻辑可包括控制逻辑和验证逻辑,其中所述控制 逻辑被登记在注册表中。该控制逻辑可用于根据测试目的在测试执行中对每个单元被调用 时的行为进行设置,以及该验证逻辑可用于声明需要记录以待验证的信息。
[0112] 在一实例中,对每个单元被调用时的行为的设置可包括但不限于,用替换单元来 替代该单元的执行,将该单元的参数修改为指定值,以及为该单元强制返回指定值。
[0113] 在一实例中,该需要记录以待验证的信息可包括但不限于,需要记录其调用顺序 的单元,以及在单元被调用时需要记录其值的参数。
[0114] 在一实例中,该测试逻辑由测试脚本定义,测试脚本可由设置脚本、验证脚本和被 测语言所支持的其他语句构成,其中,设置脚本在注册表中登记控制逻辑,以及验证脚本在 注册表中登记验证逻辑
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1