多测师12 发表于 2023-4-19 10:37:20

单元测试中的独立运行

  单元测试中的独立运行
  单元测试是针对代码单元的独立测试。要测试代码单元,首先要其使能够独立运行。项目中的代码具有依赖关系,例如,一个源文件可能直接或间接包含大量头文件,并调用众多其他源文件的代码,抽取其中的一个或一组源文件,一般是无法独立编译运行的。这就要用技术手段进行隔离,即将测试任务与其他代码隔离,必要时还要与依赖系统隔离。此外,并行开发过程中,边开发边测试,还需补齐尚未实现但需调用的代码。
  1、与其他代码隔离
  与其他代码隔离的一般方式是打桩,桩是用来代替实际代码的简单代码,打桩就是编写或生成桩代码。例如,函数A调用了函数B,函数B又调用了函数C和函数D,如果函数B用桩来代替,那么,函数A就可以完全切断与函数C和函数D的关系。
  如果项目有1000个源文件,一位工程师负责测试其中50个,这50个源文件就是测试任务。是不是需要将其他950个源文件的代码都打桩呢?不是的。

https://www.duoceshi.cn/uploads/ueditor/20230419/1-23041Z9360Q58.jpg
  与测试任务关系密切的底层或相关源文件应该直接加入编译,不要打桩,测试时可以调用实际代码,这些源文件称为外围文件。特别是,有些测试数据需要调用现有代码来生成,这些代码所在的文件应作为外围文件。
  其他文件也不需要全部打桩,只有与测试任务和外围文件有关联的代码才需要打桩。自动化测试工具可以根据代码之间的关系,自动识别需打桩的代码。手工测试方式,则可以利用编译器来识别需打桩的代码。将测试任务和外围文件加入测试工程后编译,对于需打桩的函数或全局变量,编译器会报告“符号未定义”链接错误(如VC系列的LNK2005错误)。
  2、与依赖系统隔离
  与依赖系统隔离常见于跨平台测试,例如在PC上测试嵌入式项目。单元测试是针对代码单元的独立测试,主要检测代码功能逻辑,平台设备可以抽象为功能逻辑的组成部分,例如嵌入式设备的端口、寄存器可以视为全局变量,嵌入式操作系统API可以视为一般的底层函数调用,因此,嵌入式项目可以跨平台测试。跨平台测试一般要解决两个问题:编译差异和平台差异。
  跨平台测试可能要使用与开发环境不同的编译环境来编译测试代码,这就可能产生编译差异,例如,有些嵌入式编译器自定义了非标准的特殊关键字,或支持非标准的代码片断,这些特殊关键字和代码片断,一般与功能逻辑无关,测试时可以屏蔽。测试工具可以自动完成这些工作。手工测试方式,则可以利用宏来实现屏蔽。
  平台差异主要表现在基本数据类型的长度差异,例如,int类型在有些嵌入式开发环境下是16位的,而在一般编译器下是32的。测试工具可以转定义关键字,解决这种差异。手工测试方式,则可以利用宏来实现转定义。
  总的来说,独立运行是比较容易解决的,例如打桩,就是一种简单的技术,并且可以用工具自动生成桩代码。真正困难的是覆盖输入问题。


页: [1]
查看完整版本: 单元测试中的独立运行