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

文档序号:9200305阅读:540来源:国知局
单元测试方法及系统的制作方法
【技术领域】
[0001] 本发明涉及软件测试,尤其涉及一种单元测试方法及系统。
【背景技术】
[0002] 单元测试是指对软件程序中的最小可测试单元进行检查和验证,以检验程序逻辑 的正确性,由此确保所编写程序的代码的行为是否与编程者期望的一致。单元测试是在软 件开发过程中要进行的最低级别的测试活动,软件的一独立单元将在与程序的其他部分相 隔离的情况下进行测试。
[0003] 对于面向对象的编程语言(例如,C++)来说,因为其所提供的抽象功能相对比较具 体,可以比较简单地通过一定的替换技术,将被测单元和其他目标隔离开来,即除了被测单 元本身的逻辑保持不变,其他对象均可以是出于测试目的而构造的伪对象,从而达到解除 被测单元和其他对象之间耦合的目的,例如JMock。
[0004] 但是,对于许多较为底层的面向过程的编程语言(例如,C语言),或者一些基于解 释器解释执行的脚本语言(例如,Bash Script),在对它们所需要实现的逻辑功能编写单元 测试用例的时候,缺乏简单有效的方法来解除被测单元与其它部分之间的耦合,使得编写 单元测试用例的人员无法专注于被测逻辑的验证,而在解除耦合的方法上花费了大量不必 要的精力。
[0005] 现有技术的解决方案主要有以下特点和缺陷。
[0006] 现有技术多采用二进制插桩的方式进行测试控制代码的植入,或者依赖 于对于编译后的二进制文件的分析,例如,CN200510126499. 1、CN200710117969. 7、 CN200710121236. 0、CN200710129959· 5、CN201110380418. 6 ;或者依赖特定编程语言的特定 技术来实现其核心功能,例如CN02146712. 9、CN200510040422. 2。
[0007] 此类测试方案的问题在于仅能针对特定的CPU体系结构来实现,具有一定的局限 性,针对不同CPU体系结构,实现难度大,并且繁琐;又或者仅能针对某一特定的编程语言、 或者具有类似特性的语言来实现,如果程序语言不具备类似特性,那么就很难实现。而且, 对于解释器解释执行的脚本语言,如果解释器的技术没有公开,此类测试技术也会变得一 筹吴展。
[0008] 现有技术常通过分析源代码、自动插入代码修改其分支路径的执行,以覆盖 所有程序的执行分支。为了控制程序的分支执行,代码的自动插入修改了被测单元 的原有分支执行逻辑。例如,CN02146712.9、CN200510126499. 1、CN201110338915.X、 CN200710177534. 1。
[0009] 此类测试手段修改了被测函数的原有逻辑。具体而言,在被测单元原逻辑中的代 码插入,其逻辑一致性无法得到保证一一即原函数逻辑和修改后的逻辑是否一致,已经无 从论证了。因此就算测试通过,只能说明被测程序单元中各条指令的可执行性,但是其逻辑 正确性,特别是在多线程、存在竞争的环境中,无从验证。
[0010] 现有技术多采用和被测文件不一样的编程语言来定义测试脚本,例如, CN02146712. 9、CN200510126499. 1、CN200710176970. 7。此类技术的问题在于开发人员的学 习成本增加,无法利用现有编辑工具。
[0011] 现有技术也不足以应对大规模单元测试的需求。对于大规模的单元测试用例的 撰写,依然需要手工编写大量桩函数来控制测试行为;或者因为技术原因,就算编写了桩函 数,在不修改代码的情况下,也无法进行插桩操作。
[0012] 而且,在实际工程实践中,代码重构后如何保证程序的功能依然正确,也是非常重 要的一个课题。目前流行的开发方法中,对测试驱动开发(Test-Driven Development,TDD) 的需求也越来越高。但是某些现有技术的单元测试手段并不支持代码重构后的回归测试, 或者测试驱动开发。
[0013] 例如,一些现有技术将已经完成的程序作为输入,以生成执行其中每条语句的测 试用例。这类单元测试仅测试程序语句的可执行性,对程序逻辑上的正确性不做验证。因 此,不支持重构程序以后的回归测试,以及测试驱动开发的模式,例如CN201110338915. X、 CN200710177534. 1。
[0014] 可见,现有技术的单元测试方案在针对面向过程编程测试的通用性上存在局限, 在程序逻辑正确性的测试上存在不足,无力应对测试需求量大,测试覆盖率要求高的测试, 而且无法用于代码重构后进行的回归测试、或者需要进行测试驱动开发场合的单元测试。 因此,本发明亟需一种改进的单元测试方案。

【发明内容】

[0015] 以下给出一个或多个方面的简要概述以提供对这些方面的基本理解。此概述不是 所有构想到的方面的详尽综览,并且既非旨在指认出所有方面的关键性或决定性要素亦非 试图界定任何或所有方面的范围。其唯一的目的是要以简化形式给出一个或多个方面的一 些概念以为稍后给出的更加详细的描述之序。
[0016] 根据本发明的一方面,提供了一种用于单元测试的方法,包括:向被测文件中的每 个单元注入用于测试目的的控制代码;定义测试逻辑,测试逻辑包括控制逻辑和验证逻辑, 其中控制逻辑被登记在注册表中;执行被测文件测试,执行包括执行被测单元的原始逻辑 和被测单元的所调用单元的控制逻辑,其中,控制逻辑由控制代码从注册表中读取和实现; 以及基于验证逻辑执行对被测单元的预期逻辑的验证。
[0017] 在一实例中,单元包括函数、方法、过程中的任意一者。
[0018] 在一实例中,控制代码用于在测试执行中按需将每个单元被调用时的执行信息首 先记录在注册表中,并对该单元被调用时的行为进行控制。
[0019] 在一实例中,验证逻辑也被登记在注册表中,其中控制代码在测试执行中根据注 册表中的验证逻辑在注册表中记录每个单元被调用时的执行信息。
[0020] 在一实例中,按需向注册表中记录每个单元被调用时的执行信息包括:记录该单 元的本次调用;和/或记录该单元被调用时的参数。
[0021] 在一实例中,执行验证包括:从注册表中读取执行信息;以及基于执行信息和验 证逻辑执行验证。
[0022] 在一实例中,对被测单元的预期逻辑的验证包括以下至少一者:验证被测单元的 所调用单元是否按照预期的调用顺序被执行;验证被测单元的所调用单元每次被调用时的 参数是否为预期值;以及验证被测单元是否返回预定值。
[0023] 在一实例中,对每个单元被调用时的行为进行控制至少包括:单元替换判断,包 括:判断该单元是否需要被替换为替换单元,若是,则将参数代入替换单元执行以返回执行 结果,结束该单元的调用,以及若否,则进入参数修改判断;参数修改判断,包括:判断是否 需要修改该单元的参数,若是,则将该单元的参数修改为指定值,并进入指定值返回判断, 以及若否,则进入指定值返回判断;指定值返回判断,包括:判断是否需要为该单元返回指 定值,若是,则直接返回指定值,结束该单元的调用,若否,则执行该单元的原始逻辑。
[0024] 在一实例中,控制逻辑用于根据测试目的在测试执行中对每个单元被调用时的行 为进行设置,以及验证逻辑用于声明需要记录以待验证的信息。
[0025] 在一实例中,对每个单元被调用时的行为的设置包括以下至少一者:用替换单元 来替代该单元的执行;将该单元的参数修改为指定值;以及为该单元强制返回指定值。
[0026] 在一实例中,需要记录以待验证的信息包括以下至少一者:需要记录其调用顺序 的单元;以及在单元被调用时需要记录其值的参数。
[0027] 在一实例中,注入控制代码包括:对被测文件执行词法分析和语法分析以生成抽 象语法树;对作为抽象语法树上的每个单元的节点注入控制代码;以及将注入了控制代码 的抽象语法树转换回被测文件。
[0028] 在一实例中,控制代码是由被测文件语言编写的统一格式的指令。
[0029] 在一实例中,测试逻辑由测试脚本定义,测试脚本由设置脚本、验证脚本和被测文 件语言所支持的其他语句构成,其中,设置脚本在注册表中登记控制逻辑,以及验证脚本在 注册表中登记验证逻辑。
[0030] 在一实例中,测试脚本由被测文件语言所编写。
[0031] 根据本发明的另一方面,提供了一种用于单元测试的系统,包括:注入器,注入器 用于向被测文件中的每个单元注入用于测试目的的控制代码;测试逻辑设置模块,测试逻 辑设置模块用于定义测试逻辑,测试逻辑包括控制逻辑和验证逻辑,其中控制逻辑被登记 在注册表中;测试执行模块,测试执行模块用于执行被测文件测试,执行包括执行被测单元 的原始逻辑和被测单元的所调用单元的控制逻辑,其中,控制逻辑由控制代码从注册表中 读取和实现;以及验证模块,验证模炔基于验证逻辑执行对被测单元的预期逻辑的验证。
[0032] 在一实例中,单元包括函数、方法、过程中的任意一者。
[0033] 在一实例中,控制代码用于在测试执行中按需将每个单元被调用时的执行信息首 先记录在注册表中,并对该单元被调用时的行为进行控制。
[0034] 在一实例中,验证逻辑也被登记在注册表中,其中控制代码在测试执行中根据注 册表中的验证逻辑在注册表中记录每个单元被调用时的执行信息。
[0035] 在一实例中,向注册表中按需记录每个单元被调用时的执行信息包括:记录该单 元的本次调用;和/或记录该单元被调用时的参数。
[0036] 在一实例中,验证模块还用于:从注册表中读取执行信息;以及基于执行信息和 验证逻辑执行验证。
[0037] 在一实例中,验证模块对被测单元的预期逻辑的验证包括以下至少一者:验证被 测单元的所调用单元是否按照预期的调用顺序被执行;验证被测单元的所调用单元每次被 调用时的参数是否为预期值;以及验证被测单元是否返回预定值。
[0038] 在一实例中,对每个单元被调用时的行为进行控制至少包括:单元替换判断,包 括:判断该单元是否需要被替换为替换单元,若是,则将参数代入替换单元执行以返回执行 结果,结束该单元的调用,以及若否,则进入参数修改判断;参数修改判断,包括:判断是否 需要修改该单元的参数,若是,则将该单元的参数修改为指定值,并进入指定值返回判断, 以及若否,则进入指定值返回判断;指定值返回判断,包括:判断是否需要为该单元返回指 定值,若是,则直接返回指定值,结束该单元的调用,若否,则执行该单元的原始逻辑。
[0039] 在一实例中,控制逻辑用于根据测试目的在测试执行中对每个单元被调
当前第1页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1