单元测试系统 【技术领域】
本发明涉及软件测试技术领域, 尤其涉及一种通用的单元测试系统。背景技术 单元测试是在软件开发完成后, 由开发人员根据逻辑覆盖、 代码覆盖、 初始值、 临 界值和期望值等条件, 编写对软件代码的测试代码, 用以检测软件代码的正确性, 从而帮助 开发人员发现问题、 提高软件质量。
目前比较常见的单元测试方法有两种。第一种是自由式单元测试 : 由开发人员编 写单元测试代码, 通过比对期望值与实际结果来确定代码的正确性 ; 该方法纯粹凭借开发 人员自身的素质, 没有任何规范性, 难以进行统计, 且难以评价测试代码的质量 ; 同时, 测 试代码没有现成的工具可用, 编写效率低, 测试时间较长, 导致整个软件开发的时间成本较 高。另一种方法是依靠单元测试库进行测试用例编写, 这些测试库为单元测试提供了强大 的支持, 开发人员可以更为便捷地编写自己的测试用例代码, 使得开发效率有所提高 ; 但单 元测试库对事件的响应机制依然繁琐, 需要开发人员自己开发以适应不同的软件 ; 对于图 形界面的支持有限, 观察结果不够直观 ; 并且测试结果不能够展现测试过程, 需要手工完成 测试文档。
虽然现在存在很多测试代码库和程序框架, 但这些代码库和框架都很独立, 即使 使用者在使用这些库和框架的时候能够比较方便地建立起自己的单元测试框架, 但对其整 体的单元测试并没有太大的帮助。这是因为在使用这些框架的时候, 开发人员不仅需要消 耗大量时间来了解技术内容, 还需要相应制定测试方法 ; 并且, 如果测试方法、 标准制定得 不够严谨, 整个测试将毫无意义。
此外, 目前的单元测试框架也存在很多问题 : 界面干涩不容易使用, 单元测试图形 界面开发不够快速便捷 ; 整体框架复用率低, 只能针对一次单元测试, 下次单元测试时又需 要重新建立测试框架 ; 如果引用了第三方的单元测试库, 整个框架就与这些测试库紧密的 联系起来, 其更换和替代将十分繁琐 ; 而且, 现有的第三方单元测试库不允许使用者随意输 出信息, 这使得通过这些测试库建立的框架不能够产生完善的 log 文件, 减低了单元测试 的可信性和可回溯性 ; 再有, 单元测试结果无法自动保存, 需要测试人员手工完成。
再有, Visual Studio 是 windows 下最主要的开发工具, 而 VisualStudio 有一个 bug 会对测试用例的编写造成影响, 这个 bug 是这样描述的 : “若测试代码所在的静态链接 库与主函数所在的静态链接库不同, 则在 cpp 中书写的测试代码会被 vs 的链接器忽略” 。 对 此, 现有的 gtest 测试框架提供了如下解决方案 : 在测试类中, 将测试函数的声明和定义都 放置在 .h 文件中 ; 在整个工程中建立一个孤立的 .h, 在这个孤立的 .h 文件中引用所有测 试类的 .h 文件 ; 在该孤立的 .h 文件中定义一个无用函数, 该函数可以不执行任何工作 ; 在 主函数中调用该无用函数。上述解决方案的缺陷在于 : 由于所有的声明和定义都放置在 .h 文件中, 导致对其依赖过大, 编译速度慢 ; 并且所有的测试 .h 文件都要被主函数所在的文 件引用, 致使编译速度更慢。对于一个包含上百个测试类的大的工程, 这是不可接受的。
发明内容 ( 一 ) 要解决的技术问题
本发明要解决的技术问题在于如何实现准确、 快速、 高质量的单元测试, 以及如何 规避 Visual Studio 的上述 bug。
( 二 ) 技术方案
为解决上述技术问题, 本发明的技术方案提供了一种单元测试系统, 包括通过计 算机网络连接的服务器端装置和客户端装置 ; 其中
所述服务器端装置, 生成并存储有测试规范文档、 测试用例模板和测试事件基础 库, 以供所述客户端装置调用 ; 其中, 所述测试事件基础库中的事件以封装的形式包含多 个与测试用例执行情况相关的信息, 所述信息在所述事件被触发时被提供给所述客户端装 置;
所述客户端装置, 为用户呈现所述测试规范文档和测试用例模板 ; 将用户基于所 述测试用例模板生成的测试用例文档编译为动态链接库文件 ; 以预置参数为索引值将测试 结果自动返填至所述测试用例文档的相应位置处。
其中, 所述测试规范文档包括测试用例模板设置规范, 包括 :
枚举类型定义模块, 用于定义一个枚举类型, 其中的枚举项为所有的测试类名 ;
模板函数定义模块, 用于定义一个模板函数, 其类型参数为所述枚举类型定义模 块中定义的枚举类型的枚举值 ;
模态特化模块, 用于在测试用例文档中, 利用模态特化, 特化所述模板函数定义模 块中定义的模板函数, 其类型参数为所述测试用例文档的测试类名 ;
特化函数调用模块, 用于在主函数中, 采用递归的方法, 调用所述模态特化模块中 的特化的模板函数。
其中, 所述测试用例模板通过 EXCEL 文档实现, 包括 : 测试用例描述、 测试类名称、 测试函数名称、 测试内容和测试结果中的一个或多个。
其中, 所述多个与测试用例执行情况相关的信息包括 : 测试类描述、 为所述测试 类提供的全部测试函数的数量、 执行成功的测试函数数量、 执行失败的测试函数数量、 全部 测试函数运行的总时间、 测试时所运行的系统环境、 测试的日期时间、 当前测试函数功能描 述、 当前测试函数执行的总时间、 测试函数的日志记录中的一个或多个。
其中, 所述测试事件基础库中的事件与所述多个与测试用例执行情况相关的信息 一起被封装为动态链接库格式。
其中, 所述用于将测试结果自动返填至匹配的测试用例文档的相应位置处的索引 值为测试函数名。
其中, 所述客户端装置还包括测试信息格式化子模块, 用于在当前待测功能点的 所有测试函数执行完成后, 根据所述测试规范文档中描述的格式规定, 将测试过程中生成 的信息转化为规范化格式数据。
其中, 所述客户端装置还设置有将所述规范化格式数据导出至 excel 的接口。
( 三 ) 有益效果
与现有的单元测试框架相比, 本发明提供的单元测试系统具有以下优势 :
1、 界面开发便捷 : 由于统一使用了 DLL 格式封装, 按调用 DLL 的方式即可方便获取 测试结果 ; 由于测试库被封装为 DLL, 支持任何语言调用, 给界面开发最大的空间 ; 封装之 后的事件反馈了更多更准确的测试信息, 并且支持测试人员拓展自己特有的信息 ; 可以反 馈符合规范、 格式化的数据, 易于结果保存评估。
2、 规范的标准 : 通过测试规范文档对用户在使用本系统进行单元测试的所有操作 提出了明确要求, 帮助用户更规范地执行测试, 提高单元测试质量, 并降低工作强度。
3、 结果保存 : 测试结果导出至测试用例文档, 便于对测试的效果进行分析、 统计和 评价。
4、 规避 Visual Sutdio 的 bug : 利用测试用例模板的特性, 回避了 Visual Studio 的严重 bug, 并且使代码不至于因此而笨重。 附图说明
图 1 是根据本发明的单元测试系统的结构示意图。 具体实施方式
本发明提出的单元测试系统, 结合附图及具体实施例说明如下。
如图 1 所示, 本发明的单元测试系统包括通过计算机网络连接的服务器端装置和 客户端装置两部分。
根据本发明的服务器端装置主要用于生成并存储单元测试规范文档、 测试用例模 板和事件基础库, 以供所述客户端装置调用。下面将结合具体实施例对上述单元测试规范 文档、 测试用例模板和事件基础库分别进行详细说明。
现有的单元测试框架一般只为使用者提供基本的单元测试库代码, 使得使用者除 了按要求使用这些代码之外, 还需要自己编写与之相应的单元测试规范, 不但加重了工作 负担, 而且使用者自行定制单元测试规范也不一定准确和实用。本发明将单元测试规范融 入到单元测试系统中, 减轻用户的工作复杂度 ; 通过单元测试规范将完整的单元测试流程 和要求文档化, 通过客户端装置呈献给用户查看, 易于使用者操作。这样, 即使使用者没有 单元测试经验或者没有单元测试的相关基础, 只要参照规范文档, 就可以快速、 专业的执行 单元测试。
本发明的单元测试规范的一个实施例可以包含文档简介、 单元测试简介、 单元测 试方法、 单元测试规则四个章节, 其中文档简介主要介绍文档目的和使用范围, 还涉及一些 术语的解释 ; 单元测试简介则包括测试用例文档结构、 工程结构等等, 使使用者能够对整体 的测试框架有一个完整的认识 ; 单元测试方法主要定义单元测试的流程及方法, 用户需要 按照其中定义的流程 ( 例如, 单元测试用例编写, 单元测试运行, 单元测试结果录入等 ) 进 行单元测试 ; 单元测试规则中可以详细列出单元测试中需要遵守的规范, 例如函数命名规 范、 文件命名规范、 log 文件输出规范等等。
此处, 针对背景技术中提到的 Visual Studio 的 bug, 以测试用例编写为例, 对单 元测试规范的一个实施例进行详细说明。本实施例的测试用例编写规范包括 :
A、 定义一个枚举类型, 其中的枚举项为, 所有的测试类名 ;
B、 定义一个模板函数, 类型参数为 A 中定义的枚举类型的枚举值 ; 即: 需将当前的测试类名, 作为新的枚举值加入 A 中定义的枚举类型中 ;
C、 在每一测试用例文档中, 利用模态特化, 特化 B 中定义的模板函数 ; 类型参数为 该测试用例文档的测试类名 ;
D、 在主函数中采用递归的方法, 调用 C 中每一个测试用例文件文档中的特化的模 板函数。
其 中, 只 需 在 每 个 测 试 类 的 .cpp 文 件 中 调 用 GTEST IDELFUNFOR VS CPPFILE BUG(testClassName) 宏, 并将测试类名作为参数传入, 即可实现 C ; 只需在主函数中调用 CALLNOO 宏, 即可实现 D。
针对上述测试用例编写规范, 本发明的单元测试系统的服务器端装置中的测试规 范文档包括 :
枚举类型定义模块, 用于定义一个枚举类型, 其中的枚举项为所有的测试类名 ;
模板函数定义模块, 用于定义一个模板函数, 其类型参数为所述枚举类型定义模 块中定义的枚举类型的枚举值 ;
模态特化模块, 用于在测试用例文档中, 利用模态特化, 特化所述模板函数定义模 块中定义的模板函数, 其类型参数为所述测试用例文档的测试类名 ; 特化函数调用模块, 用于在主函数中, 采用递归的方法, 调用所述模态特化模块中 的特化的模板函数。
由此, 本发明的系统提供的测试规范文档可避免 Visual Studio 的 bug, 不需要 在主函数文件中引用每个测试类的头文件, 只需包含定义枚举类型定义模块中所述枚举 类的头文件即可。在每个测试类的 .cpp 文件中调用 GTEST_IDELFUN_FOR_VS_CPPFILE_ BUG(testClassName) 宏, 传入测试类名作为参数, 再在主函数中调用 CALLNOO 宏即可。 避免 了编译依赖过大, 编译速度慢的问题。
由于编写单元测试用例是测试人员在单元测试过程中的必要工作内容, 设置测试 用例模板可以省去测试人员自行编写的工作量。一般来说, 单元测试的对象通常是具有多 个功能模块 ( 功能点 ) 的程序, 针对每一功能模块 ( 功能点 ) 可以编写出多个测试函数, 用 于测试该功能点在不同初始条件下的表现, 这些测试函数会被归于一个类中, 即: 一个测试 类对应于一个功能点。 因此, 本发明的单元测试用例模板应完整体现测试用例的各种信息, 以实现测试规范文档中的单元测试编写要求。 本发明的单元测试用例模板的一个实施例可 以包括 : 测试用例描述、 测试类名称、 测试函数名称、 测试内容和测试结果。
优选地, 本发明的单元测试用例模板以 EXCEL 格式文档实现, 用户通过简单操作, 将其拷贝复制即可建立测试用例文档, 在其中输入自己的测试数据即可使用。 此外, 基于单 元测试用例模板的上述设置, 在用户按照测试用例编写规范进行编写的前提下, 本发明的 系统在执行一个测试用例后, 可以通过预置参数来匹配文档, 自动查找文件中对应的测试 用例位置, 并将测试结果 ( 测试用例运行结果, 运行附加信息, 测试函数运行时间等等 ) 自 动回填至该位置, 大大减少了单元测试人员的工作量 ; 如果执行结果是错误的, 系统还将在 测试用例文档中给予高亮提醒 ; 此外, 系统还可以选择性将当时的运行参数输出, 输出内容 可以由用户自行设定 ( 用户可以自己在测试代码中定义 ), 以达到更好的记录效果。 而现有 的单元测试框架中, 通常需要测试人员将测试结果手工输入到单元测试用例文档中, 以保 证文档的完整。因此, 本发明的系统对这一步骤进行了优化。
由于测试用例模板的设置与单元测试规范文档相关, 其具体实施方式可以参见前 述规避 Visual Studio 的 bug 的实施例。
现有的软件测试框架, 例如 cppunit 或 gtest, 通常提供有测试基础库, 提供测试 用事件及其测试用例执行信息, 例如, 测试类类名、 测试函数的执行是否成功、 期望值、 实际 值以及执行出现错误时测试人员对可能的错误原因的简要描述。 而本发明的测试事件库不 仅可以引用现有事件库中的事件, 还提供了更为全面的信息, 例如 : 测试类 ( 功能点 ) 描述、 为该测试类提供的全部测试函数的数量、 执行成功的测试函数数量、 执行失败的测试函数 数量、 全部测试函数运行的总时间、 测试时所运行的系统环境、 测试的日期时间、 当前测试 函数功能描述、 当前测试函数执行的总时间、 测试函数的日志记录。 上述信息与基础库事件 一起被封装为 dll(Dynamic Link Library, 动态链接库 ) 格式, 并设置有触发接口。由此, 本发明的客户端装置可以绑定事件基础库所提供的事件, 以便在测试用例执行的特定时期 执行相关操作 ; 而且, 一旦事件被触发, 上述相关信息将同时被提供给客户端装置, 为用户 呈现。 除此以外, 测试人员想要在测试过程中呈现到用户界面的额外数据和描述, 也可以由 测试人员封装为字符串, 存储在本发明提供的 buffer 中, 在相应的事件被触发时传送至用 户界面。而使用现有的基础库时, 只能在测试出错时才能查看到上述相应信息。 根据本发明的客户端装置包括测试功能模块和用户界面两部分。
使用者可以通过本发明的客户端装置的用户界面查看到存储于服务器端装置中 的单元测试规范文档和测试用例模板, 在其指导下新建工程 ( 例如 c++ 工程 ), 并在该工 程下按要求编写测试用例, 发送给测试功能模块。测试功能模块将完成的测试用例编译为 dll(DynamicLink Library, 动态链接库 ) 格式, 以备用户界面调用。
根据本发明的单元测试系统, 用户可自由开发自己的用户界面, 新建工程 ( 可以 为任何语言 ), 例如, 基于 C# 的 winform, 基于 C++ 的 vc, wtl 等等, 它们都具有导入动态链 接库的能力, 当导入动态链接库后, 就可以方便绑定所需事件接口 ( 关于事件接口可参照 前述测试事件库的描述 )、 调用其提供的函数、 获取其数据展现。
此外, 测试功能模块还提供测试信息格式化子模块, 其在某一功能点的全部测试 函数执行完成后自动运行, 以根据测试规范文档中描述的格式规定对测试过程中生成的信 息进行格式转化。 同时, 还可以对测试功能模块进行设置, 使其在某一功能点的全部测试函 数执行完成后触发一个事件, 如果用户界面绑定对应的事件, 则可获得这些具有规范化格 式的测试信息数据。此外, 测试功能模块还可以提供将上述数据按规范格式导出到 excel 的接口, 由此, 用户界面只需直接调用 excel 即可获取规范的数据结果。
综上所述, 与现有的单元测试框架相比, 本发明提供的单元测试系统具有以下优 势:
1、 界面开发便捷 : 由于统一使用了 DLL 格式封装, 按调用 DLL 的方式即可方便获取 测试结果 ; 由于测试库被封装为 DLL, 支持任何语言调用, 给界面开发最大的空间 ; 封装之 后的事件反馈了更多更准确的测试信息, 并且支持测试人员拓展自己特有的信息 ; 可以反 馈符合规范、 格式化的数据, 易于结果保存评估。
2、 规范的标准 : 通过测试规范文档对用户在使用本系统进行单元测试的所有操作 提出了明确要求, 帮助用户更规范地执行测试, 提高单元测试质量, 并降低工作强度。
3、 结果保存 : 测试结果导出至测试用例文档, 便于对测试的效果进行分析、 统计和
评价。 4、 规避 Visual Sutdio 的 bug : 利用模板的特性, 回避了 Visual Studio 的严重 bug, 并且使代码不至于因此而笨重。
以上实施方式仅用于说明本发明, 而并非对本发明的限制, 有关技术领域的普通 技术人员, 在不脱离本发明的精神和范围的情况下, 还可以做出各种变化和变型, 因此所有 等同的技术方案也属于本发明的范畴, 本发明的专利保护范围应由权利要求限定。