amazzzzzing

导航

对一个已有项目搭建单元测试集的一个方法

对一个已有项目搭建单元测试集的一个方法

0 说明

1 准备

1.1 软件环境

googletest
cmake

1.2 需要的知识

单元测试相关概念

1.3 一般原则

  1. 每次只测试一个对象,被测对象应该尽可能的独立,应该是一个很小的单元,依赖项通过mock或stub模拟;
  2. 每个测试项均应执行迅速且独立于测试环境;
  3. 各个测试之间,可以共享一些通用的模拟模块;如果存在模拟模块的特化,则也可以将模拟模块接口化;除此之外,各个测试应该完全独立;

Q: 每次只测试一个对象?

A: 就和函数应该只有一个功能一样,方便理解和维护;

Q:被测对象应该尽可能独立?

A:是指如果被测模块耦合性很强,则为了达到测试的独立性,就会产生很大的模拟工作量,需要考虑单元测试的投入产出比;

Q:哪些依赖项应通过模拟处理?哪些依赖项可以直接使用?

A:1. 如果引入某个依赖项,会影响测试的独立性(比如访问了文件系统),就应该通过模拟去掉这个依赖;2. 如果依赖本身特别复杂,不容易模拟,则这个测试项可能并不适合放在单元测试中;3. 如果依赖项和被测项耦合紧密,不容易分离,则可以考虑直接引入依赖项。注意此时依赖项也是测试项的一部分;4. 如果依赖项中不涉及逻辑实现,则可以直接引入;

2 名词

2.1 mock

mock是指被测试程序依赖的一些外部对象。

项目中我们不通过名字来区分mock、stub、fake对象,统一用mock来表示。注意在编写外部依赖时,控制复杂度(角色不能过多,或者说单一依赖角色尽量单一)。

3 步骤

3.1 测试对象

一个测试集对应一个文件集中的模块。

一个测试集由多个对象组成。一个对象表示一个具体的功能,比如测试程序,mock库,工具库。测试程序是最终会运行的程序,通常由被测试的源代码、依赖库。

3.2 根目录

根目录的CMakeLists.txt给出整个测试集涉及的所有模块的相关定义。对于测试程序,给出测试程序的名字。对于依赖库,给出库的名字,库的源文件。

3.3 子目录

3.3.1 对单个文件进行测试

创建一个和单个文件所在的路径完全一致的文件夹(这个文件夹就是测试这个文件的对应文件夹)。例如,被测试文件的路径为a/b/c/func.cpp,则创建文件夹为a/b/c/func/,然后在这个文件夹中创建CMakeLists.txt和对应的测试文件如test_func.cpp

eg.

被测文件
project_path/a/b/c/func.cpp

测试文件夹
test_path/a/b/c/func/
test_path/a/b/c/func/CMakeLists.txt
test_path/a/b/c/func/test_func.cpp

测试文件夹中的CMakeLists.txt主要内容为:

  • 要引入的头文件路径。
  • 生成可执行文件,并给定对应的源文件。源文件通常包括测试文件、被测试文件、主函数文件。
  • 链接库。除了被测对象外,依赖的对象均应作为MOCK对象提供(不要从被测项目中获取)。
  • 添加本测试特定的编译选项(如宏定义)

3.3.2 对一个目录进行测试

与单个文件相比,调整测试文件夹的路径如下:

eg.

被测文件夹
project_path/a/b/c/func/

测试文件夹
test_path/a/b/c/func/
test_path/a/b/c/func/CMakeLists.txt
test_path/a/b/c/func/test_func.cpp

posted on 2023-07-10 12:16  amazzzzzing  阅读(40)  评论(0)    收藏  举报