国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

單元測試作業指導系列講座之一

2019-11-17 04:51:07
字體:
來源:轉載
供稿:網友

  這是我以前任項目經理時,編寫的關于單元測試方面的作業指導書,針對多種開發環境敘述怎么進行單元測試以及環境配置,現在整理了一下。應該對大家有所幫助。

  這是第一部分,主要針對C和C++項目的(包括了Windows環境和linux環境),下部分將針對java及J2EE項目。

  1. 目的

  為了減少代碼中的錯誤數量, 減少調試所花的時間和精力, 改善軟件質量, 減少開發和維護的時間和成本。

  2. 適用范圍

  適用于C及C++的所有產品。

  3. 適用內容

  3.1 C++標準

  3.1.1測試環境使用Visual C++,Windows窗口應用程序

  3.1.1.1前題:使用CppUnit1.6.2版,解壓后,路徑為x://cppunit-1.6.2;

  在工程文件中配置測試框架使用環境:加入執行頭文件的路徑x://cppunit-1.6.2/include,加入導入庫文件的路徑x://cppunit-1.6.2/lib;

  配置DEBUG(測試)版環境:

  加入需要鏈接的靜態測試框模塊testrunnercd.lib(運行測試用例的選擇對話框)和cppunitcd.lib(測試框架);

  加入測試Add-ins,庫名為x://cppunit-1.6.2/lib/TestRunnerDSPlugInD.dll;

  在PRoject Settings/C++/C++ Language中啟用RTTI;

  3.1.1.2建立測試用例:

  1、以類名加前輟“Test”命名測試單元文件名,比如“CMabString”類的類文件名為MabString.cpp,則測試單元文件命名為TestMabString.cpp;

  2、加入測試框架頭文件以及要測試的單元頭文件,以TestMabString為例:

  頭文件:testmabstring.h

#ifndef CPP_UNIT_TestNode_H
#define CPP_UNIT_TestNode_H
//包含測試框架的頭文件
#include <cppunit/TestCase.h>
#include <cppunit/extensions/HelperMacros.h>
//包含被測試單元的頭文件
#include "mabstring.h"
//派生測試框架的測試用例類
class TestMabString : public CppUnit::TestCase
{
 //定義測試用例列表,此列表將出現在運行測試用例的選擇對話框中
 CPPUNIT_TEST_SUITE( TestMabString );
 CPPUNIT_TEST( FindByName );
 CPPUNIT_TEST_SUITE_END();

 protected:
 //
 CMabString m_MabStr;
 public:
  //用例初始化,可作為樁函數
  void setUp ();
  //用例析構
  void tearDown();
 protected:
  //測試用例
  void FindByName (void);
};

#endif

類文件:testmabstring.cpp

#include "TestMabString.h"
#include "iostream.h"
#include "strstrea.h"

//注冊本測試單元

CPPUNIT_TEST_SUITE_REGISTRATION( TestMabString );

//定義測試用例

void TestMabString::FindByName ()
{
 //功能性測試,屬黑盒測試
 //normal test
 //條件及錯誤測試,屬白盒測試
 //extra test,
 //例外測試,屬白盒測試
 //exception test,

 bool bRet=false;
 try{
  //put the exception code here...
 }
 //catch(CXXX& e)
 catch(...)
 {
  bRet=true;
 }
 CPPUNIT_ASSERT(bRet);
 //由于并不能夠執行所有單元測試應該執行的路徑,比如CMabString是從CString
 //類中派生出來的,而可能CMabString中的Find只簡單調用了CString中的Find方法,//所以并不需要測試;
 //在此處說明所有不用測試的路徑;
 //other test, see the ...
}

void TestMabString::setUp ()
{
 //開始測試前的初始代碼
 m_pNode=new Node();
}

void TestMabString::tearDown()
{
 //測試結束代碼
 if(m_pNode)
  delete m_pNode;
}

  3、在啟動程序中加入以下代碼,以便運行“測試用例選擇”對話框:


#ifdef _DEBUG

//包括測試頭文件

#include <msvc6/testrunner/TestRunner.h>

#include <cppunit/extensions/TestFactoryRegistry.h>

static AFX_EXTENSION_MODULE extTestRunner;

#endif



//以下為測試代碼,此部分測試不會出現在發布版中

#ifdef _DEBUG

TestRunner runner;

runner.addTest ( CppUnit::TestFactoryRegistry::getRegistry().makeTest() );

runner.run ();

#endif
  4、制作發行版

  發行版需要做以下工作:

  將Project的屬性設置為Release(這將自動去除_DEBUG的聲明);

  從工程項目中去掉測試文件(即帶有test前輟的文件);

  3.1.2測試環境使用Visual C++,Windows非窗口應用程序

  3.1.2.1前題:使用CppUnit1.6.2版,解壓后,路徑為x://cppunit-1.6.2;

  在工程文件中配置測試框架使用環境:加入執行頭文件的路徑x://cppunit-1.6.2/include,加入導入庫文件的路徑x://cppunit-1.6.2/lib;

  配置DEBUG(測試)版環境:

  加入需要鏈接的靜態測試框模塊cppunitcd.lib(測試框架);

  在Project Settings/C++/C++ Language中啟用RTTI;

  3.1.2.2建立測試用例:

  1、以類名加前輟“Test”命名測試單元文件名,比如“CMabString”類的類文件名為MabString.cpp,則測試單元文件命名為TestMabString.cpp;

  2、加入測試框架頭文件以及要測試的單元頭文件,以TestMabString為例:

  頭文件:testmabstring.h

  3、測試示例同上;

  3.2 C標準

  3.2.1測試環境使用gcc,Linux非窗口應用程序

  前題:使用check0.8.0版,解壓后,路徑為/xx/check-0.8.0;

  配置測試框架使用環境(我建議采用標準組織推薦的使用Autoconf和Automake來生成配置文件configure和Makefile,因為使用它們可以建立符合國際標準的configure腳本 和Makefile文件,并且可以有效的建立壓縮包和方便分發必需的文件(也方便在發行版中去除測試用例文件):

  l 首先需編寫configure.in文件,此文件用于Autoconf生成configure可執行腳本;configure.in的框架大致如下:

  dnl 此文件用于生成configure腳本,

  dnl AC_INIT的xxxx.h參數代表本目錄下一個有效的文件名

  AC_INIT(xxxx.h)

  dnl AM_INIT_AUTOMAKE的兩個參數分別是生成應用程序的版本及版本號,

  dnl 可能有些版本的Autoconf和Automake不支持此宏

  AM_INIT_AUTOMAKE(xxxx, x.x)

  dnl 以下為編譯依靠的檢測

  dnl Checks for programs.

  AC_PROG_AWK

  AC_PROG_CC

  AC_PROG_INSTALL

  AC_PROG_LN_S

  dnl Checks for libraries.

  AC_CHECK_LIB(check,suite_create)

  dnl Checks for header files.

  AM_CONFIG_HEADER(config.h)

  dnl Checks for typedefs, strUCtures, and compiler characteristics.

  dnl Checks for library functions.

  dnl 將Automake生成的Makefile.in文件輸出為Makefile文件

  AC_OUTPUT(Makefile)

  (提示:autoscan可以生成configure.in文件的基本框架,但很基本,可其生成的configure.scan文件的基礎補充,然后更名為configure.in)

  l 編寫Makefile.am文件,用于Automake生成Makefile.in文件,Makefile.am文件的大致框架如下:(其中xxxx為應用程序文件名,比如program.c文件的測試程序文件名我建議為check_program.c;)

TESTS = check_xxxx

noinst_PROGRAMS=check_xxxx

frame_path=xx/check-0.8.0

xxxx_docs =/

srcfilelist_1/

srcfilelist_2/

......./

.....

xxxx_SOURCES=/

srcfilelist_1/

srcfilelist_2/

.......

EXTRA_DIST = $(xxxx_docs)
INCLUDES = -I$(frame_path)/src -I$(other_path)/include

LDADD= /$(frame_path)/src/libcheck.a

CLEANFILES=*.*~
  (Makefile.am有很許多標記,可以參閱相應文檔。但常用的如:noinst_PROGRAMS為生成的可執行文件,xxxx_SOURCES(應用程序名加后輟_SOURCES)為源文件列表,EXTRA_DIST為發布程序時不需要的文件列表(用此方法可以將測試文件去掉),INCLUDES為要包含的頭文件路徑,check的頭文件位置在其安裝目錄下的src中;LDADD為要鏈接的庫文件名,libcheck.a為check測試框架的庫文件;)

   使用Automake –a –-foreign來生成Makefile.in文件,--foreign是為了生成幾個外部文件如install.sh等,假如已有這些文件則可以省略這個參數;

   使用Autoconf來生成configure執行腳本;然后執行./configure來生成Makefile文件;

   執行make來生成可執行程序;

  3.2.2 建立測試用例:

  1、以程序文件名加前輟“check_”命名測試單元文件名,比如money.c文件的測試單元文件命名為check_money.c;

  2、加入測試框架頭文件以及要測試的單元頭文件,以check_money為例:

  頭文件:money.h;源文件:money.c;測試單元文件:check_money.c:

  測試文件框架如下:


#include <stdlib.h>

#include <check.h>

#include "money.h"

/*建立必要的測試變量,Money為money.h中定義的結構struct money*/

Money *five_dollars;

/*單元測試初始化函數*/

void setup (void)

{

five_dollars = money_create(5, "USD");

}

/*單元測試結束函數*/

void teardown (void)

{

money_free (five_dollars);

}


/*單元測試用例,用例名為test_create*/

/*test functions: money_amout()*/

START_TEST(test_create)

{

/*功能性測試,屬黑盒測試*/

/*normal test*/

fail_unless (money_amount(five_dollars) = = 5,

"Amount not set correctly on creation");

fail_unless (strcmp(money_currency(five_dollars),"USD") = = 0,

"Currency not set correctly on creation");

/*條件及錯誤路徑測試,屬白盒測試*/

/*extra test*/

}

END_TEST


/*單元測試用例,用例名為test_net_create*/

START_TEST(test_neg_create)

{

Money *m = money_create(-1, "USD");

fail_unless (m = = NULL, "NULL should be returned on attempt to create with a negative amount");

}

END_TEST



/*單元測試用例,用例名為test_net_create*/

START_TEST(test_zero_create)

{

Money *m = money_create(0, "USD");

fail_unless (money_amount(m) = = 0,

"Zero is a valid amount of money");

}

END_TEST



/*單元測試組裝,將所有單元測試組裝到一個“箱子”里面,“箱子”名為Money*/

Suite *money_suite (void)

{

Suite *s = suite_create("Money");



/*測試用例分組*/

TCase *tc_core = tcase_create("Core");

TCase *tc_limits = tcase_create("Limits");



/*將分組加入“箱子”

suite_add_tcase (s, tc_core);

suite_add_tcase (s, tc_limits);



/*分別將不同用例加入分組*/

tcase_add_test (tc_core, test_create);

tcase_add_checked_fixture (tc_core, setup, teardown); /*此用例注冊初始化和結束函數*/

/*以下用例將不注冊初始化和結束函數*/

tcase_add_test (tc_limits, test_neg_create);

tcase_add_test (tc_limits, test_zero_create);

return s;

}



/*執行測試用例*/

int main (void)

{

int nf;

Suite *s = money_suite();

SRunner *sr = srunner_create(s);

srunner_run_all (sr, CK_NORMAL);

nf = srunner_ntests_failed(sr);

srunner_free(sr);

suite_free(s);

return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;

}

  3.2.3 制作發行版:

  制作發行版只須配置另外一份Makefile.am,在此文件中的源文件列表加入執行主體,即應用程序包含main函數的文件;也可在制作測試版的Makefile.am中加入發行版的配置,這樣就可以直接生成測試版程序和發行版程序。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长治县| 卓资县| 加查县| 宁安市| 石阡县| 杨浦区| 松原市| 永安市| 和静县| 鹤庆县| 岑巩县| 乐安县| 延津县| 温宿县| 张北县| 宁德市| 郑州市| 秦皇岛市| 突泉县| 长垣县| 德令哈市| 陆河县| 象山县| 丹棱县| 黔东| 新昌县| 肇庆市| 仁布县| 伊吾县| 册亨县| 隆尧县| 军事| 普兰店市| 栾川县| 大同县| 余干县| 漳平市| 漳平市| 武冈市| 望城县| 犍为县|