Keil μVision 5.30 CppUTest测试框架模拟器Simulator测试(1)-测试库工程创建
项目背景
当前公司所做的主要是使用32位单片机以及8位单片机开发灯控类产品。近期因为项目比较多,遇到了许多因为代码BUG导致的售后问题。有些可以通过OTA升级,而有些会导致频繁重启的问题则无法通过OTA升级解决。
反思问题出现的原因,代码的编写是一方面的原因,但是程序员写代码一定是有BUG的,缺失的只是对代码全面系统的测试过程,导致一些数组溢出之类的纯软件问题出现。
事实上软件测试在软件工程中已经是很成熟的,但是在据我个人所了解的以及在网上查找到的信息了解到的,在单片机编程领域使用系统化测试框架以及方法的资料是相当少。能找到的一本是《测试驱动的嵌入式软件开发》。这里面介绍的就是使用的是Unity和CppUTest两种测试框架。
在此前的项目中实践过双目标的测试方法,具体如下:
- 业务代码在Keil5中编译及运行
- 测试代码和工程在VisualStudio中编译及运行
这样是因为CppUTest提供了在VS中可以直接运行的工程,只需要把测试的代码添加进去就可以直接运行。但是在实践中发现有关于数据类型的测试曾有在VS中跟在Keil中实际执行起来不同的问题。这样的问题比较常见,毕竟是用两个不同的编译器。
所以当前的项目就是想要在完全使用Keil完成业务代码的开发以及测试的运行。而因为每次编译下载到Flash中需要浪费很多的时间,因此采用在keil中使用Simulator仿真运行测试的方式。
最终的效果如下,直接在Keil的Debug Viewer中输出测试的结果。
项目目标
这边文章主要实现以下目标:
- 创建两个工程,项目A用来编译并生成CppUTest的库,一个是实际项目B。在B项目中不直接使用CppUTest源代码而使用编译好的库的好处是节省编译的时间,且B项目中可以使用与A项目中不同版本的编译器(未经验证,我这里用的是同一个版本的编译器)。
- 实际项目B使用Keil提供的Simulator运行,不需要依赖于实际的硬件,故省去了Flash下载及受到硬件影响的麻烦。且可以在硬件准备好之前就可以开始开发硬件无关的软件代码。
实际步骤
下载CppUTest源码
CPPUTest官网->Download Release 3.8 as .zip
当然版本可能会更新,具体以官网为准。
Keil中创建CppUTest测试工程
- 创建新工程,起名CppUTestLib
- 选择器件,这里跟你B项目的硬件平台一致,此处因为我用的是M4F核心的MCU,则选择则如图所示
- 管理运行时,这里都不需要勾选
- 新建的项目如图所示
- 添加CppUTest源代码
- 在项目管理的Target上点击右键,选择[Manage Project Items]来添加文件。
- 点击下图位置创建两个Groups
- 定位到CppUTest解压之后的目录,进入src文件夹,将CppUTest/CppUTestExt下的所有源代码添加到项目中,注意添加项目的时候筛选器默认筛选的是.c文件,而CppUTest是C++文件,要更改筛选器为[C++ Source file*.cpp].
- 添加CppUTest引用路径
在
Options for Target->C/C++(AC6)->IncludePaths->Folder Setup
添加
cpputest-3.8->include
- 更改项目配置
Output->Name of Excutable->cppUTest
选择:Create Library:
- 编译生成.lib库文件
- 自动拷贝编译后的库文件到所需的目录中
进行这一步是因为:通常.gitignore中会设定忽略/Objects文件夹,这样直接在项目中添加Objects路径下的库文件的话会导致在上传代码时丢失库文件.然后又不想手动拷贝库文件,就用MDK的编译后运行脚本来实现自动拷贝最新的库. - 创建批处理文件
在MDK工程的相同目录,建立一个.bat文件
右键编辑其内容
set filename=CppUTestCM0.lib
set path=%cd%
copy %path%\Objects\TestLib\%filename% ..\Test\Lib\%filename%
@echo filename:%filename%
这里的库文件名,源路径,目标路径根据你实际项目来更改
- 在Options->User中,设置编译后执行批处理文件
- 按下编译按钮,从输出可以看到已经成功拷贝了库文件到目标目录下
- 至此CppUTest库文件创建完成.