張曉雯++楊健++祁薇
摘要:本文從分析單元測試中人工測試和自動測試的特點入手,分析了自動測試的優點,并選取了流行的開源軟件CppUnit作為測試工具,介紹了使用方法,以及如何建立測試項目,最終給出基于CppUnit的單元測試規范。
關鍵詞:單元測試;CppUnit;測試規范
中圖分類號:TP311.52 文獻標識碼:A 文章編號:1007-9416(2017)02-0079-02
1 單元測試
在軟件項目研發過程中,編碼和單元測試屬于同一階段,是同樣重要的組成部分。有效適度的單元測試可以用來理解和驗證代碼的功能特性,是保證軟件質量的關鍵步驟。由于對單元測試的覆蓋率要求很高,通常需要反復的進行,因此需要大量的測試用例,造成人力物力的負擔。 還有人認為單元測試就是編寫測試代碼對模塊中的類或函數進行測試,需要很強的編程能力,從而對單元測試產生畏難情緒。但實際上,正確熟練的使用單元測試工具,開發人員之外的測試人員也可以很好的完成單元測試工作。
1.1 單元測試的分類
按照進行測試的方式分類,基本分為靜態分析(static analysis)和動態分析(dynamic analysis)。靜態分析就是對源代碼進行走讀檢查,查找錯誤或收集一些相關數據,但不用對代碼進行編譯和執行。動態分析是觀察軟件執行時的過程,來提供跟蹤,及時間分析,還包含測試覆蓋度方面的信息[1]。
任何軟件都可以進行人工測試,但進行人工測試可能存在一些問題,如:回歸性、效率、覆蓋率、數據的重用性問題等。測試工具的出現是為了提高測試的效率和質量,好的工具是測試工作的有力幫手。
使用測試工具的自動化測試可以是動態執行,也可以是靜態檢查的方式。自動化的靜態檢查主要根據代碼的語法來識別錯誤,測試工具把這些錯誤特征歸納成為規則庫,掃描代碼時自動與規則庫進行匹配比較。自動化的動態單元測試通過執行實現了測試用例的代碼來進行測試,測試工具可以動態生成測試用例,然后轉換到測試代碼并執行。
1.2 選擇合適的單元測試工具
自動化測試工具的優點:(1)節省時間,免去了重復的操作;(2)測試數據的可重用性;(3)測試的可控性。
如果選擇利用測試工具來進行單元測試,就要了解如何選擇,如何保證所選工具是最合適的。選擇前要了解測試環境、待測系統類型、開發語言等。
現在市面上常見的C++類的測試軟件,主要有CppUnit、parasoft公司的C++test、Google公司的GoogleTest以及國產凱樂公司的VisualUnit。主要分為開源的和非開源兩類。開源測試工具具有以下優勢:相對成本比較低;選擇的空間比較大;源代碼開放,可以根據實際進行修改、補充和完善。本文選取開源軟件CppUnit進行單元測試工具。
2 單元測試工具CppUnit特點及安裝
CppUnit是Micheal Feathers由JUnit移植過來的一個在GNU LGPL條約下的并在sourcefogre網站上開源的C++單元測試框架。
2.1 CppUnit的特點
CppUnit是在JUnit成功后,在C語言環境下開發的白盒測試工具軟件。CppUnit以靜態庫的形式提供給用戶使用,用戶編寫程序的時候直接鏈接此靜態庫就可以了。它提供了一個簡單的單元測試框架,并且為常用的數據類型提供了豐富的斷言語句支持。 CppUnit項目被定義為一個testing framework,其功能很強大,能針對一個項目,靈活的提供測試方案,同時具備對測試用例的管理功能。
2.2 CppUnit的安裝
在官網下載解壓后,子目錄src下已經配置好VC的工程文件,其中example文件夾是CppUnit自帶的測試例子,是針對CppUnit自身的單元測試集,可以通過這些例子來學習如何在工程中添加測試用例。
CppUnit將要進行單元測試管理為樹狀結構。最小的單元為TestMethod,多個相關的TestMethod組成一個TestCase,多個TestCase又組成TestSuite。測試包之間是互相嵌套的,最終形成樹狀結構,用戶可根據需要選擇任意的樹節點來開始單元測試。
在使用CppUnit前,需要設置一下相關的開發環境。CppUnit提供了兩套實施的框架庫,一個為靜態的lib,一個為動態的dll。在目錄下,進入src文件夾,打開CppUnitLibraries.dsw。對這兩個project分別進行編譯后輸出,輸出的位置為lib文件夾。
最后還要給TestRunner.dll設置環境變量。另外一個要注意的project是TestRunner,它的輸出是一個dll,它提供了一個測試環境,這個環境是基于GUI 方式的,這個project也需要編譯,輸出位置同樣為lib文件夾。測試程序要想正確的調用,它必須位于你的測試程序的路徑下。
安裝及配置好環境后,就可以利用CppUnit建立測試項目了。
3 建立單元測試項目
在工作項目(Demo)中實現被測試的工作類,Sample
Sample.h--
class Sample
{ public:
Sample();
virtual ~Sample();
int Add(int i, int j) {
return i+j; } };
Sample.cpp—
#include "stdafx.h"
#include "Sample.h"
Sample::Sample()
{ }
Sample::~Sample()
{ }
為測試項目Project(本例為DemoTest)添加測試類,因為被測試的目標類為Sample,根據以上的命名規則,定義一個SampleTest的測試類。
在cpp中將Sample.cpp 包含進來,這樣在編譯SampleTest單元時,setUp 中new Sample() 才能找到Sample構造函數的實現(在Sample.cpp中)。
在測試項目Project中,新建一個源文件,這個源文件要寫測試項目的main函數,測試框架如下
#include "stdafx.h"
#include "SampleTst.h"
#include
#include
//以上為相關的頭文件
int main(int argc, char* argv[])
{
CppUnit::TextUi::TestRunner runner;
CppUnit::TestFactoryRegistry ?istry = CppUnit::TestFactoryRegistry::getRegistry();
runner.addTest(registry.makeTest());
runner.run();
return 0;
}
運行Project后,可以看到測試的結果。在測試運行過程中,如果某一assert失敗,測試函數執行將中斷,而后面的斷言也不會被執行。因此,在設計測試函數時應盡可能壓縮,使得測試功能相對單一。
4 基于CppUnit的單元測試標準
在相關測試項目完成后,測試人員應該刪除無關的臨時文件,保留要提交的項目,并整體保留TestDemo 的目錄結構并進行提交。并且要完成相關的單元測試總結報告[2]。
4.1 測試結束后需要提交的測試產品
(1)每個被測類的相關測試文檔。
包括測試類.h頭文件和測試類實現的.cpp 文件。
(2)每個測試單元的測試文檔產品。
包含測試類主函數.cpp 文件。
(3)單元測試總結報告.report。
報告需要手工填寫,內容單元測試情況的總結。應包括:
被測類名:項目中所有被測類的類名;
測試用例:列出被測類對應測試用例及其描述和注釋信息;
正確性測試報告:列出測試單元運行的測試結果。
4.2 單元測試工作產品驗收規范
單元測試通過的準則如下:
(1)正確性測試結果文件:測試用例應該覆蓋模塊中的所有功能點。
(2)其它測試特性結果文件:測試該模塊要求的其它特性并通過。
(3)每個單元的Bug 清單都已更改,不能改正的已給出詳細說明。
(4)單元測試工作的驗收應采用同級評審的方法,最終由評審組決定測試是否通過,從而保證單元測試的質量。
參考文獻
[1]陳能技.軟件測試技術大全[J].人民郵電出版社,2015.
[2]李龍等.軟件測試實用技術與常用模板[J].機械工業出版社,2013.