1,关于 unity test 测试框架的介绍
unity test 是 ThrowTheSwitch.org 的一个主要工程。它是专注于为嵌入式工具链而生的C语言单元测试框架。它可以适用于大工程或者小工程都可以。它的核心文件是一个.c文件和两个头文件。
备注:
下载源码地址:
GitHub - ThrowTheSwitch/Unity: Simple Unit Testing for C
也可以从我上传的资源中下载源码:https://download.csdn.net/download/2301_81226734/89612039?spm=1001.2014.3001.5503
也可以直接下载经过移植的源码:
https://download.csdn.net/download/2301_81226734/89611242?spm=1001.2014.3001.5503
2,测试框架关于源码的介绍
可以把unity test的测试框架分为四类文件:
- Unity Test 框架核心文件
- 被测试函数
- 测试用例
- main
在unity test 的源码中,目录结构如下图所示:
auto 目录:
有一些可以简化测试工作流程的脚本。其实对于unity test 不是必须的。
docs 目录:
关于unity test 如何使用的文档,帮助测试人员迅速上手。
这个目录下的这个 《UnityGettingStartedGuide.md》这个文件,是关于测试框架的关于目录,如何使用测试框架的简单介绍。全英文记述。
examples 目录:
有四种使用 unity test 的例子,分别是四个目录。
extras 目录:
提供一些可以添加进 unity test 的非核心文件的组件服务。
src 目录:
一个.c 两个.h 文件,就是 unity test。
test 目录:
这是关于 unity test 如何被测试的。
3,使用unity test测试C代码
#include "unity.h"
#include "file_to_test.h"
void setUp(void) {
// set stuff up here
}
void tearDown(void) {
// clean stuff up here
}
void test_function_should_doBlahAndBlah(void) {
//test stuff
}
void test_function_should_doAlsoDoBlah(void) {
//more test stuff
}
// not needed when using generate_test_runner.rb
int main(void) {
UNITY_BEGIN();
RUN_TEST(test_function_should_doBlahAndBlah);
RUN_TEST(test_function_should_doAlsoDoBlah);
return UNITY_END();
}
如上代码,是使用 unity test 测试C代码的一个简单应用。
首先需要包含两个头文件。第一个头文件为 unity.h,第二个为被测代码的 头文件。
其次,定义 setUp(), tearDown() 函数的内容。第一个函数的内容,会在RUN_TEST()用例开始前运行;第二个函数的内容,会在RUN_TEST()用例结束后运行。可以根据需要定义。可以是空函数。这个是由 unity test 测试框架实现的。 setUp(), tearDown() 这两个函数的名字不可以更改,不需要在用例开始前后调用,自动执行。
然后,定义了两个测试函数 test_function_should_doBlahAndBlah(), test_function_should_doAlsoDoBlah()。通常以test_开头,便于区分是测试函数。函数体内部编写需要测试的内容。
最后,编写 main() 函数体的内容。在用例开始前,先调用 UNITY_BEGIN() 宏函数,为测试环境初始化变量。接着,使用 RUN_TEST 宏调用测试函数test_function_should_doBlahAndBlah()和test_function_should_doAlsoDoBlah()。最后调用 UNITY_END() 宏函数,对测试环境进行清理,并梳理测试用例结果。
备注:
上面代码中的宏名,则是由 unity test测试框架定义好的,在第一次使用此框架对代码进行测试时,先按照此模板进行测试。
4,常用断言举例
unity test 测试框架中,断言非常多,断言的作用就在于判断数值的正确性。如果不符合预期,则此用例失败,会打印失败信息。接着执行下一个用例。这里只举例几个:
TEST_ASSERT_TRUE(condition)
判断 condition 是否为 TRUE
TEST_ASSERT_EQUAL(expected, actual)
判断 expected 和 actual是否一致。一致成功,不一致打印失败信息,此用例结束,继续执行下个用例。
TEST_ASSERT_EQUAL_STRING(expected, actual)
判断两个字符串是否一致
TEST_ASSERT_NULL(pointer)
判断指针是否为空
TEST_ASSERT_EQUAL_MEMORY(expected, actual, len)
判断两块内存是否相等。可以为指针,也可以为数组。