亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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

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=*.*~
 ?。∕akefile.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中加入發行版的配置,這樣就可以直接生成測試版程序和發行版程序。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品久久久久久牛牛| 日本中文字幕不卡免费| 精品视频久久久| 亚洲视频第一页| 国产黑人绿帽在线第一区| 日韩av片永久免费网站| 国产一区二区在线播放| 亚洲国产精品福利| 日韩精品免费综合视频在线播放| 亚洲国产一区二区三区在线观看| 色先锋资源久久综合5566| 国产91在线播放九色快色| 色综合久久精品亚洲国产| 欧美肥老太性生活视频| 亚洲97在线观看| 国产成人a亚洲精品| 国产精品十八以下禁看| 国产亚洲人成a一在线v站| 亚洲网站视频福利| 97精品视频在线| 黑人巨大精品欧美一区二区三区| 成人免费激情视频| 日韩精品在线免费播放| 456亚洲影院| 久久久噜噜噜久久中文字免| 久久在线观看视频| 在线日韩av观看| 欧美丝袜第一区| 欧美性生活大片免费观看网址| 欧美精品中文字幕一区| 国产色婷婷国产综合在线理论片a| 91免费视频国产| 日韩av资源在线播放| 欧美日韩999| 国产精品日韩一区| 成人免费自拍视频| 91在线观看免费| 91精品视频在线看| 久久久久久香蕉网| 亚洲精品午夜精品| 久久久91精品国产一区不卡| 中文字幕亚洲欧美一区二区三区| 日本精品免费观看| 日韩免费观看视频| 国产精品日日做人人爱| 日韩在线视频中文字幕| 亚洲性日韩精品一区二区| 欧美在线视频一区| 91成人在线观看国产| 午夜免费在线观看精品视频| 97视频在线观看亚洲| 久久久噜噜噜久噜久久| 成人精品一区二区三区电影黑人| www欧美xxxx| 国产亚洲精品va在线观看| 蜜臀久久99精品久久久久久宅男| 国产女人精品视频| 国精产品一区一区三区有限在线| 96pao国产成视频永久免费| 久久久久久久国产精品视频| 欧美猛交ⅹxxx乱大交视频| 国产精品视频男人的天堂| 精品人伦一区二区三区蜜桃网站| 久久免费少妇高潮久久精品99| 久色乳综合思思在线视频| 91黑丝高跟在线| 久久久最新网址| 国产91精品高潮白浆喷水| 欧美自拍视频在线观看| 国产一区二区视频在线观看| 欧美成人午夜影院| 91青草视频久久| 久久中国妇女中文字幕| 国产精品久久久久久久午夜| 成人黄色午夜影院| 亚洲欧美日韩第一区| 欧美中文字幕在线观看| 久久国产精品99国产精| 成人国产精品日本在线| 国产精品色悠悠| 欧美亚洲另类制服自拍| 国产精品久久久久久久美男| 青青青国产精品一区二区| 亚洲精品之草原avav久久| 青青a在线精品免费观看| 成人国产在线视频| 国产成人精彩在线视频九色| 欧美高清无遮挡| 日韩av免费在线| 欧美做受高潮电影o| 欧美性高跟鞋xxxxhd| 久久精品国产96久久久香蕉| 在线观看国产精品日韩av| 精品亚洲一区二区三区在线播放| 国产精国产精品| 成人久久一区二区三区| 日韩av在线网站| 欧美激情伊人电影| 欧美激情精品久久久久久黑人| 国产精品夜间视频香蕉| 成人妇女淫片aaaa视频| 91社区国产高清| 国产欧美一区二区三区四区| 青青草原一区二区| 另类天堂视频在线观看| 亚洲成人1234| 性色av一区二区三区在线观看| 欧美激情视频三区| 成人免费看吃奶视频网站| 欧美国产日韩中文字幕在线| 国产69精品久久久久9999| 欧美一级电影久久| 国产精品免费久久久久影院| 国产精品精品国产| 国产在线观看91精品一区| 国产男人精品视频| 欧美一乱一性一交一视频| 隔壁老王国产在线精品| 欧美日韩在线视频首页| 欧美夫妻性生活视频| 欧美激情网友自拍| 国产精品久久久久久久美男| 在线视频免费一区二区| 81精品国产乱码久久久久久| 国产97在线亚洲| 高清日韩电视剧大全免费播放在线观看| 亚洲国产精品悠悠久久琪琪| 久久久噜噜噜久久中文字免| 爱福利视频一区| 亚洲欧美成人在线| 国产亚洲欧洲高清一区| 精品成人久久av| 中文字幕日韩在线播放| 国产精品免费久久久久影院| 色妞欧美日韩在线| 色婷婷**av毛片一区| 久久人人爽人人爽爽久久| 欧美精品国产精品日韩精品| 清纯唯美亚洲综合| 少妇av一区二区三区| 亚洲第一福利在线观看| 亚洲天堂开心观看| 日韩成人av一区| 久久久久国产精品免费网站| 亚洲欧美国产日韩中文字幕| 久久人人爽亚洲精品天堂| 久久亚洲成人精品| 日本免费一区二区三区视频观看| 久久中国妇女中文字幕| 91九色单男在线观看| 国产精品午夜国产小视频| 国产大片精品免费永久看nba| 成人妇女淫片aaaa视频| 欧美区二区三区| 亚洲第一网中文字幕| 欧美在线免费看| 懂色aⅴ精品一区二区三区蜜月| 欧美一乱一性一交一视频| 91精品久久久久久久久| 在线精品播放av| 久久男人资源视频| 精品人伦一区二区三区蜜桃网站| 97碰碰碰免费色视频| 粉嫩av一区二区三区免费野|