对一个已有项目搭建单元测试集的一个方法
0 说明
1 准备
1.1 软件环境
googletest
cmake
1.2 需要的知识
单元测试相关概念
1.3 一般原则
- 每次只测试一个对象,被测对象应该尽可能的独立,应该是一个很小的单元,依赖项通过mock或stub模拟;
- 每个测试项均应执行迅速且独立于测试环境;
- 各个测试之间,可以共享一些通用的模拟模块;如果存在模拟模块的特化,则也可以将模拟模块接口化;除此之外,各个测试应该完全独立;
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
标签:依赖,测试,单元测试,文件夹,func,test,path,已有,搭建
From: https://www.cnblogs.com/amazzzzzing/p/17540750.html