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_ */