CxxTest简介
CxxTest软件框架提供了一套代码框架和代码生成工具。
测试人员需要使用C++头文件定义测试用例。在测试用例中,通过定义测试方法,来打包需要的测试项目。测试方法中可以调用开发人员编写的函数,类,变量,声明等,来实现对这些函数,类,变量,声明进行测试和验证。
测试函数中需要使用CxxTest提供的断言宏,来测试比较结果。这些结果如果非预期,会被作为失败或者异常,被CxxTest记录下来。从而实现单元测试自动化。
cxxtestgen工具
运行测试程序
集成到makefile框架
一般大型项目,往往都用户多个可执行程序,多个库文件,以提供丰富稳定可维护的应用功能。C++代码一般使用Makefile来管理。通过定义通用的Makefile宏和变量,将
以下就是基于现有项目makefile框架增加和设计的cxxtest引入方式。
增加测试用例目录及文件列表
在每个模块目录下增加test目录,用于存放测试用例文件。
建议测试用例头文件使用扩展名.hxx。自动生成的文件扩展名为.cxx。开发人员使用的头文件.hpp,源文件.cpp。
这样规范的好处是使用git等版本管理时,可以区分出文件类型。同时设置ignore文件。
在Makefile文件中定义TESTS变量,包含测试用例文件名,定义TEST_SRCS变量,包含依赖的源文件名(不含扩展名)。
事实上我一般是定义SRCS包含源文件名。这样只需要
TEST_SRCS = $SRCS就可以避免重复定义列表了。
为什么不直接用SRCS呢,因为TEST_SRCS中不能含main函数的实现。
采用part模式
最后生产可执行
自动执行
可执行程序以test_开头,后面跟模块名,可以是库名,可以是可执行程序名。
可执行程序使用-v开关,可以显示测试用例中的跟踪调试日志信息。
测试用例编写的考量
#ifndef TEST_LIGHT_TRIGGER_HXX_
#define TEST_LIGHT_TRIGGER_HXX_
#include "light_trigger.hpp"
#include <dm/datetime.hpp>
#include <cxxtest/TestSuite.h>
class TestLightTrigger:public CxxTest::TestSuite{
public:
void testNextTime(){
dm::CDateTime dt;
dt.setYear(2020);
dt.setMonth(2);
dt.setDay(3);
dt.setHour(12);
dt.setMinute(24);
dt.setSec(36);
dm::CTimeStamp now = dt.toTimeStamp();
dm::CTimeStamp next;
znjt::CLightTrigger tg;
TS_TRACE("\u9ed8\u8ba4\u503c");
TSM_ASSERT_EQUALS("\u7c7b\u578b",tg.getType(),tg.TNone);
TSM_ASSERT_EQUALS("\u65f6\u95f4",tg.getSecs(),0);
TSM_ASSERT("\u662f\u5426\u56fa\u5b9a\u65f6\u523b",!tg.isFixed());
TSM_ASSERT_EQUALS("\u4e0b\u6b21\u65f6\u523b",tg.nextTime(now),now);
TS_TRACE("\u79d2\u6a21\u5f0f");
tg.setType(tg.TSecs);
tg.setSecs(1);
next = now;
next.addSec(1);
TSM_ASSERT("\u662f\u5426\u56fa\u5b9a\u65f6\u523b",!tg.isFixed());
TSM_ASSERT_EQUALS("\u4e0b\u6b21\u65f6\u523b",tg.nextTime(now),next);
TS_TRACE("\u5206\u949f\u6a21\u5f0f");
tg.setType(tg.TByMin);
tg.setSecs(10);
TSM_ASSERT("\u662f\u5426\u56fa\u5b9a\u65f6\u523b",tg.isFixed());
TSM_ASSERT_EQUALS("\u4e0b\u6b21\u65f6\u523b",tg.nextTime(now),next);
}
};
#endif /* TEST_LIGHT_TRIGGER_HXX_ */