QTS單元測試框架

1.QTS單元測試框架介紹

目前QTS項目采用C/C++語言,而CppUnit就是xUnit家族中的一員,它是一個專門面向C++的單元測試框架。因此,QTS采用CppUnit測試框架是比較理想的選擇。

CppUnit按照層次來管理測試,最底層的就是TestCase,當有了幾個TestCase以后,可以將它們組織成TestFixture。在TestFixture中,可以建立被測試的類的實例,并編寫TestCase對類實例進行測試,多個TestFixture可以通過TestSuite來對測試進行管理。

通過派生TestFixture類來設計某個類或某組相關功能的單元測試,Fixture定義公共函數setUp()初始化每個成員變量,tearDown()來釋放setUp中使用的資源。在每個測試中,CPPUNIT_ASSERT(bool)來判斷某個函數和表達式的正確性,在派生類的聲明中,通過CPPUNIT_TEST來增加對應的測試函數,通過CPPUNIT_TEST_SUITE和CPPUNIT_TEST_SUITE_END來分裝所有的測試函數,規定這些測試函數執行的順序

?2.QTS單元測試框架搭建

2.1CppUnit 介紹

A、CppUnit源代碼組成

CppUnit測試框架的源代碼可以到 http://sourceforge.net/projects/cppunit/ 上下載。下載解壓后,你將看到如下文件夾:

主要的文件夾有:

· doc: CppUnit的說明文檔。另外,代碼的根目錄,還有三個說明文檔,分別是INSTALL,INSTALL-unix,INSTALL-WIN32.txt。
· examples: CpppUnit提供的例子,也是對CppUnit自身的測試,通過它可以學習如何使用CppUnit測試框架進行開發。
· include: CppUnit頭文件。

· src: CppUnit源代碼目錄。

B、初識CppUnit測試環境

解壓源代碼包后, CppUnit結構如下:

????1、進入example文件夾,用VC打開examples.dsw。我們先來看看CppUnit自帶的測試例子。這些例子都是針對CppUnit自身的單元測試集,一方面這是CppUnit作者開發CppUnit框架過程中寫的測試用例,另一方面,我們可以通過這些例子來學習如何在我們自己的工程中添加測試用例。

????2、將CppUnitTestApp工程設為Active Project(Win32 Debug),編譯后運行,則可以看到CppUnit的基于GUI方式進行單元測試TestRunner的界面。點擊“Run”,將會看到如圖二所示界面:

?

這是一個針對CppUnit的單元測試結果,它表明剛才我們做了11個測試,全部通過。
點擊“Browse”,我們還可以選擇想要進行的單元測試,如圖三:

2.2 CppUnit單元測試環境搭建

第一步:編譯CppUnit 靜態庫文件*.lib和動態庫文件*.dll:

  1. CppUnit的lib和dll

?CppUnit為我們提供了兩套框架庫,一個為靜態的lib,一個為動態的dll。

??cppunit project:靜態lib

? cppunit_dll project:動態dll和lib

在開發中我們可以根據實際情況作出選擇。進入src文件夾,打開CppUnitLibraries.dsw。分別編譯這兩個project,輸出位置均為lib文件夾。

在開發中我們可以根據實際情況作出選擇。進入src文件夾,打開CppUnitLibraries.dsw。在菜單上選擇Build->Batch Build..->Rebuild All,輸出位置均為lib文件夾。

為了方便開發,我們把這些編譯出來的lib和dll拷貝到我們自己建立的一個文件夾中(當然你也可以不這么做),例如F:\Mytest\lib\,同時我們也把CppUnit源代碼中include文件夾copy到我們自己的include文件夾下。???

第二步:建立基于對話框的工程

打開VC,在File菜單項下選擇New,建立基于dialog的工程。工程名Project name、存放位置Location可以自己決定,其他選項如下:

按OK確認后,進入如下界面。選擇Dialog based選項,按Finish按鈕后,一個空的基于對話框的工程就建立起來了。

第三步:屏蔽工程對話框

在工程CouterTest.cpp文件中(本指南中為該文件名,實際學習時根據自己的工程文件名而變),找到BOOL CCounterTestApp::InitInstance()方法,將如下附帶代碼注釋掉:也就是代碼中帶*的部分

BOOL CCounterTestApp::InitInstance()
{AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size//  of your final executable, you should remove from the following//  the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls();			// Call this when using MFC in a shared DLL
#elseEnable3dControlsStatic();	// Call this when linking to MFC statically
#endif/*CCounterTestDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: Place code here to handle when the dialog is//  dismissed with OK}else if (nResponse == IDCANCEL){// TODO: Place code here to handle when the dialog is//  dismissed with Cancel}*/// Since the dialog has been closed, return FALSE so that we exit the//  application, rather than start the application's message pump.return FALSE;
}

由于我們希望這個Project運行后顯示的是圖2這樣的CppUnit自帶的界面,所以我們需要在Instance()中屏蔽掉原有的對話框(藍色部分注釋掉),代之以CppUnit的GUI。

第四步:實現CppUnit測試執行器,并將測試套添加到測試執行器中。

A、在BOOL CCounterTestApp::InitInstance()中,添加如下附加注釋的代碼:

BOOL CCounterTestApp::InitInstance() 
{AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size//  of your final executable, you should remove from the following//  the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls();			// Call this when using MFC in a shared DLL
#elseEnable3dControlsStatic();	// Call this when linking to MFC statically
#endif//添加CppUnit的MFC類型的測試執行器CppUnit::MfcUi::TestRunner runner; //為被測試類(這里是CCounter)定義一個測試工廠(這里取名叫CounterTest):CppUnit::TestFactoryRegistry &registry
= CppUnit::TestFactoryRegistry::getRegistry("CounterTest");//并將工廠添加到測試執行器中
runner.addTest( registry.makeTest() );//運行執行器,顯示執行器GUI界面runner.run(); /*CCounterTestDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: Place code here to handle when the dialog is//  dismissed with OK}else if (nResponse == IDCANCEL){// TODO: Place code here to handle when the dialog is//  dismissed with Cancel}*/// Since the dialog has been closed, return FALSE so that we exit the//  application, rather than start the application's message pump.return FALSE;
}

B、由于在BOOL CCounterTestApp::InitInstance()中引用了CppUnit的類,所以在文件開始處要添加如下頭文件:

#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/mfc/TestRunner.h>

第五步:添加被測對象CCounter。

將被測對象所在文件(CounterMod.h和CounterMod.cpp) 添加到工程中:

第六步:在工程中為被測對象CCounter編寫測試類文件MyTest(可以自定義文件名):

按照下面示圖加入測試類的*.h文件和*.cpp文件:

MyTest.h中的代碼如下:

#include "cppunit/extensions/HelperMacros.h"class IsCodeLineTest : public CppUnit::TestFixture {// 聲明一個TestSuiteCPPUNIT_TEST_SUITE( IsCodeLineTest);// 添加測試用例到TestSuite, 定義新的測試用例需要在這兒聲明一下CPPUNIT_TEST( Test1 );// TestSuite聲明完成CPPUNIT_TEST_SUITE_END();public:// 定義測試用例void Test1 ();};

MyTest.cpp中的代碼如下(注意頭文件要做相應的修改):

#include "stdafx.h"#include "MyTest.h"
#include "CounterMod.h"// 把這個TestSuite注冊到名字為"CounterTest"的工廠中
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( IsCodeLineTest,"CounterTest" );#define RET_OK 0
#define RET_FAIL 1void IsCodeLineTest::Test1()
{//定義輸入參數int bIsComment;CString  szFileLine;//定義期望輸出int iOkReturn;int iOkIsComment;//定義測試實際輸出int iResult;CCounter m_counter;//用例輸入szFileLine = "int a";bIsComment = false;//期望輸出iOkReturn = RET_OK;iOkIsComment = false;//驅動被測函數iResult = m_counter.IsCodeLine(szFileLine,bIsComment);//結果比較CPPUNIT_ASSERT_EQUAL(iOkReturn,iResult);CPPUNIT_ASSERT_EQUAL(iOkIsComment,bIsComment);
}

第七步:加入CppUnit 庫文件:

把CppUnit相關的lib文件和dll文件(cppunitd.lib,cppunitd_dll.lib,testrunnerd.lib)加入到工程中:

第八步:設置頭文件和lib庫文件路徑、打開RTTI開關、給dLL庫設置環境變量:

  1. 在VC的tools/options/directories/include files和library files中設置CppUnit include文件路徑和lib文件路徑:

在你的VC project中打開RTTI開關。具體位置Project Settings/C++/C++ Language:

C、為TestRunnerd.dll設置環境變量
   TestRunnerd.dll為我們提供了基于GUI的測試環境。為了讓我們的測試程序能正確的調用它,需要把TestRunnerd.dll拷貝到你的工程路徑下。或者最簡單的方法是在操作系統的環境變量Path中添TestRunnerd.dll的路徑,這樣是最省事的。

第九步:編譯執行。編譯連接成功后,運行測試,出現下面的界面,表示測試用例Test1運行成功.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71501.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

dify + ollama + deepseek-r1+ stable-diffusion 構建繪畫智能體

故事背景 stable-diffusion 集成進 dify 后&#xff0c;我們搭建一個小智能體&#xff0c;驗證下文生圖功能 業務流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…

分享幾個論文校對相關的deepseek提示詞

論文校對 1.檢查這段文字是否有語法或風格錯誤&#xff1a;[在此處粘貼您的文本]。 2.審查我的[文件類型&#xff0c;例如&#xff0c;“論文”]中的這一段落是否有語法或風格錯誤&#xff1a;[在此處粘貼您的文本]。 3.請審查我關于[具體主題&#xff0c;例如&#xff0c;…

【極光 Orbit?STC8A-8H】02. STC8 單片機工程模板創建

【極光 Orbit?STC8A-8H】02. STC8 單片機工程模板創建 七律 單片機 小小芯片大乾坤&#xff0c;集成世界在其中。 初學雖感千重難&#xff0c;實踐方知奧妙通。 今天的講法和過去不同&#xff0c;直接來一個多文件模塊化的工程模板創建&#xff0c;萬事開頭難&#xff0c;…

mac安裝nvm=>node=>nrm

下載并安裝 NVM 運行以下命令下載并安裝 NVM&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash 配置環境變量 vim ~/.zshrc 按 i 將如下代碼復制進去&#xff0c;controlc &#xff0c;再按 :wq完成編輯 export NVM_DIR…

K8S學習之基礎十一:k8s中容器鉤子

容器鉤子 容器鉤子分為post-start和pre-stop post-start&#xff1a;容器啟動后執行的命令 pre-stop&#xff1a;容器關閉前執行的命令&#xff0c;可用于優雅關閉 # 分別定義兩個鉤子&#xff0c;啟動pod后更新index.html&#xff0c;關閉pod前正常關閉服務 vi post-pre.…

K8s 1.27.1 實戰系列(三)安裝網絡插件

Kubernetes 的網絡插件常見的有 Flannel 和 Calico ,這是兩種主流的 CNI(容器網絡接口)解決方案,它們在設計理念、實現方式、性能特征及適用場景上有顯著差異。以下是兩者的綜合對比分析: 一、Flannel 和 Calico 1. 技術基礎與網絡實現 Flannel 核心機制:基于 Overlay …

【五.LangChain技術與應用】【24.LangChain RAG文本向量化與存儲:智能檢索的核心技術】

凌晨三點,北京中關村的某棟辦公樓依然燈火通明。28歲的算法工程師小李盯著屏幕上的代碼,突然拍案而起:"終于成了!"他開發的智能客服系統在連續失敗78次后,首次準確識別出用戶"我想換個能打游戲的便宜手機"的真實需求——需要兼顧游戲性能和價格的機型…

深度學習五大模型:CNN、Transformer、BERT、RNN、GAN詳細解析

卷積神經網絡&#xff08;Convolutional Neural Network, CNN&#xff09; 原理 &#xff1a;CNN主要由卷積層、池化層和全連接層組成。卷積層通過卷積核在輸入數據上進行卷積運算&#xff0c;提取局部特征&#xff1b;池化層則對特征圖進行下采樣&#xff0c;降低特征維度&…

特征分解(Eigen decomposition)在深度學習中的應用與理解

特征分解在深度學習中的應用與理解 特征分解&#xff08;Eigendecomposition&#xff09;是線性代數中的一個核心工具&#xff0c;在深度學習領域有著廣泛的應用&#xff0c;尤其是在涉及矩陣操作和概率模型時。對于研究者來說&#xff0c;理解特征分解不僅有助于掌握數學基礎…

分布式ID生成方案:數據庫號段、Redis與第三方開源實現

分布式ID生成方案&#xff1a;數據庫號段、Redis與第三方開源實現 引言 在分布式系統中&#xff0c;全局唯一ID生成是核心基礎能力之一。本文針對三種主流分布式ID生成方案&#xff08;數據庫號段模式、Redis方案、第三方開源框架&#xff09;進行解析&#xff0c;從實現原理…

rabbitmq-amqp事務消息+消費失敗重試機制+prefetch限流

1. 安裝和配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency><dependency> <groupId>com.fasterxml.jackson.core</groupId> <arti…

【Python】05、Python運算符

文章目錄 1.算術運算符2.賦值運算符3.關系運算符4.邏輯運算符4.1 布爾值邏輯運算4.2 非布爾值的邏輯運算符 5.條件運算符6.運算符優先級 運算符也稱為操作符&#xff0c;可以對一個或多個值進行運算或各種操作。比如、-、都屬于運算符 1.算術運算符 加法 如果是兩個字符串之間…

2025-03-06 學習記錄--C/C++-PTA 習題6-6 使用函數輸出一個整數的逆序數

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 二、代碼&#xff08;C語言&#xff09;?? #include <stdio.h>int reverse( int number );int main…

簡記_硬件系統設計之需求分析要點

目錄 一、 功能需求 二、 整體性能需求 三、 用戶接口需求 四、 功耗需求 五、 成本需求 六、 IP和NEMA防護等級需求 七、 認證需求 功能需求 供電方式及防護 供電方式&#xff1a;市電供電、外置直流穩壓電源供電、電池供電、PoE&#xff08;Power Over Ether…

[原創](Modern C++)現代C++的關鍵性概念: 利用“概念(Concepts)“,可以優雅地約束模板參數

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 開發工具: Visual Studio、Delphi、XCode、Eclipse…

Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks

Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks ?#paper/GFM/GNN-BASED#? #paper/???#? 注意&#xff1a;這篇文章是每個圖一個GCN模型&#xff0c;而不是所有圖一個GCN 模型 算是最早的涉及異配圖的prompt了 貢獻和動機&#xff1a; 非對…

寶塔 Linux 計劃任務中添加運行項目網站PHP任務-定時任務

一、指定php版運行&#xff0c; cd /www/wwwroot/www.xxx.com/ && /www/server/php/56/bin/php think timedtasks start >> /tmp/timedtasks.log 2>&1 二、不指定php版 cd /www/wwwroot/www.xxx.com/ && php think timedtasks start >> …

【電控筆記z29】擾動估測器DOB估測慣量J-摩擦系數B

基本原理 擾動估測器的核心思想是通過向電機系統施加特定的擾動信號&#xff0c;觀察系統響應的變化&#xff0c;然后利用系統的動態模型和控制理論來估計未知參數&#xff0c;如慣量和摩擦系數 。一般基于電機的運動方程建立數學模型&#xff0c;結合觀測到的電機實際運行數據…

要查看 SQLite 數據庫中的所有表,可以通過查詢 SQLite 的系統表 sqlite_master

要查看 SQLite 數據庫中的所有表&#xff0c;可以查詢 SQLite 的系統表 sqlite_master。 每個 SQLite 數據庫都包含一個名為 sqlite_master 的系統表。該表定義了數據庫的模式&#xff0c;存儲了數據庫中所有表、索引、視圖和觸發器等對象的信息。 通過查詢 sqlite_master&am…

如何在Spring Boot中讀取JAR包內resources目錄下文件

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 以下是如何在Spring Boot中讀取JAR包內resources目錄下文件的教程&#xff0c;分為多種方法及詳細說明&#xff1a; 方法1&#xff1a;使用 ClassPathResour…