CppUTest框架的配置及使用
CppUTest框架的使用方法待验证后补入本文。
以virtual studio 2019 中的项目结构为例,如下图所示。
配置
makeFile的配置
使用
被测项目源代码
置于productionCodeLib
中(其外部依赖项为开发项目中使依赖的其他项目代码)。
单元测试代码
置于AllTests
中(其外部依赖项为开发项目中的各头文件——所有方法的声明)。
补入此博客。
CppUTest框架中定义测试组TEST_GROUP及属于TEST_GROUP测试组的测试用例
CppUTest框架中定义测试组及测试用例的宏
- TEST_GROUP(group) - 声明一个名为
group
测试用例Test组. 这也会创建一个被别的库所需要的链接. - TEST_GROUP_BASE(group, base) - 和TEST_GROUP一样, 只是使用了和UTest不一样的基类
- TEST(group, name) - 定义一个属于
group
测试组、名为name
的测试用例Test - IMPORT_TEST_GROUP(group) - 从库中导入一个指定的组. 需在main函数中调用.
- IGNORE_TEST(group, name) - 关闭执行一个属于
group
测试组、名为name
的测试用例Test
TEST_SETUP() - 在TEST_GROUP中声明了一个空的setup方法 - 声明一个 void setup()也是同样的效果。
TEST_TEARDOWN() - 在TEST_GROUP中声明了一个空的teardown方法。
详见后面的小章节“使用示例”
测试组中的前置、后置方法
每个TEST_GROUP都可以包含一个 setup和teardown方法。setup() 和teardown() 使用于测试组中的每一个测试用例。
void setup() //设置本测试组的前置准备工作
{
}
void teardown() //设置本测试组的后置收尾工作
{
}
断言宏Assertion
- CHECK(boolean condition) - 检查布尔结果——condition==True则成功,反之失败。
- CHECK_TEXT(boolean condition, text) - condition==True则成功; 反之失败,并且失败时输出text信息
- CHECK_TRUE(boolean condition) - 检查是否正确
- CHECK_FALSE(boolean condition) - 检查是否错误
- CHECK_EQUAL(expected, actual) - 检查等号左后是否相等. 如果一个类重载了==操作符,那么就可以比较同属这个类的两个实例.
- CHECK_THROWS(expected_exception, expression) - 抛出的异常 expected_exception==exception则成功; 反之失败
- STRCMP_EQUAL(expected, actual) - 用strcmp比较两个字符串是否相等——字符串 expected==actual则成功; 反之失败
- LONGS_EQUAL(expected, actual) - 比较两个数,数字 expected==actual则成功; 反之失败
- BYTES_EQUAL(expected, actual) - 比较两个【8比特数】——数字 expected==actual则成功; 反之失败 (数字是 8bit 宽)
- POINTERS_EQUAL(expected, actual) - 比较两个 const void *指针——指针 expected==actual则成功; 反之失败
- DOUBLES_EQUAL(expected, actual, tolerance) - 在一定公差范围内比较两个浮点数——double型 expected和actual在误差范围内(tolerance)相等则成功; 反之失败
- FAIL(text) - 表示测试用例失败,并返回text信息
使用示例
验证并补入此博客的2.2~2.5的内容。
示例一
#include "CppUTest/TestHarness.h"
extern "C"
{
#include "Example.h"
}
TEST_GROUP(Example) //测试组命名为Example
{
void setup() //设置本测试组中所有测试用例的前置准备工作
{
}
void teardown() //设置本测试组中所有测试用例的后置收尾工作
{
}
TEST_SETUP() {
//等同于setup(),待确认
};
TEST_TEARDOWN() {
//等同于teardown(),待确认
};
};
TEST(Example, test1) //向本测试组Example中添加 名为“test1”的测试用例
{
LONGS_EQUAL(1, example());//框架中的宏???
}
示例二
Example Main
#include "UnitTestHarness/CommandLineTestRunner.h"
int main(int ac, char** av)
{
return CommandLineTestRunner::RunAllTests(ac, av);
}
IMPORT_TEST_GROUP(ClassName);//导入定义好的测试组
Example Test
#include "UnitTestHarness/TestHarness.h"
#include "ClassName.h"
TEST_GROUP(TEST_GROUP_Name)
{
ClassName* className;
void setup()
{
className = new ClassName();
}
void teardown()
{
delete className;
}
}
TEST(TEST_GROUP_Name, Test_Case_Name)//第一个参数是定义该测试用例属于的测试组;第二个参数是定义该测试用例的名称
{
CHECK(0 != TEST_GROUP_Name);
CHECK(true);
CHECK_EQUAL(1,1);
LONGS_EQUAL(1,1);
DOUBLES_EQUAL(1.000, 1.001, .01);
STRCMP_EQUAL("hello", "hello");
FAIL("The prior tests pass, but this one doesn't");
}
直接运行而非调试CppUTest框架,在构建完成后,运行测试、运行程序。该构建过程还会生成一个静态库(cpbutest/lib),其中包含可以将测试链接到的cpputest。
The build also produced a static library (cpputest/lib) holding CppUTest you can link your tests to.