OpenVela之开发自测试框架cmocka
一、引言
在软件开发过程中,尽早发现并解决代码中的缺陷对于提高软件质量至关重要。OpenVela 为开发者提供了一个全面的自测试框架 CMocka
,借助这个框架,开发者能够开发相关的测试用例,在开发阶段早期检测出缺陷,从而提升代码质量。本文将详细介绍如何使用该框架开发测试用例。
二、代码目录结构
OpenVela 的测试代码目录结构如下:
├─tests
│ └──scripts
│ ├── env # 自动化框架的环境要求
│ ├── script # 自动化框架执行的测试脚本
│ └── utils
│ ├── testcases # 测试工具集合
│ └── testsuites # CMocka 测试工具集合
三、开发测试用例
3.1 创建测试用例目录
若要使用 CMocka 编写新的测试用例,需将所有测试用例置于 tests
目录下。具体步骤如下:
- 创建子目录:为测试用例创建一个子目录以及必要的子目录,用于存放测试用例文件、头文件、测试资源和测试入口文件。目录结构示例如下:
├─tests
│ └── mytest # 自动化测试用例集名称,可根据实际情况命名
│ ├── Kconfig
│ ├── Make.defs
│ ├── Makefile
│ ├── include # 测试用例需要用到的头文件,包含自定义函数的声明
│ ├── src # 测试用例文件存放目录
│ ├── util # 公共函数文件存放目录
- 修改 Kconfig 文件:在 Kconfig 文件中定义测试开关、优先级和 STACKSIZE。示例如下:
config MY_TESTS tristate "vela auto tests mytest"default ndepends on TESTING_CMOCKA # 必须包含,可以依赖所测试的模块---help---Enable auto tests for the open-velaif MY_TESTSconfig MY_TESTS_PRIORITY # 优先级int "Task priority"default 100config MY_TESTS_STACKSIZE # 栈大小int "Stack size"default DEFAULT_TASK_STACKSIZEendif
- 修改 Makefile 文件:定义测试的 PROGNAME 和 MAINSRC 文件。需注意,PROGNAME 必须以 cmocka_ 开头。示例如下:
include $(APPDIR)/Make.defs
# 公共函数和头文件
CFLAGS += -I$(APPDIR)/tests/mytest/util
CSRCS += $(wildcard $(APPDIR)/tests/mytest/util/*.c)# 测试用例文件和测试用例头文件
CFLAGS += -I$(APPDIR)/tests/mytest/include
CSRCS += $(wildcard $(APPDIR)/tests/mytest/src/*.c)# 所需 API 的头文件(可根据情况添加)
CFLAGS += ${INCDIR_PREFIX}$(APPDIR)/includePRIORITY = $(CONFIG_MY_TESTS_PRIORITY)
STACKSIZE = $(CONFIG_MY_TESTS_STACKSIZE)
MODULE = $(CONFIG_MY_TESTS)PROGNAME += cmocka_mytest_test # 测试应用程序名称,用于在 nsh 中启动
MAINSRC += $(CURDIR)/mytest_entry.c # 所有编写的测试用例的统一测试入口文件,CMocka 单元测试入口文件
include $(APPDIR)/Application.mk
- 修改 Make.defs 文件:
ifneq ($(CONFIG_MY_TESTS),)
CONFIGURED_APPS += $(APPDIR)/tests/mytest
endif
3.2 编写测试用例
在 src 目录下创建新的测试用例文件,建议每个文件只包含一个测试用例。
3.2.1 目录结构
├─tests
│ └── mytest # 场景自动化测试用例集
│ ├── Kconfig
│ ├── Make.defs
│ ├── Makefile
│ ├── include # 测试用例需要用到的头文件,包含自定义函数的声明
│ │ ├── mytest.h
│ ├── src # 测试用例文件存放目录
│ │ ├── test_mytest_example_01.c
│ │ ├── test_mytest_example_02.c
│ │ ├── test_mytest_example_03.c
│ ├── util
3.2.2 测试用例文件编写规则
- 文件命名:以关键字
test_
开头,包含 feature name,例如test_mytest_example_01.c
。 - 测试函数命名:以关键字
test_
开头,例如test_mytest_example_01(FAR void **state)
。
完整示例如下:
/***************************************************************************** Included Files****************************************************************************/
// 使用 CMocka 框架时必须包含的 5 个头文件
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <setjmp.h>
#include <cmocka.h>// 其他系统头文件
#include <xxx.h>
// 测试函数定义头文件
#include "mytest.h"
#include "mytest_util.h"/***************************************************************************** Name: test_mytest_example_01* Description: This is a simple example.****************************************************************************/void test_mytest_example_01(FAR void **state)
{int ret = 15;assert_true(ret > 0);
}
3.2.3 编写头文件
在 include 目录下编写头文件,命名建议包含 feature 和 test 关键字,例如 mytest.h
。在头文件中定义测试函数和测试用例集的宏,将所有需要测试的用例添加到宏中。
3.3 编写测试入口文件
为了更好地将测试用例和各模块的测试入口文件解耦,确保对单个模块的修改不会导致整个测试套件不可用,将测试入口文件隔离并放置在该模块测试用例的根目录下。完整的目录结构如下:
├─tests
│ └── mytest
│ ├── Kconfig
│ ├── Make.defs
│ ├── Makefile
│ ├── include # 测试用例需要用到的头文件,包含自定义函数的声明
│ │ ├── mytest.h
│ ├── src # 测试用例文件存放目录
│ │ ├── test_mytest_example_01.c
│ │ ├── test_mytest_example_02.c
│ │ ├── test_mytest_example_03.c
│ ├── util
│ ├── mytest_test.c # 运行时所有编写的测试用例的入口文件
测试用例入口文件包含 CMocka 测试所需的头文件和主函数。
四、执行测试用例
1. 编译测试用例
- 使用 menuconfig 打开
TESTING_CMOCKA
开关。
注意:TESTING_CMOCKA
依赖 LIBC_REGEX
,而 LIBC_REGEX
依赖ALLOW_MIT_COMPONENTS
,如果这两个config没有打开,需要先将其打开 。
./build.sh vendor/openvela/boards/vela/configs/goldfish-armeabi-v7a-ap menuconfig
2. 使用 menuconfig 打开模块定义的测试用例开关(CONFIG_MYTEST_TEST)。
3. 进行编译,执行如下命令
./build.sh vendor/openvela/boards/vela/configs/goldfish-armeabi-v7a-ap -e -Werror -j20
2. 执行测试用例
编译完成后进入到 nsh,执行如下命令:
./emulator.sh vela
- 输入对应 PROGNAME 进行测试,这种方式会按顺序将 group 中的测试用例全部跑一遍,如果需要某个测试用里的执行结果则必须等待一段时间。
- openvela 中实现了 cmocka 的命令行工具,用于灵活的执行测试用例,下面展示了使用其打印用例、执行指定用例的方式。
- 打印所有用例,执行如下命令:
cmocka -l
- 执行 TestNuttxMm01 用例,-t 参数会匹配相应的用例名称。
cmocka -t TestNuttxMm01
3. 查看测试结果
用例的执行结果有三种:
- PASSED
- FAILED
- SKIPPED
说明:如果测试用例FAILED
,会显示相应的错误信息,包括代码文件、文件行号以及异常原因,方便去定位问题。所有用例执行完毕后,会对三种结果的用例进行统计。
五、总结
通过以上步骤,我们可以使用 OpenVela 提供的 CMocka 框架开发测试用例,在开发阶段早期发现并解决代码中的缺陷,从而提高代码质量。在实际开发过程中,我们可以根据具体需求对测试用例进行扩展和优化,以确保软件的稳定性和可靠性。