麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 蜜桃精品视频 | 91久久夜色精品国产网站 | 午夜精品老牛av一区二区三区 | 香蕉久久久久久 | 久久久www成人免费毛片 | 欧美一区二区三区中文字幕 | 97porn| 久久精品国产亚洲7777小说 | 久久精品免费国产 | 国产九色视频在线观看 | 女人裸体让男人桶全过程 | 精品在线观看一区二区三区 | 韩国一级免费视频 | free台湾极品性hd | 成人在线视频免费看 | 亚洲欧洲日产v特级毛片 | 黑人一级片 | 国内精品国产三级国产a久久 | 黄色毛片视频在线观看 | 欧美精品成人一区二区在线观看 | 99视频网| 99爱视频在线观看 | 精精国产xxxx视频在线播放7 | 九九视频在线观看6 | 国产成人免费高清激情视频 | 国产午夜精品理论片a级探花 | 国产精品久久国产精麻豆96堂 | 免费黄色在线电影 | 黑人一区二区三区四区五区 | 91看片淫黄大片欧美看国产片 | a集毛片| 一区二区三区小视频 | 久久亚洲精品国产 | 久久精品视频1 | 免费一级特黄毛片视频 | 日日碰日日操 | 中日韩免费视频 | 日韩高清影视 | 激情大乳女做爰办公室韩国 | www.91sp | 成人免费在线观看视频 |