锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
test 搴撲腑鏈夊涓嬬殑緇勪歡錛?br>Execution Monitor 涓涓熀鏈敤浜?program 鍜?test program 鐨勫紓甯鎬笌閿欒媯嫻嬩笌鎶ュ憡鏈哄埗錛孍xecution Monitor 璋冪敤鐢ㄦ埛鎻愪緵鐨勫嚱鏁板茍鎶ュ憡鎵鏈夋崟鑾風殑榪愯鏃剁殑寮傚父錛屽畠鍙鍏朵粬 Boost Test Library components 鍐呴儴璋冪敤錛屽綋鐒朵篃鍙互鐢ㄤ簬涓浜?production environment 鎺у埗閭d簺浼氬鑷寸▼搴忓穿婧冪殑鍑芥暟鐨勮皟鐢紱
Program Execution Monitor 涓涓畝鍗曠殑 helper facility 鐢ㄤ簬鐩戞帶涓涓▼搴忕殑榪愯錛孭rogram Execution Monitor 鎻愪緵浜?main() 鍑芥暟鍜?Execution Monitor 鐩戞帶紼嬪簭鐨勬墽琛岋紝鍙互鐢ㄤ互 production environment 浜х敓涓鑷撮敊璇姤鍛婏紝鎺у埗鍦?test environment 鐜涓繍琛岀殑紼嬪簭錛岀洿鎺ヤ嬌鐢?Test Execution Monitor錛?br>
Test Tools 涓涓敤浠ヨ繘琛?testing 鐨勪竴涓?toolbox錛孴est Tools 琚敤鏉ユ祴璇曞湪 Test Execution Monitor 鎴?Unit Test Framework 鎺у埗涓嬭繍琛岀殑紼嬪簭錛?br>
Test Execution Monitor 璁╀竴涓祴璇曠▼搴忓湪 monitored environment 鐜涓繍琛岋紝Test Execution Monitor 鎻愪緵浜?main() 鏉ユ帶鍒惰嫻嬭瘯紼嬪簭鐨勮繍琛屽茍鍙互璁?Test Tools 瀹炵幇嫻嬭瘯鐨勯昏緫錛屽畠琚敤鍦?test environment錛屽鏋滆鎺у埗 production code 鐨勮繍琛屼嬌鐢?Program Execution Monitor錛?br>
Unit Test Framework 鐢ㄤ互綆鍖栫紪鍐欏拰緇勭粐 test cases 鐨?framework錛屾敮鎸佺畝鍗曞嚱鏁版垨鑰呮槸鎴愬憳鍑芥暟緙栧啓鐨?test cases 騫跺皢浠栦滑緇勭粐鎴愪竴涓?test suites 鐨?tree錛岃 framework 浣跨敤 Test Tools 鏉ュ疄鐜?test cases 騫舵彁渚涗簡涓縐嶆満鍒剁敤浠ョ鐞?log report level 鍜?result report level錛?br>
minimal testing facility 鎻愪緵 Boost Test 鏈鍒濈増鏈殑鎻愪緵鐨勫姛鑳界殑綆鍗?facility錛屾彁渚涗簡鍜?Test Execution Monitor 涓鏍風殑鏈哄埗錛屼絾棰濆瀹氫箟浜嗕竴浜涚畝鍗曟彁渚?Test Tools 綾諱技鍔熻兘鐨?test tools錛屽畠涓嶉渶瑕佸拰浠諱綍鐨勫閮ㄧ粍浠?link錛岄傚悎綆鍗曞拰蹇熸祴璇曠殑闇瑕侊紝浣跨敤浜?test environment銆?br>(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!146.entry)
boost Test 鐨?Execution Monitor
浣跨敤 Execution Monitor 鐨勪笁閮ㄦ洸錛?br>1. #include <boost/test/execution_monitor.hpp>
2. Make an instance of boost::execution_monitor
3. Optionally register custom exception translators for exception classes you want special processing
璋冪敤 execution_monitor::execute( function_to_monitor, catch_system_exception, timeout ) 榪愯 monitored function銆傚鏋滆皟鐢ㄦ垚鍔熷垯榪斿洖涓涓?integer value錛屽鏋滄湁濡備笅鐨勪簨鎯呭彂鐢?br>1. Uncaught C++ exception
2. hardware or software signal, trap, or other exception
3. Timeout reached
4. debug assert event occurred (under Microsoft Visual C++ or compatible compiler)
the method execution_monitor::execute( ... ) throws the boost::execution_exception
濡傛灉甯屾湜紼嬪簭 error message 琚漿鍖栦負 execution_exception 鐨?error message錛屽垯鎵斿嚭濡備笅鐨勪笁綾誨紓甯革細C string錛宻td:string錛宎ny exception class in std::exception hierarchy銆?br>
緇堟 monitored function 鑰屼笉璁?Execution Monitor 鎶ュ憡 any error 鐨勬渶浣蟲柟娉曟槸鎶涘嚭 boost::execution_aborted銆傚鏋滀笉鍠滄 "unknown exception caught" message 鑰屾洿鎰挎剰浣跨敤鑷畾涔夌殑 exception錛屽彲浠ュ悜 execution monitor 涓?any exception types 娉ㄥ唽 translator 鍑芥暟錛屽
ex_mon.register_exception_translator<my_exception1>( &translate_my_exception1 );
my_exception1 鏄紓甯哥被鍨嬶紝translate_my_exception1 鏄紓甯稿鐞嗗嚱鏁般?br>class execution_monitor {
public:
virtual ~execution_monitor();
template<typename Exception, typename ExceptionTranslator>
void register_exception_translator( ExceptionTranslator const& tr, boost::type<Exception>* = 0 );
int execute( unit_test::callback0<int> const& F, bool catch_system_errors = true, int timeout = 0 );
}; // exception monitor
Execution Monitor 鐢?boost::execution_exception 鎶ュ憡鎹曡幏鐨勯棶棰橈紝鍏舵渶澶х殑鐗圭偣鏄笉鍒嗛厤浠諱綍 memory 鍥犳鍦ㄥ唴瀛樼█緙虹幆澧冧腑浣跨敤銆?br>class execution_exception {
public:
execution_exception( error_code ec, const_string what_msg );
enum error_code {
cpp_exception_error, // see note (1) below
user_error, // user reported nonfatal error
system_error, // see note (2) below
timeout_error, // only detectable on certain platforms
user_fatal_error, // user reported fatal error
system_fatal_error // see note (2) below
};
error_code code() const; // use this method to get an error code for the exception
const_string what() const; // use this method to get an error message for the exception
};
Note 1 錛歶ncaught C++ exceptions 琚綋鍋?error錛屽鏋滃簲鐢ㄧ▼搴忔崟鑾峰埌 C++ exception錛屽垯璇?exception 涓嶄細鍒?boost::execution_monitor錛?br>Note 2 錛氳繖浜?error 鍖呮嫭 UNIX signals 鍜?Windows structured exceptions錛岃繖浜涚粡甯哥敱 hardware traps 瑙﹀彂銆?br>
execution_monitor 鍙互鍔ㄦ佽繛鎺ワ紝搴撲腑娌℃湁鎻愪緵 main 鍑芥暟銆傜敱浜庡彧鏈変竴涓?libs/test/execution_monitor.cpp 鏂囦歡錛屽洜姝ゅ彲浠ョ洿鎺?copy 璇ユ枃浠躲?br>(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!148.entry)
boost Test 鐨?Program Execution Monitor
C++ program 鍙互閫氳繃 return value 鍜?throwing an exception 鎶ュ憡 user-detected errors錛岃屽 dereferencing an invalid pointer 鐨?System-detected errors 鍒欎互鍏朵粬鏂瑰紡鎶ュ憡銆?br>
Boost Test Library 鐨?Program Execution Monitor 鍑忚交浜嗙敤鎴峰鐞嗗鏉傜殑 error detection 鍜?reporting錛屽茍鎻愪緵浜?main() 鍑芥暟鍦?monitored environment 鏉ヨ皟鐢ㄧ敤鎴鋒彁渚涚殑 cpp_main() 鍑芥暟錛宮ain() 鍑芥暟浠ヤ竴鑷寸殑鏂瑰紡媯嫻嬪拰鎶ュ憡澶氱 errors 鐨勫彂鐢燂紝灝嗗叾杞寲涓轟竴鑷寸殑 return code 榪斿洖緇?host enviroment銆?br>BOOST_TEST_CATCH_SYSTEM_ERRORS 璁劇疆鍏佽 Execution Monitor 鎹曡幏 system errors錛岄粯璁ゅ間負 "yes"銆?br>BOOST_PRG_MON_CONFIRM 璁劇疆鏄惁鍏佽鐢ㄦ埛浜や簰紜紼嬪簭姝g‘榪愯錛岄粯璁ゅ間負"yes"銆?br>
Program Execution Monitor 浣跨敤 Execution Monitor 鐩戣鐢ㄦ埛鎻愪緵鐨?cpp_main() 鍑芥暟鐨勮繍琛屻傚敖綆?Program Execution Monitor 鍦?libs/test/src/cpp_main.cpp 鎻愪緵浜?main() 鍑芥暟錛屼絾鏄負浜?link 姝g‘錛岀敤鎴峰繀欏繪彁渚涗竴涓笌 main() 鍑芥暟涓鏍鋒帴鍙g殑 cpp_main() 鍑芥暟銆傚 cpp_main() 鎶涘嚭寮傚父鎴栬繑鍥為潪 0 鍊鹼紝Program Execution Monitor 灝辮涓虹▼搴忓彂鐢熼敊璇?br>Program Execution Monitor 鍦?cout 鍜?cerr 嫻佷笂鍒嗗埆鎻愪緵璇︾粏鍜岀畝瑕佺殑閿欒鎶ュ憡銆侾rogram Execution Monitor 鎻愪緵鐨?main() 鍑芥暟榪斿洖濡備笅鐨勫?br>1. boost::exit_success - no errors
2. boost::exit_failure - non-zero and non-boost::exit_success return code from cpp_main().
3. boost::exit_exception_failure - cpp_main() throw an exception.
(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!149.entry)
boost Test 鐨?Test Tools
Test Tools 涓轟簡璁╃敤鎴蜂嬌鐢ㄦ柟渚匡紝鎻愪緵浜嗕竴緋誨垪鐨勫畯錛岃繖浜涘畯鍒嗕笁綰э紝鍏舵晥鏋滄槸涓嶅悓鐨勶細
WARN 涓嶅鍔犲紩鐢ㄨ鏁幫紝緇х畫鎵ц紼嬪簭
CHECK 澧炲姞搴旂敤璁℃暟錛岀戶緇墽琛岀▼搴?br>REQUIRE 澧炲姞搴旂敤璁℃暟錛屼腑鏂▼搴忕殑榪愯
浣跨敤 CHECK level tools 瀹炵幇 assertions錛屼嬌鐢?WARN level tools 媯楠屼笉澶噸瑕佷絾鏄紜殑鏂歸潰錛屽錛氭ц兘銆佸彲縐繪鎬с佹湁鐢ㄦэ紝濡?assertions 澶辮觸灝變笉搴旇璁╃▼搴忕戶緇繍琛屽垯浣跨敤 REQUIRE level tools銆?br>
Test Tools 鎻愪緵浜嗕袱涓?.hpp 鏂囦歡 boost/test/test_tools.hpp 鍜?boost/test/floating_point_comparison.hpp錛屼竴涓?.cpp 鏂囦歡 libs/test/test_tools.cpp
BOOST_WARN( P )
BOOST_CHECK( P )
BOOST_REQUIRE( P )
BOOST_WARN_MESSAGE( P, M )
BOOST_CHECK_MESSAGE( P, M )
BOOST_REQUIRE_MESSAGE( P, M )
BOOST_ERROR( M )BOOST_FAIL( M )
BOOST_MESSAGE( M )
BOOST_CHECKPOINT( M )
BOOST_WARN_THROW( S, E )
BOOST_CHECK_THROW( S, E )
BOOST_REQUIRE_THROW( S, E )
BOOST_WARN_EXCEPTION( S, E, P )
BOOST_CHECK_EXCEPTION( S, E, P )
BOOST_REQUIRE_EXCEPTION( S, E, P )
BOOST_IGNORE_CHECK( e )
BOOST_WARN_NO_THROW( S )
BOOST_CHECK_NO_THROW( S )
BOOST_REQUIRE_NO_THROW( S )
BOOST_WARN_CLOSE( L, R, T )
BOOST_CHECK_CLOSE( L, R, T )
BOOST_REQUIRE_CLOSE( L, R, T )
BOOST_WARN_SMALL( FPV, T )
BOOST_CHECK_SMALL( FPV, T )
BOOST_REQUIRE_SMALL( FPV, T )
BOOST_WARN_PREDICATE( P, ARGS )
BOOST_CHECK_PREDICATE( P, ARGS )
BOOST_REQUIRE_PREDICATE( P, ARGS )
BOOST_WARN_EQUAL_COLLECTIONS( L_begin, L_end, R_begin, R_end )
BOOST_CHECK_EQUAL_COLLECTIONS( L_begin, L_end, R_begin, R_end )
BOOST_REQUIRE_EQUAL_COLLECTIONS( L_begin, L_end, R_begin, R_end )
BOOST_WARN_BITWISE_EQUAL( L, R )
BOOST_CHECK_BITWISE_EQUAL( L, R )
BOOST_REQUIRE_BITWISE_EQUAL( L, R )
BOOST_IS_DEFINED( symb )
BOOST_BITWISE_EQUAL( L, R )
(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!145.entry)
boost Test 鐨?Test Execution Monitor
Test Execution Monitor 緇撳悎浜?Test Tools 鍜?Execution Monitor 鐨勭壒鐐圭畝鍖栦簡鐑︾悙嫻嬭瘯宸ヤ綔錛屽畠鎻愪緵浜?main() 鍑芥暟璋冪敤鐢ㄦ埛鎻愪緵鐨?test_main() 鍑芥暟錛岀敤鎴峰彲浠ヤ嬌鐢?Test Tools 鏉ヨ繘琛屽鏉傜殑楠岃瘉宸ヤ綔銆?br>
Test Execution Monitor 琚璁$敤鏉ヨ繘琛屾祴璇曠畝鍗曠殑紼嬪簭鎴栬呬粠宸插瓨鍦ㄧ殑 production code 涓?dig a problem銆侾rogram Execution Monitor 鏇撮傚悎鐩戞帶 production (non-test) programs錛堝洜涓哄畠涓嶅獎鍝嶇▼搴忕殑鎬ц兘錛夛紝鑰?Unit Test Framework 鏇撮傚悎 complex test programs錛屽洜涓?Unit Test Framework 鍙互
1. 鍙互灝?test 鍒嗗壊鍒板涓?test cases錛屽畠浼氫負姣忎竴涓?test case 鍒嗗埆浜х敓 pass/fail 鐨勭粺璁′俊鎭紱
2. 鍋囧鏌愪竴涓?test case 澶辮觸浜嗕笉浼氬獎鍝嶅叾浠栫殑 test錛?br>3. 鍙互閫氳繃鎸囧畾 name 鏉ヨ繍琛岀壒瀹氱殑 test case
4. 鍒嗙鐨?test cases 榪愯鏇存竻妤氬彂鐜扮壒瀹氭祴璇曟ā鍧楃殑鐩殑
5. 鍙互璁劇疆鏇村鐨勯夐」
(http://yaekees.spaces.live.com/blog/cns!1955ee8c6707277a!150.entry)
boost Test 鐨?Unit Test Framework
regression testing 鍙叧娉ㄧ▼搴忚繍琛岀殑鏃跺欐槸鍚︽湁閿欒鍙戠敓錛岃?unit test 鍒欓渶瑕佸敖鍙兘璇︾粏鐨勮緭鍑洪敊璇殑淇℃伅銆俇nit Test Framework 鐢?test tools 綆鍖栦簡 test cases 鐨勭紪鍐欏茍灝嗗叾緇勭粐涓烘湁灞傛鐨?test suites銆傚畠鎻愪緵浜?main() 鍑芥暟鍒濆鍖?framework錛岄氳繃鍛戒護琛屽弬鏁版垨鑰呮槸鐜鍙橀噺璁劇疆鍙傛暟錛屽茍閫氳繃 init_unit_test_suite(argc, argv)錛岀劧鍚庤繍琛岀敤鎴風殑 test suite銆侳ramework 璺熻釜鎵鏈夌殑 passed/failed 鐨?Test Tools assertions錛屽彲浠ラ氳繃 test cases 鐨勬暟鐩紙part 鍜?total錛夊緱鍒版祴璇曡繘搴︼紝騫朵笖鍙互澶氱褰㈠紡鎻愪緵緇撴灉銆俇nit Test Framework 鍙鐢ㄦ潵榪涜綆鍗曟祴璇曞拰澶嶆潅閲嶈嫻嬭瘯錛屽畠涓嶉傚悎鐢ㄥ湪 production code錛屽悓鏃跺畠浠ヨ繍琛屾椂鐨勬晥鐜囦負浠d環鍔犻熺紪璇戙?br>
璇ュ嚱鏁拌礋璐e垱寤哄拰鍒濆鍖栭《灞傜殑 test_suite 瀹炰緥錛屽 test_suite 鍒涘緩澶辮觸璇ュ嚱鏁拌繑鍥?NULL 鎸囬拡錛屾祴璇曠粓姝㈠茍榪斿洖涓涓?boost::exit_test_failure銆侳ramework 鍦ㄦ祴璇曡繍琛屾椂浼犻掔壒瀹氱殑鍛戒護琛屽弬鏁幫紝鍚屾椂鎺掓枼鍏朵粬 framework 鎸囧畾鐨勫弬鏁幫紝鍚屾椂 framework 璐熻矗 test_suite 鐨勭敓鍛藉懆鏈燂紝鍦?test 緇堟鏃朵細琚攢姣併?br>
鍋囧 test cases 浼氫涪鍑鴻嚜瀹氫箟鐨勫紓甯革紝鍙互鍍?Execution Monitor 閭f牱娉ㄥ唽鐗瑰畾鐨?translator錛屾敞鍐屽嚱鏁扮殑鍘熷瀷瀹氫箟濡備笅
template<typename Exception, typename ExceptionTranslator>
void boost::unit_test::register_exception_translator( ExceptionTranslator const& tr, boost::type<Exception>* d = 0 )
涓鏃︽祴璇曠粨鏉燂紝framework 浼氭姤鍛婄粨鏋滃茍榪斿洖 return code銆備笅闈㈡槸闆嗘垚鍦?unit test framework 鍐呴儴鐨勭殑榪斿洖鍊?br>boost::exit_success returned if no errors occurred during test or success result code was explicitly requested with the no result code framework parameter
boost::exit_test_failure returned if nonfatal errors detected and no uncaught exceptions thrown or the framework fails to initialize the test suite
boost::exit_exception_failure returned if fatal errors detected or uncaught exceptions thrown
鍦?VC7.1+stlport 4.62 涓?unit_test_example3.cpp 娌℃湁閫氳繃(瀵瑰縐嶇戶鎵挎病鏈夐氳繃)
綆鍗曠殑浣跨敤鏂規硶錛?br>1. 棣栧厛瀹氫箟 #define BOOST_AUTO_TEST_MAIN
2. 鍖呭惈 #include <boost/test/auto_unit_test.hpp>
3. 鍒涘緩涓涓?test_suite
BOOST_AUTO_TEST_CASE( test )
{
BOOST_CHECK( true );
}
鐒跺悗 link libboost_test_exec_monitor-vc71-mt-sp-1_33.lib 灝卞彲浠ヤ簡銆?br>
鍙︿竴綾諱嬌鐢ㄦ柟娉曪紝棣栧厛鍖呭惈濡備笅
#include <boost/test/unit_test.hpp>
#include <boost/test/unit_test_monitor.hpp>
using namespace boost::unit_test;
鐒跺悗澹版槑 test_suite* init_unit_test_suite(int /*argc*/, char* /*argv*/[]) {}
涓涓吀鍨嬬敤娉曟槸
test_suite* init_unit_test_suite( int /*argc*/, char* /*argv*/[] ) {
test_suite* test = BOOST_TEST_SUITE("custom_exception_test");
unit_test_monitor.register_exception_translator<my_exception1>( &my_exception1_translator );
unit_test_monitor.register_exception_translator<my_exception2>( &my_exception2_translator );
test->add( BOOST_TEST_CASE( &throw_my_exception1 ) );
test->add( BOOST_TEST_CASE( &throw_my_exception2 ) );
return test;
}
(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!151.entry)
boost 鐨?minimal testing facility
鍙傚悎浣跨敤鍦?test environment 涓紝涓嶉渶瑕?link 浠諱綍澶栭儴鐨勭粍浠躲傜敤鎴峰彧闇瑕佹彁渚涗簡濡備笅鐨勫嚱鏁?br>int test_main( int argc, char* argv[] ) 灝卞彲浠ヤ簡銆俶inimal testing facility 鎻愪緵浜?BOOST_CHECK(predicate)錛孊OOST_REQUIRE(predicate)錛孊OOST_ERROR(message)錛?BOOST_FAIL(message)銆傞櫎浜嗚繖鍥涗釜 MACRO 浠ュ鍙互閫氳繃鎶涘嚭寮傚父鍜?return 榪斿洖鍊兼姤鍛婇敊璇備笅闈㈡槸 boost 鎻愪緵鐨勪竴涓ず渚嬨?br>#include <boost/test/minimal.hpp>
int add( int i, int j ) { return i+j; }
int test_main( int, char *[] ) // note the name!
{
// six ways to detect and report the same error:
BOOST_CHECK( add( 2,2 ) == 4 ); // #1 continues on error
BOOST_REQUIRE( add( 2,2 ) == 4 ); // #2 throws on error
if( add( 2,2 ) != 4 )
BOOST_ERROR( "Ouch..." ); // #3 continues on error
if( add( 2,2 ) != 4 )
BOOST_FAIL( "Ouch..." ); // #4 throws on error
if( add( 2,2 ) != 4 ) throw "Oops..."; // #5 throws on error
return add( 2, 2 ) == 4 ? 0 : 1; // #6 returns error code
}
BOOST_CHECK 濡傛灉璇ヨ〃杈懼紡澶辮觸浜嗭紝浼氬嚭鐜版簮浠g爜鏂囦歡鍚嶃佷唬鐮佽鍙楓佸茍涓斾細澧炲姞 error count錛屼竴鏃︾▼搴忕粓姝?error count 浼氭樉紺哄湪 std::cout錛?br>BOOST_REQUIRE 綾諱技浜?BOOST_CHECK錛屼絾鏄細鎶涘嚭琚?nbsp; Minimal testing facility 鎹曡幏鐨勫紓甯搞?br>(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!147.entry)
]]>
鍑嗗宸ヤ綔錛?/span>
1銆?nbsp;瀹夎perl/Python
2銆?nbsp;涓嬭澆瑙e帇CxxTest
3銆?nbsp;璁劇疆鐜鍙橀噺錛?/span>
濡傛灉浣跨敤Perl,鍒欒緗竴涓悕涓?span>PERL鐨勭幆澧冨彉閲忥紝鍊間負perl.exe鐨勪綅緗傦紙姣斿D:\Perl\Bin\Perl.exe錛夛紱
濡傛灉瀹夎Python,鍒欒緗竴涓悕涓?span>PYTHON鐨勭幆澧冨彉閲忥紝鍊間負浣犲畨瑁呯殑Python鐩綍涓嬬殑python.exe璺緞錛堟瘮濡?span>D:\Python25\python.exe錛夛紱
璁劇疆涓涓悕涓?span>CXXTESTDIR 鐨勭幆澧冨彉閲忥紝鍊間負CxxTest瑙e帇鍚庣殑鐩綍銆傦紙姣斿D:\Cxxtest錛夈傦紙璁劇疆CXXTESTDIR鐨勫師鍥狅細鍏嶅幓姣忔鍦?span>makefile鏂囦歡涓寚瀹?span>CXXTESTDIR鐨勭洰褰曪級
鏂瑰紡涓錛氫嬌鐢?span>CxxTest \sample\msvc涓殑妗嗘灦
1銆?nbsp;鎷瘋礉msvc鏂囦歡澶瑰埌宸ョ▼鐩綍涓?/span>
鎵撳紑CxxTest_Workspace.sln錛屽彲浠ョ湅鍒頒笁涓」鐩細
- CxxTest_3_Generate 榪愯 cxxtestgen.pl 鐢熸垚 runner.cpp 鏂囦歡錛?/span>
- CxxTest_2_Build 緙栬瘧鐢熸垚鐨?/span>runner.cpp鏂囦歡錛?/span>
- CxxTest_1_Run 榪愯嫻嬭瘯錛?/span>
2銆?nbsp;淇敼鍏朵腑鐨?span>makefile鏂囦歡:
1錛夊皢浠ヤ笅鍐呭錛?/span>
# Where to look for the tests
TESTS = ..\gui\*.h ..\*.h
淇敼涓猴細
# Where to look for the tests
TESTS = *.h
榪欐璇濈殑浣滅敤鏄煡鎵炬祴璇曟枃浠訛紝鎴戜滑鐨勬祴璇曟枃浠舵槸.h鏍煎紡鐨勶紝鏀懼湪褰撳墠鐩綍涓嬨傦紙濡傛灉鏄?span>.hpp鏍煎紡鐨勮瘽錛岃嚜鐒舵敼鎴?span>*.hpp錛涙斁鍦ㄥ叾瀹冪洰褰曠殑璇濓紝榪樿淇敼璺緞錛?/span>
2錛夊皢浠ヤ笅鍐呭鍒犻櫎錛?/span>
# Where the CxxTest distribution is unpacked
CXXTESTDIR = ..\..
鍥犱負鍏堝墠宸茬粡瀹氫箟浜?span>CXXTESTDIR鐨勭幆澧冨彉閲忥紝榪欓噷鐨勫畾涔夊彲浠ョ渷鎺夈?/span>
3銆?nbsp;鍦?/span>CxxTest_3_Generate欏圭洰涓坊鍔犳祴璇曟枃浠?/span>
榪欐槸嫻嬭瘯鏂囦歡鐨勪竴涓畝鍗曠殑渚嬪瓙錛?/span>
// Sampletest.h
#include <cxxtest/TestSuite.h>
//瀹氫箟涓涓祴璇曞浠剁被錛屽皢嫻嬭瘯鐢ㄤ緥鏀懼叆鍏朵腑
class SampletestSuite : public CxxTest::TestSuite
{
public:
//瀹氫箟嫻嬭瘯錛屼互test浣滀負嫻嬭瘯鍑芥暟鍓嶇紑錛?/span>
//榪欐槸cxxtestgen.pl鎴?span>cxxtestgen.py瀵規祴璇曟枃浠惰繘琛屾壂鎻忥紝鎶藉彇嫻嬭瘯鐢ㄤ緥鐨勪緷鎹?/span>
void testMultiplication( void )
{
TS_ASSERT_EQUALS( 2 * 2, 5 );
}
};
4銆?nbsp;榪愯嫻嬭瘯錛屽嵆鐢熸垚CxxTest_1_Run錛屽彲鍦ㄨ緭鍑虹獥鍙g湅鍒版祴璇曠粨鏋滐紝騫跺弻鍑葷粨鏋滆鍙畾浣嶅埌婧愪唬鐮併?/span>
鏂規硶浜岋細綆鍖?span>msvc錛屽皢Generate錛?/span>Build錛?/span>Run闆嗘垚鍒頒竴涓」鐩腑
1銆?nbsp;鍦ㄥ伐紼嬩腑娣誨姞鏂伴」鐩細Unit_Test
灝嗕慨鏀瑰悗鐨?span>makefile鏂囦歡鎷瘋礉鍒?span>Unit_Test鐩綍涓?/span>
2銆?nbsp;鍦?span>Unit_Test欏圭洰婧愭枃浠朵腑娣誨姞鏂板緩欏?span>dummy
鏃犺娣誨姞榪涙潵鐨勬槸.cpp,榪樻槸.h,灝嗗悗緙鍚嶅幓鎺夈?/span>
鍙沖嚮dummy錛岄夋嫨灞炴э紝鍦ㄥ脊鍑虹殑灞炴ч〉涓紝“鑷畾涔夌敓鎴愭楠?#8221;閫夐」->“鍛戒護琛?#8221;閫夐」錛岃緭鍏ワ細
ECHO Don't Delete this file!!! > Dummy
ECHO -
ECHO -
ECHO -------------------- Generating test cases --------------------
if exist runner.cpp
NMAKE runner.cpp /nologo
ECHO -
ECHO –
鍦?#8220;杈撳嚭”閫夐」涓緭鍏ワ細
Runner.cpp
Dummy鍙槸涓涓枃浠訛紝閲岃竟鍙互鏄換浣曞唴瀹癸紝鍏抽敭鐐瑰湪浜庡Dummy鏂囦歡榪涜緙栬瘧鐨勬椂鍊欐墍鎵ц鐨勬搷浣滐紝榪欐槸涓涓壒澶勭悊鏂囦歡錛岃繖涓壒澶勭悊鏂囦歡鎵ц鐢熸垚 testcase 鐨勬搷浣滐紝涔熷氨鏄皟鐢?span>Python/Perl鐢熸垚嫻嬭瘯鐢ㄤ緥錛堜篃灝辨槸runner.cpp鏂囦歡錛夈備負浜嗕繚鎸佹瘡嬈$紪璇戦兘鍙互鐢熸垚鏂扮殑runner鏂囦歡錛屽氨蹇呴』淇濊瘉
1錛?span>Dummy鏂囦歡鍦?span>runner.cpp涔嬪墠榪涜緙栬瘧錛?/span>
2錛?span>Dummy鏂囦歡姣忔閮藉繀欏昏閲嶆柊緙栬瘧銆?/span>
絎竴鐐規槸閫氳繃鏂囦歡欏哄簭鏉ョ殑錛岀浜岀偣鏄湪鐢熸垚浜嬩歡閲岃竟閲嶆柊鐢熸垚Dummy鏂囦歡鏉ヤ繚璇佺殑錛?span>VS2005浼間箮娌¢棶棰橈紝VC6浼間箮榪樻槸鏈変簺闂鐨勶級銆?/span>
浠庡彟澶栦竴涓搴﹁錛岃繖涓?span>Dummy鏂囦歡鐩稿綋浜?span> samples/msvc 絎竴鍜岀浜屼釜欏圭洰鐨勫姛鑳姐傦紙鍗?/span>Generate鍜?/span>Build錛?/span>
3銆?nbsp;緙栬瘧dummy鏂囦歡錛岀敓鎴?span>runner.cpp錛屽皢鍏舵坊鍔犲埌Unit_Test“婧愭枃浠?#8221;涓?/span>
紜畾褰撳墠鐩綍涓凡鏈?span>.h嫻嬭瘯鏂囦歡錛屽惁鍒欏彲鑳芥彁紺洪敊璇?/span>
4銆?nbsp;鍙沖嚮Unit_Test錛岄夋嫨灞炴э紝鍦ㄥ脊鍑烘潵鐨勫睘鎬ч〉涓紝 “鐢熸垚浜嬩歡”閫夐」->“鐢熸垚鍚庝簨浠?span>”閫夐」->“鍛戒護琛?#8221;閫夐」涓緭鍏ワ細
ECHO -
ECHO -
ECHO -------------------- Running Unit Test Cases --------------------
$(OutDir)\$(TargetName).exe
ECHO -
ECHO -
ECHO -------------------------------------------------------------------------------
鏀懼湪欏圭洰“鐢熸垚鍚庝簨浠?#8221;涓殑榪欎竴孌靛懡浠わ紝榪愯鐢熸垚鐨勬祴璇曪紝鐩稿綋浜?/span>samples/msvc 絎笁涓」鐩殑鍔熻兘銆傦紙鍗?/span>Run錛?/span>
5銆?nbsp;鍦?span>Unit_Test“澶存枃浠?#8221;涓紝娣誨姞鏂扮殑.h嫻嬭瘯鏂囦歡銆?/span>
鐢熸垚Unit_Test錛屽嵆鍙湪杈撳嚭紿楀彛鍒嗗壊綰夸笅鐪嬪埌榪愯嫻嬭瘯鐨勭粨鏋滐紝鍙屽嚮緇撴灉琛屽彲浠ュ畾浣嶅埌婧愪唬鐮併?/span>
濡傦細
1>-------------------- Running Unit Test Cases --------------------
1>Running 1 test
1>In MathsTestSuite::testMultiplication:
1>f:\test\cxxunittest\cxxunittest\sampletest.h(9): Error: Expected (2 * 2 == 5), found (4 != 5)
1>Failed 1 of 1 test
1>Success rate: 0%
1>----------------------------------------------------------------------------------
鏂規硶涓夛細鎶藉彇鍑轟竴涓?span>Unit_Test鏂囦歡澶?/span>
鎵璋撴柟娉曚笁錛屼笉榪囨槸灝嗘柟娉曚簩涓殑Unit_Test鏂囦歡澶癸紝鏇夸唬鏂規硶涓涓殑msvc鏂囦歡澶癸紝縐誨姩鍒板叾瀹冪殑欏圭洰涓嬌鐢ㄨ屽凡銆?/span>
涓嶅儚鏂規硶涓鐨?span>msvc閭f牱闇瑕佷笁涓」鐩紝涔熶笉闇鍍忔柟娉曚簩閭f牱錛屾瘡嬈¢兘淇敼dummy錛屽拰欏圭洰灞炴э紝娣誨姞鍛戒護琛屻傚皢Unit_Test鏂囦歡澶瑰悇涓睘鎬ч兘閰嶇疆濂戒箣鍚庯紝鐙珛鍑烘潵闅忔椂澶囩敤銆?/span>
鍑嗗宸ヤ綔錛屽鍓嶆墍璦銆?/span>
瑕佽繘琛屾祴璇曟椂錛?/span>
灝?/span>Unit_test鏂囦歡澶規嫹璐濇斁鍒板伐紼嬬洰褰曚腑錛屽湪宸ョ▼涓坊鍔犻噷闈㈢殑Unit_Test欏圭洰錛屼豢鐓?/span>Sampletest.h鍐欒嚜宸辯殑嫻嬭瘯鏂囦歡銆?/span>
榪愯嫻嬭瘯鏃訛細
鍏堢紪璇?/span>dummy錛屽啀鐢熸垚璇ユ祴璇曢」鐩?/span>(濡傛灉娌℃湁鍙﹀娣誨姞*.h鏂囦歡錛岀洿鎺ョ敓鎴愬氨鍙互浜?/span>)鍗曞厓嫻嬭瘯鐜板湪宸茬粡鎴愪負鏍囧噯鐨勭紪紼嬪疄璺碉紝浣嗘槸C++緙哄皯Java鍜?/span>.Net騫沖彴璇█鐨勫弽灝勬満鍒訛紝鎵浠ユ棤娉曟灇涓炬祴璇曟柟娉曪紝蹇呴』鎵嬪伐娣誨姞錛屾垨鑰呬嬌鐢ㄤ竴浜涚壒鍒殑瀹忥紝寮勫緱浠g爜闈炲父闅劇湅銆?/span>Java璇█鍗曞厓嫻嬭瘯鏄?/span>JUnit鐨勫ぉ涓嬶紝C#鍩烘湰涓婇兘鐢?/span>NUnit錛岃?/span>C++鍒欑兢鑺辨掓斁錛屽崟鍏冩祴璇曟鏋墮潪甯稿錛?/span>JUnit縐繪榪囨潵鐨?/span>CppUnit錛?/span>Boost::test錛?/span>CppTest錛?/span>CxxTest錛?/span> TUT絳夌瓑銆備絾鏄В鍐蟲柟妗堟渶濂界殑鏄?/span>CxxTest鍜?/span>TUT錛?/span>CxxTest閲囩敤鐨勬柟娉曟瘮杈冪壒孌婏紝鐢?/span>Perl鍒嗘瀽C++鐨勬簮鏂囦歡錛屼粠涓娊鍙栨祴璇曟柟娉曪紝鍒涘緩TestSuite銆傝娉曚笌JUnit闈炲父鐩鎬技錛屾病鏈変嬌鐢ㄩ珮綰х殑C++鐗規э紝涔熸病鏈夊畾涔夌壒鍒殑瀹忥紝鏃犻』鍐欓澶栫殑浠g爜銆?/span>TUT涔熸槸涓涓笉閿欑殑瑙e喅鏂規錛屽埄鐢ㄩ珮綰?/span>C++ Template鍔熻兘錛屽繀欏繪瘮杈冩柊鐨勭紪璇戝櫒鎵嶆敮鎸侊紝姣斿VC6鍜?/span>VS.NET 2002灝變笉鏀寔錛屽繀欏?/span>VS.NET 2003浠ヤ笂鎴栬?/span>Intel C++ Complier 8.1浠ヤ笂銆?/span>
1銆?nbsp;TUT
緇撴瀯妗嗘灦綆鍗曘傛坊鍔犳柊鐨勬祴璇曞伐浣滈噺灝忥紱鏃犻』娉ㄥ唽嫻嬭瘯錛涘彲縐繪鎬уソ錛堝洜鍏跺彧闇涓や釜澶存枃浠訛紝灝卞彲浠ュ畬鎴愭祴璇曞伐浣滐級錛涗究浜庤鍗革紱鎻愪緵鎺ュ彛鍙互鎵╁睍鍏惰緭鍑烘柟寮忕瓑銆?/span>
鏈澶х殑浼樼偣錛氳交閲忕駭錛屼究浜庤鍗稿拰鍙墿灞曞叾杈撳嚭鏂瑰紡錛?/span>
緙虹偣錛氭柇璦浼間箮涓嶆槸寰堝ソ錛屽彧鐢ㄤ簡涓涓?/span>ensure()鍑芥暟錛屼笉鐭ラ亾瀵瑰鏉傜殑嫻嬭瘯鏄惁鏀寔錛涜緭鍑虹殑嫻嬭瘯緇撴灉杈冧負綆鍗曘?/span>
2銆?nbsp;Boost::test
緇撴瀯妗嗘灦杈冧負澶嶆潅銆傛坊鍔犳柊鐨勬祴璇曞伐浣滈噺涔熶笉澶э紱鎻愪緵澶氱嫻嬭瘯鏂規硶錛屽彲娉ㄥ唽嫻嬭瘯鐢ㄤ緥錛屼篃鍙笉娉ㄥ唽錛涘彲縐繪鎬т竴鑸紱瑁呭嵏涓嶆槗錛涘湪鎺у埗寮傚父銆佸穿婧冩柟闈㈢殑鑳藉姏鑳滆繃鍏跺畠鎵鏈夊鎵嬶紱鎷ユ湁鑹ソ鐨勬柇璦鍔熻兘錛涘ぇ姒傝兘鏀寔澶氱杈撳嚭鏂瑰紡錛屼絾鏇存敼杈撳嚭鏂瑰紡涓嶆槗錛涙敮鎸佹祴璇曞浠躲?/span>
鏈澶х殑浼樼偣錛氭帶鍒跺紓甯稿穿婧冪殑鑳藉姏銆佽壇濂界殑鏂█銆佽緭鍑虹粨鏋滆緝涓鴻緇嗐佺紪鍐欐祴璇曠殑鏂規硶鐏墊椿錛?/span>
緙虹偣錛氱粨鏋勬鏋惰緝涓哄鏉傦紝鏇存敼杈撳嚭鏂瑰紡涓嶆槗錛岃鍗鎬笉鏄撱?/span>
3銆?nbsp;CXXTest
緇撴瀯妗嗘灦鐨勫鏉傛у浜?/span>TUT涓?/span>boost::test涔嬮棿銆傛坊鍔犳柊鐨勬祴璇曞伐浣滈噺闈炲父灝忥紱鏃犻』娉ㄥ唽嫻嬭瘯鐢ㄤ緥錛涘彲縐繪鎬у緢濂斤紱渚夸簬瑁呭嵏錛涙帶鍒跺紓甯搞佸穿婧冩柟闈㈢殑鑳藉姏涔熶笉閿欙紱鎷ユ湁鑹ソ鐨勬柇璦鍔熻兘錛涙敮鎸佸縐嶈緭鍑烘柟寮忥紱鏀寔嫻嬭瘯濂椾歡銆?/span>
鏈澶х殑浼樼偣錛?/span>緙栬瘧鍗蟲祴璇曟柟寮忥紝騫朵笖鍙互鍙屽嚮緇撴灉琛岀珛鍗沖畾浣嶅埌鐩稿簲鐨勬簮浠g爜錛岀浉褰撳惛寮曚漢錛涙敮鎸佸縐嶈緭鍑猴紝杈撳嚭緇撴灉杈冧負璇︾粏錛涚紪鍐欐祴璇曠畝鍗曪紱
緙虹偣錛氶渶瑕佺敤鍒?/span>perl瀵規祴璇曚唬鐮佽繘琛屾枃娉曟壂鎻忥紝鐢熸垚鍙墽琛屼唬鐮侊紝闇瑕佺敤鍒?/span>makefile鏂囦歡錛堜笉鏄繀欏伙級錛涘噯澶囧伐浣滄瘮杈冮夯鐑︺?/span>
http://www.gamesfromwithin.com/articles/0412/000061.html錛?/font>鍦ㄨ繖綃囨枃绔犱腑錛孨oel Llopis鎻愬嚭浜嗕竴涓C++ test framework璇勫垽鐨勪竴浜涗緷鎹紝鎸夌収Noel Llopis緇欏嚭鐨勯噸瑕佹э紝鎴戣妭鐣ュ湪榪欓噷銆?/p>
1.鍔犲叆鏂版祴璇曟渶灝忓寲宸ヤ綔閲?/p>
2.渚夸簬淇敼鍜岀Щ妞嶏紙浣滆呯殑鎰忔濇槸璇存瘮濡俁TTI錛孲TL錛孍xception榪欎簺楂樼駭鐗規у彲鑳藉Θ紕嶅湪涓嶅悓鐨勫鉤鍙幫紝涓嶅悓鐗堟湰緙栬瘧鍣ㄤ笅闈㈢殑鍙Щ妞嶆э級 3.渚夸簬瑁呴厤/鎷嗗嵏嫻嬭瘯鐜 4.瀵瑰紓甯鎬互鍙婂穿婧冨緢濂界殑鎺у埗 5.濂界殑鏂█鍔熻兘 6.鏀寔涓嶅悓鐨勮緭鍑烘柟寮?/p>
7.鏀寔嫻嬭瘯濂椾歡(suites) 鎸夌収榪欎釜鏍囧噯錛孨oel Llopis瀵逛笅闈㈢殑test framework榪涜浜嗚瘎浠?/p>
CPPUnit 1.宸ヤ綔閲忓 2.CPPUnit鑳藉湪Windows , Linux涓婇潰榪愯錛屽姛鑳借繘琛屼簡寰堝ソ鐨勬ā鍧楀寲錛屼絾鏄彟涓鏂歸潰錛孋PPUnit闇瑕丷TTI錛孲TL錛屾垨鑰呭紓甯革紙浣滆呬笉鏄緢鑲畾錛?/p>
3. 4.CPPUnit浣跨敤protectors鍖呰嫻嬭瘯錛屽茍涓旀崟鎹夋墍鏈夌殑寮傚父錛堝皾璇曡瘑鍒煇浜涘紓甯革級錛孡inux涓嬮潰涓嶄細鎹曟崏緋葷粺寮傚父錛屼絾鏄澧炲姞鑷畾涔夌殑鍖呰鏄緢瀹規槗鐨勩?/p>
5.寰堝ソ錛屾敮鎸佷竴涓渶灝忛泦鍚堢殑鏂█璇彞錛屽寘鎷瘮杈冩誕鐐規暟銆?/p>
6.鏀寔 7.鏀寔 鎬諱綋璇勪環錛歄verall, CppUnit is frustrating because it's almost exactly what I want, except for my most wanted feature. (CPPUnit澶熼椃鐨勶紝涓嶈繃鎴戣寰楁敼榪涙槗鐢ㄦу簲璇ュ彲浠ユ湡寰咃級 Boost.Test錛堟垜灝濊瘯浣跨敤錛屽湪VC.Net 2003涓嬮潰閬囧埌閾炬帴闂錛岃繕娌℃湁瑙e喅錛?/p>
1.鍩烘湰婊¤凍 2.鍜孋PPUnit綾諱技錛屼絾寮鴻皟鐨勬槸鏀逛唬鐮佺殑闅懼害浠ュ強渚濊禆Boost鏈韓 3.閬垮紑浜嗗父瑙勭殑setup/teardown緇撴瀯錛屽彲浠ヤ笉闇瑕佸姩鎬佺敓鎴恌ixture 瀵硅薄錛屽彲浠ュ皢fixture瀵硅薄鏀懼埌stack閲岄潰銆?/p>
4.Boost.Test鍦ㄨ繖鏂歸潰瓚呰繃浜嗘墍鏈夌殑鍏朵粬绔炰簤瀵規墜 5.Yes 6.澶ф鑳芥敮鎸侊紝浣嗘敼鍙樿緭鍑鴻繖浠朵簨鎯呭茍涓嶆槸寰堝鏄?/p>
7.鏀寔錛?..錛堣繖鍙ュ浣曠悊瑙o紵Yes, but with a big catch錛?/p>
Overall,Boost.Test is a library with a huge amount of potential. It has great support for exception handling and advanced assert statements. It also has other fairly unique functionality such as support for checking for infinite loops, and different levels of logging. On the other hand, it's very verbose to add new tests that are part of a suite, and it might be a bit heavy weight for game console environments. CppUnitLite(鐢變簬浣滆呮瘮杈冧簡涓涓浠栨敼鍔ㄧ殑鐗堟湰錛屾垜涓嶅啀鍏蟲敞錛?/p>
NanoCppUnit錛堣繖涓簱鐢氳嚦闇瑕佷綘鍘諱粠web pages涓婇潰copy浠g爜錛岀劧鍚庤嚜宸辨悶涓涓伐紼嬶紝鎴戣寰楁垜涓嶅お鍠滄榪欑鏂瑰紡鐨刾ackage鍙戝竷錛屾瘯绔燂紝鎴戝笇鏈涘皯鎿嶅績錛屾墍浠ユ垜涔熶笉鍏蟲敞錛?/p>
Unit++ 棣栧厛鎸囧嚭涓涓嫭鐗圭殑鐗規э細More C++ Like錛屼綔鑰呯殑鎰忔濇槸瀹冩病鏈変嬌鐢ㄥ畯錛岀殑紜紝鍓嶉潰鍑犵framework寮濮嬩竴涓祴璇曠殑鏃跺欓兘浣跨敤浜嗗畯錛岃繖鍦ㄨ澶欳++ Library涓槸鎯緥錛岀敤鏉ョ畝鍖栦竴浜涗唬鐮併傛垜浠氳繃浠庡熀綾葷戶鎵夸粠鑰屽垱寤烘祴璇曞寘錛屽綋鐒跺湪鍏朵粬framework閲岄潰鏈川涔熸槸榪欐牱錛屼絾鏄兘鏀懼湪騫曞悗榪涜錛屽畯鎺╃洊浜嗗叿浣撴儏鍐點?/p>
1.涓嶅ソ 2.涓鑸埇 3.涓嶆敮鎸?/p>
4.琛ㄧ幇騫沖潎 5.鏂囨。娌¤濡備綍鏀寔涓嶅悓鐨勮緭鍑?/p>
6.涓嶆敮鎸佹誕鐐規暟 7.鏀寔 CxxTest 棣栧厛浣滆呰涓烘枃妗f渶濂斤紙寰堥噸瑕侊紵錛夊彟澶栦綔鑰呮寚鍑?CxxTest鐨勪綔鑰匛rez Volk鎰忚瘑鍒版垜浠槸鍦ㄥ啓宸ュ叿甯姪嫻嬭瘯C++紼嬪簭錛屾墍浠ヤ笉蹇呭彈闄愪簬C++鐨勭壒寰併? 1.闈炲父濂?/p>
2.寰堝ソ 3.鏀寔 4.寰堝ソ 5.yes 6.yes 7.yes 鏂囩珷鏈鍚庣粰鍑轟竴涓患榪幫細鏄釜琛ㄧ幇濂界殑錛孋PPUnit, CppUnitLite, Boost.Test, CxxTest錛屼綔鑰呮湰浜哄枩嬈xxTest. (瀹?
]]>
鍏ㄩ潰浠嬬粛鍗曞厓嫻嬭瘯 錛嶈漿璐?/span>
榪欐槸涓綃囧叏闈粙緇嶅崟鍏冩祴璇曠殑緇忓吀涔嬩綔錛屽鐞嗚В鍗曞厓嫻嬭瘯鍜孷isual Unit寰堟湁甯姪錛屼綔鑰呰佺撼錛屾敹褰曟椂浣滀簡灝戦噺淇敼
涓銆鍗曞厓嫻嬭瘯姒傝堪
銆銆宸ュ巶鍦ㄧ粍瑁呬竴鍙扮數瑙嗘満涔嬪墠錛屼細瀵規瘡涓厓浠墮兘榪涜嫻嬭瘯錛岃繖錛屽氨鏄崟鍏冩祴璇曘?br>銆銆鍏跺疄鎴戜滑姣忓ぉ閮藉湪鍋氬崟鍏冩祴璇曘備綘鍐欎簡涓涓嚱鏁幫紝闄や簡鏋佺畝鍗曠殑澶栵紝鎬繪槸瑕佹墽琛屼竴涓嬶紝鐪嬬湅鍔熻兘鏄惁姝e父錛屾湁鏃惰繕瑕佹兂鍔炴硶杈撳嚭浜涙暟鎹紝濡傚脊鍑轟俊鎭獥鍙d粈涔堢殑錛岃繖錛屼篃鏄崟鍏冩祴璇曪紝鑰佺撼鎶婅繖縐嶅崟鍏冩祴璇曠О涓轟復鏃跺崟鍏冩祴璇曘傚彧榪涜浜嗕復鏃跺崟鍏冩祴璇曠殑杞歡錛岄拡瀵逛唬鐮佺殑嫻嬭瘯寰堜笉瀹屾暣錛屼唬鐮佽鐩栫巼瑕佽秴榪?0%閮藉緢鍥伴毦錛屾湭瑕嗙洊鐨勪唬鐮佸彲鑳介仐鐣欏ぇ閲忕殑緇嗗皬鐨勯敊璇紝榪欎簺閿欒榪樹細浜掔浉褰卞搷錛屽綋BUG鏆撮湶鍑烘潵鐨勬椂鍊欓毦浜庤皟璇曪紝澶у箙搴︽彁楂樺悗鏈熸祴璇曞拰緇存姢鎴愭湰錛屼篃闄嶄綆浜嗗紑鍙戝晢鐨勭珵浜夊姏銆傚彲浠ヨ錛岃繘琛屽厖鍒嗙殑鍗曞厓嫻嬭瘯錛屾槸鎻愰珮杞歡璐ㄩ噺錛岄檷浣庡紑鍙戞垚鏈殑蹇呯敱涔嬭礬銆?br>銆銆瀵逛簬紼嬪簭鍛樻潵璇達紝濡傛灉鍏繪垚浜嗗鑷繁鍐欑殑浠g爜榪涜鍗曞厓嫻嬭瘯鐨勪範鎯紝涓嶄絾鍙互鍐欏嚭楂樿川閲忕殑浠g爜錛岃屼笖榪樿兘鎻愰珮緙栫▼姘村鉤銆?br>銆銆瑕佽繘琛屽厖鍒嗙殑鍗曞厓嫻嬭瘯錛屽簲涓撻棬緙栧啓嫻嬭瘯浠g爜錛屽茍涓庝駭鍝佷唬鐮侀殧紱匯傝佺撼璁や負錛屾瘮杈冪畝鍗曠殑鍔炴硶鏄負浜у搧宸ョ▼寤虹珛瀵瑰簲鐨勬祴璇曞伐紼嬶紝涓烘瘡涓被寤虹珛瀵瑰簲鐨勬祴璇曠被錛屼負姣忎釜鍑芥暟錛堝緢綆鍗曠殑闄ゅ錛夊緩绔嬫祴璇曞嚱鏁般傞鍏堝氨鍑犱釜姒傚康璋堣皥鑰佺撼鐨勭湅娉曘?br>銆銆涓鑸涓猴紝鍦ㄧ粨鏋勫寲紼嬪簭鏃朵唬錛屽崟鍏冩祴璇曟墍璇寸殑鍗曞厓鏄寚鍑芥暟錛屽湪褰撲粖鐨勯潰鍚戝璞℃椂浠o紝鍗曞厓嫻嬭瘯鎵璇寸殑鍗曞厓鏄寚綾匯備互鑰佺撼鐨勫疄璺墊潵鐪嬶紝浠ョ被浣滀負嫻嬭瘯鍗曚綅錛屽鏉傚害楂橈紝鍙搷浣滄ц緝宸紝鍥犳浠嶇劧涓誨紶浠ュ嚱鏁頒綔涓哄崟鍏冩祴璇曠殑嫻嬭瘯鍗曚綅錛屼絾鍙互鐢ㄤ竴涓祴璇曠被鏉ョ粍緇囨煇涓被鐨勬墍鏈夋祴璇曞嚱鏁般傚崟鍏冩祴璇曚笉搴旇繃鍒嗗己璋冮潰鍚戝璞★紝鍥犱負灞閮ㄤ唬鐮佷緷鐒舵槸緇撴瀯鍖栫殑銆傚崟鍏冩祴璇曠殑宸ヤ綔閲忚緝澶э紝綆鍗曞疄鐢ㄩ珮鏁堟墠鏄‖閬撶悊銆?br>銆銆鏈変竴縐嶇湅娉曟槸錛屽彧嫻嬭瘯綾葷殑鎺ュ彛(鍏湁鍑芥暟)錛屼笉嫻嬭瘯鍏朵粬鍑芥暟錛屼粠闈㈠悜瀵硅薄瑙掑害鏉ョ湅錛岀‘瀹炴湁鍏墮亾鐞嗭紝浣嗘槸錛屾祴璇曠殑鐩殑鏄壘閿欏茍鏈緇堟帓閿欙紝鍥犳錛屽彧瑕佹槸鍖呭惈閿欒鐨勫彲鑳芥ц緝澶х殑鍑芥暟閮借嫻嬭瘯錛岃窡鍑芥暟鏄惁縐佹湁娌℃湁鍏崇郴銆傚浜嶤++鏉ヨ錛屽彲浠ョ敤涓縐嶇畝鍗曠殑鏂規硶鍖洪殧闇嫻嬭瘯鐨勫嚱鏁幫細綆鍗曠殑鍑芥暟濡傛暟鎹鍐欏嚱鏁扮殑瀹炵幇鍦ㄥご鏂囦歡涓紪鍐?inline鍑芥暟)錛屾墍鏈夊湪婧愭枃浠剁紪鍐欏疄鐜扮殑鍑芥暟閮借榪涜嫻嬭瘯(鏋勯犲嚱鏁板拰鏋愭瀯鍑芥暟闄ゅ)銆?br>銆銆浠涔堟椂鍊欐祴璇曪紵鍗曞厓嫻嬭瘯瓚婃棭瓚婂ソ錛屾棭鍒頒粈涔堢▼搴︼紵XP寮鍙戠悊璁鴻絀禩DD錛屽嵆嫻嬭瘯椹卞姩寮鍙戯紝鍏堢紪鍐欐祴璇曚唬鐮侊紝鍐嶈繘琛屽紑鍙戙傚湪瀹為檯鐨勫伐浣滀腑錛屽彲浠ヤ笉蹇呰繃鍒嗗己璋冨厛浠涔堝悗浠涔堬紝閲嶈鐨勬槸楂樻晥鍜屾劅瑙夎垝閫傘備粠鑰佺撼鐨勭粡楠屾潵鐪嬶紝鍏堢紪鍐欎駭鍝佸嚱鏁扮殑妗嗘灦錛岀劧鍚庣紪鍐欐祴璇曞嚱鏁幫紝閽堝浜у搧鍑芥暟鐨勫姛鑳界紪鍐欐祴璇曠敤渚嬶紝鐒跺悗緙栧啓浜у搧鍑芥暟鐨勪唬鐮侊紝姣忓啓涓涓姛鑳界偣閮借繍琛屾祴璇曪紝闅忔椂琛ュ厖嫻嬭瘯鐢ㄤ緥銆傛墍璋撳厛緙栧啓浜у搧鍑芥暟鐨勬鏋訛紝鏄寚鍏堢紪鍐欏嚱鏁扮┖鐨勫疄鐜幫紝鏈夎繑鍥炲肩殑闅忎究榪斿洖涓涓鹼紝緙栬瘧閫氳繃鍚庡啀緙栧啓嫻嬭瘯浠g爜錛岃繖鏃訛紝鍑芥暟鍚嶃佸弬鏁拌〃銆佽繑鍥炵被鍨嬮兘搴旇紜畾涓嬫潵浜嗭紝鎵緙栧啓鐨勬祴璇曚唬鐮佷互鍚庨渶淇敼鐨勫彲鑳芥ф瘮杈冨皬銆?br>銆銆鐢辮皝嫻嬭瘯錛熷崟鍏冩祴璇曚笌鍏朵粬嫻嬭瘯涓嶅悓錛屽崟鍏冩祴璇曞彲鐪嬩綔鏄紪鐮佸伐浣滅殑涓閮ㄥ垎錛屽簲璇ョ敱紼嬪簭鍛樺畬鎴愶紝涔熷氨鏄錛岀粡榪囦簡鍗曞厓嫻嬭瘯鐨勪唬鐮佹墠鏄凡瀹屾垚鐨勪唬鐮侊紝鎻愪氦浜у搧浠g爜鏃朵篃瑕佸悓鏃舵彁浜ゆ祴璇曚唬鐮併傛祴璇曢儴闂ㄥ彲浠ヤ綔涓瀹氱▼搴︾殑瀹℃牳銆?br>銆銆鍏充簬妗╀唬鐮侊紝鑰佺撼璁や負錛屽崟鍏冩祴璇曞簲閬垮厤緙栧啓妗╀唬鐮併傛々浠g爜灝辨槸鐢ㄦ潵浠f浛鏌愪簺浠g爜鐨勪唬鐮侊紝渚嬪錛屼駭鍝佸嚱鏁版垨嫻嬭瘯鍑芥暟璋冪敤浜嗕竴涓湭緙栧啓鐨勫嚱鏁幫紝鍙互緙栧啓妗╁嚱鏁版潵浠f浛璇ヨ璋冪敤鐨勫嚱鏁幫紝妗╀唬鐮佷篃鐢ㄤ簬瀹炵幇嫻嬭瘯闅旂銆傞噰鐢ㄧ敱搴曞悜涓婄殑鏂瑰紡榪涜寮鍙戯紝搴曞眰鐨勪唬鐮佸厛寮鍙戝茍鍏堟祴璇曪紝鍙互閬垮厤緙栧啓妗╀唬鐮侊紝榪欐牱鍋氱殑濂藉鏈夛細鍑忓皯浜嗗伐浣滈噺錛涙祴璇曚笂灞傚嚱鏁版椂錛屼篃鏄涓嬪眰鍑芥暟鐨勯棿鎺ユ祴璇曪紱褰撲笅灞傚嚱鏁頒慨鏀規椂錛岄氳繃鍥炲綊嫻嬭瘯鍙互紜淇敼鏄惁瀵艱嚧涓婂眰鍑芥暟浜х敓閿欒銆?br>
浜屻嫻嬭瘯浠g爜緙栧啓
銆銆澶氭暟璁茶堪鍗曞厓嫻嬭瘯鐨勬枃绔犻兘鏄互Java涓轟緥錛屾湰鏂囦互C++涓轟緥錛屽悗鍗婇儴鍒嗘墍浠嬬粛鐨勫崟鍏冩祴璇曞伐鍏蜂篃鍙粙緇岰++鍗曞厓嫻嬭瘯宸ュ叿銆備笅闈㈢殑紺轟緥浠g爜鐨勫紑鍙戠幆澧冩槸VC6.0銆?br>
浜у搧綾伙細
class CMyClass
{
public:
int Add(int i, int j);
CMyClass();
virtual ~CMyClass();
private:
int mAge; //騫撮緞
CString mPhase; //騫撮緞闃舵錛屽"灝戝勾"錛?闈掑勾"
};
寤虹珛瀵瑰簲鐨勬祴璇曠被CMyClassTester錛屼負浜嗚妭綰︾紪騫咃紝鍙垪鍑烘簮鏂囦歡鐨勪唬鐮侊細
void CMyClassTester::CaseBegin()
{
//pObj鏄疌MyClassTester綾葷殑鎴愬憳鍙橀噺錛屾槸琚祴璇曠被鐨勫璞$殑鎸囬拡錛?br> //涓烘眰綆鍗曪紝鎵鏈夌殑嫻嬭瘯綾婚兘鍙互鐢╬Obj鍛藉悕琚祴璇曞璞$殑鎸囬拡銆?br> pObj = new CMyClass();
}
void CMyClassTester::CaseEnd()
{
delete pObj;
}
嫻嬭瘯綾葷殑鍑芥暟CaseBegin()鍜孋aseEnd()寤虹珛鍜岄攢姣佽嫻嬭瘯瀵硅薄錛屾瘡涓祴璇曠敤渚嬬殑寮澶撮兘瑕佽皟鐢–aseBegin()錛岀粨灝鵑兘瑕佽皟鐢–aseEnd()銆?br>
鎺ヤ笅鏉ワ紝鎴戜滑寤虹珛紺轟緥鐨勪駭鍝佸嚱鏁幫細
int CMyClass::Add(int i, int j)
{
return i+j;
}
鍜屽搴旂殑嫻嬭瘯鍑芥暟錛?br>void CMyClassTester::Add_int_int()
{
}
鎶婂弬鏁拌〃浣滀負鍑芥暟鍚嶇殑涓閮ㄥ垎錛岃繖鏍峰綋鍑虹幇閲嶈澆鐨勮嫻嬭瘯鍑芥暟鏃訛紝嫻嬭瘯鍑芥暟涓嶄細浜х敓鍛藉悕鍐茬獊銆備笅闈㈡坊鍔犳祴璇曠敤渚嬶細
void CMyClassTester::Add_int_int()
{
//絎竴涓祴璇曠敤渚?br> CaseBegin();{ //1
int i = 0; //2
int j = 0; //3
int ret = pObj->Add(i, j); //4
ASSERT(ret == 0); //5
}CaseEnd(); //6
}
絎?鍜岀6琛屽緩绔嬪拰閿姣佽嫻嬭瘯瀵硅薄錛屾墍鍔犵殑{}鏄負浜嗚姣忎釜嫻嬭瘯鐢ㄤ緥鐨勪唬鐮佹湁涓涓嫭绔嬬殑鍩燂紝浠ヤ究澶氫釜嫻嬭瘯鐢ㄤ緥浣跨敤鐩稿悓鐨勫彉閲忓悕銆?br>絎?鍜岀3琛屾槸瀹氫箟杈撳叆鏁版嵁錛岀4琛屾槸璋冪敤琚祴璇曞嚱鏁幫紝榪欎簺瀹規槗鐞嗚В錛屼笉浣滆繘涓姝ヨВ閲娿傜5琛屾槸棰勬湡杈撳嚭錛屽畠鐨勭壒鐐規槸褰撳疄闄呰緭鍑轟笌棰勬湡杈撳嚭涓嶅悓鏃惰嚜鍔ㄦ姤閿欙紝ASSERT鏄疺C鐨勬柇璦瀹忥紝涔熷彲浠ヤ嬌鐢ㄥ叾浠栫被浼煎姛鑳界殑瀹忥紝浣跨敤嫻嬭瘯宸ュ叿榪涜鍗曞厓嫻嬭瘯鏃訛紝鍙互浣跨敤璇ュ伐鍏峰畾涔夌殑鏂█瀹忋?br>
銆銆紺轟緥涓殑鏍煎紡鏄懼緱寰堜笉綆媧侊紝2銆侊紦銆?銆?琛屽彲浠ュ悎鍐欎負涓琛岋細ASSERT(pObj->Add(0, 0) == 0);浣嗚繖縐嶄笉綆媧佺殑鏍煎紡鍗存槸鑰佺撼鏋佸姏鎺ㄨ崘鐨勶紝鍥犱負瀹冧竴鐩簡鐒訛紝鏄撲簬寤虹珛澶氫釜嫻嬭瘯鐢ㄤ緥錛屽茍涓斿叿鏈夊緢濂界殑閫傚簲鎬э紝鍚屾椂錛屼篃鏄瀬浣崇殑浠g爜鏂囨。錛屾諱箣錛岃佺撼寤鴻錛氳緭鍏ユ暟鎹拰棰勬湡杈撳嚭瑕佽嚜鎴愪竴鍧椼?br>銆銆寤虹珛浜嗙涓涓祴璇曠敤渚嬪悗錛屽簲緙栬瘧騫惰繍琛屾祴璇曪紝浠ユ帓闄よ娉曢敊璇紝鐒跺悗錛屼嬌鐢ㄦ嫹璐?淇敼鐨勫姙娉曞緩绔嬪叾浠栨祴璇曠敤渚嬨傜敱浜庡悇涓祴璇曠敤渚嬩箣闂寸殑宸埆寰寰寰堝皬錛岄氬父鍙渶淇敼涓涓や釜鏁版嵁錛屾嫹璐?淇敼鏄緩绔嬪涓祴璇曠敤渚嬬殑鏈蹇嵎鍔炴硶銆?br>
涓夈嫻嬭瘯鐢ㄤ緥
銆銆涓嬮潰璇磋嫻嬭瘯鐢ㄤ緥銆佽緭鍏ユ暟鎹強棰勬湡杈撳嚭銆傝緭鍏ユ暟鎹槸嫻嬭瘯鐢ㄤ緥鐨勬牳蹇冿紝鑰佺撼瀵硅緭鍏ユ暟鎹殑瀹氫箟鏄細琚祴璇曞嚱鏁版墍璇誨彇鐨勫閮ㄦ暟鎹強榪欎簺鏁版嵁鐨勫垵濮嬪箋傚閮ㄦ暟鎹槸瀵逛簬琚祴璇曞嚱鏁版潵璇寸殑錛屽疄闄呬笂灝辨槸闄や簡灞閮ㄥ彉閲忎互澶栫殑鍏朵粬鏁版嵁錛岃佺撼鎶婅繖浜涙暟鎹垎涓哄嚑綾伙細鍙傛暟銆佹垚鍛樺彉閲忋佸叏灞鍙橀噺銆両O濯掍綋銆侷O濯掍綋鏄寚鏂囦歡銆佹暟鎹簱鎴栧叾浠栧偍瀛樻垨浼犺緭鏁版嵁鐨勫獟浣擄紝渚嬪錛岃嫻嬭瘯鍑芥暟瑕佷粠鏂囦歡鎴栨暟鎹簱璇誨彇鏁版嵁錛岄偅涔堬紝鏂囦歡鎴栨暟鎹簱涓殑鍘熷鏁版嵁涔熷睘浜庤緭鍏ユ暟鎹備竴涓嚱鏁版棤璁哄澶嶆潅錛岄兘鏃犻潪鏄榪欏嚑綾繪暟鎹殑璇誨彇銆佽綆楀拰鍐欏叆銆傞鏈熻緭鍑烘槸鎸囷細榪斿洖鍊煎強琚祴璇曞嚱鏁版墍鍐欏叆鐨勫閮ㄦ暟鎹殑緇撴灉鍊箋傝繑鍥炲煎氨涓嶇敤璇翠簡錛岃嫻嬭瘯鍑芥暟榪涜浜嗗啓鎿嶄綔鐨勫弬鏁?杈撳嚭鍙傛暟)銆佹垚鍛樺彉閲忋佸叏灞鍙橀噺銆両O濯掍綋錛屽畠浠殑棰勬湡鐨勭粨鏋滃奸兘鏄鏈熻緭鍑恒備竴涓祴璇曠敤渚嬶紝灝辨槸璁懼畾杈撳叆鏁版嵁錛岃繍琛岃嫻嬭瘯鍑芥暟錛岀劧鍚庡垽鏂疄闄呰緭鍑烘槸鍚︾鍚堥鏈熴備笅闈婦涓涓笌鎴愬憳鍙橀噺鏈夊叧鐨勪緥瀛愶細
浜у搧鍑芥暟錛?br>void CMyClass::Grow(int years)
{
mAge += years;
if(mAge < 10)
mPhase = "鍎跨";
else if(mAge <20)
mPhase = "灝戝勾";
else if(mAge <45)
mPhase = "闈掑勾";
else if(mAge <60)
mPhase = "涓勾";
else
mPhase = "鑰佸勾";
}
嫻嬭瘯鍑芥暟涓殑涓涓祴璇曠敤渚嬶細
CaseBegin();{
int years = 1;
pObj->mAge = 8;
pObj->Grow(years);
ASSERT( pObj->mAge == 9 );
ASSERT( pObj->mPhase == "鍎跨" );
}CaseEnd();
鍦ㄨ緭鍏ユ暟鎹腑瀵硅嫻嬭瘯綾葷殑鎴愬憳鍙橀噺mAge榪涜璧嬪鹼紝鍦ㄩ鏈熻緭鍑轟腑鏂█鎴愬憳鍙橀噺鐨勫箋傜幇鍦ㄥ彲浠ョ湅鍒拌佺撼鎵鎺ㄨ崘鐨勬牸寮忕殑濂藉浜嗗惂錛岃繖縐嶆牸寮忓彲浠ラ傚簲寰堝鏉傜殑嫻嬭瘯銆傚湪杈撳叆鏁版嵁閮ㄥ垎榪樺彲浠ヨ皟鐢ㄥ叾浠栨垚鍛樺嚱鏁幫紝渚嬪錛氭墽琛岃嫻嬭瘯鍑芥暟鍓嶅彲鑳介渶瑕佽鍙栨枃浠朵腑鐨勬暟鎹繚瀛樺埌鎴愬憳鍙橀噺錛屾垨闇瑕佽繛鎺ユ暟鎹簱錛岃佺撼鎶婅繖浜涙搷浣滅О涓哄垵濮嬪寲鎿嶄綔銆備緥濡傦紝涓婁緥涓?ASSERT( ...)涔嬪墠鍙互鍔爌Obj->OpenFile();銆備負浜嗚闂鏈夋垚鍛橈紝鍙互灝嗘祴璇曠被瀹氫箟涓轟駭鍝佺被鐨勫弸鍏冪被銆備緥濡傦紝瀹氫箟涓涓畯錛?br>#define UNIT_TEST(cls) friend class cls##Tester;
鐒跺悗鍦ㄤ駭鍝佺被澹版槑涓姞涓琛屼唬鐮侊細UNIT_TEST(ClassName)銆?br>
銆銆涓嬮潰璋堣皥嫻嬭瘯鐢ㄤ緥璁捐銆傚墠闈㈠凡緇忚浜嗭紝嫻嬭瘯鐢ㄤ緥鐨勬牳蹇冩槸杈撳叆鏁版嵁銆傞鏈熻緭鍑烘槸渚濇嵁杈撳叆鏁版嵁鍜岀▼搴忓姛鑳芥潵紜畾鐨勶紝涔熷氨鏄錛屽浜庢煇涓紼嬪簭錛岃緭鍏ユ暟鎹‘瀹氫簡錛岄鏈熻緭鍑轟篃灝卞彲浠ョ‘瀹氫簡錛岃嚦浜庣敓鎴?閿姣佽嫻嬭瘯瀵硅薄鍜岃繍琛屾祴璇曠殑璇彞錛屾槸鎵鏈夋祴璇曠敤渚嬮兘澶у悓灝忓紓鐨勶紝鍥犳錛屾垜浠璁烘祴璇曠敤渚嬫椂錛屽彧璁ㄨ杈撳叆鏁版嵁銆?br>銆銆鍓嶉潰璇磋繃錛岃緭鍏ユ暟鎹寘鎷洓綾伙細鍙傛暟銆佹垚鍛樺彉閲忋佸叏灞鍙橀噺銆両O濯掍綋錛岃繖鍥涚被鏁版嵁涓紝鍙鎵嫻嬭瘯鐨勭▼搴忛渶瑕佹墽琛岃鎿嶄綔鐨勶紝灝辮璁懼畾鍏跺垵濮嬪鹼紝鍏朵腑錛屽墠涓ょ被姣旇緝甯哥敤錛屽悗涓ょ被杈冨皯鐢ㄣ傛樉鐒訛紝鎶婅緭鍏ユ暟鎹殑鎵鏈夊彲鑳藉彇鍊奸兘榪涜嫻嬭瘯錛屾槸涓嶅彲鑳戒篃鏄棤鎰忎箟鐨勶紝鎴戜滑搴旇鐢ㄤ竴瀹氱殑瑙勫垯閫夋嫨鏈変唬琛ㄦх殑鏁版嵁浣滀負杈撳叆鏁版嵁錛屼富瑕佹湁涓夌錛氭甯歌緭鍏ワ紝杈圭晫杈撳叆錛岄潪娉曡緭鍏ワ紝姣忕杈撳叆榪樺彲浠ュ垎綾伙紝涔熷氨鏄鉤甯歌鐨勭瓑浠風被娉曪紝姣忕被鍙栦竴涓暟鎹綔涓鴻緭鍏ユ暟鎹紝濡傛灉嫻嬭瘯閫氳繃錛屽彲浠ヨ偗瀹氬悓綾葷殑鍏朵粬杈撳叆涔熸槸鍙互閫氳繃鐨勩備笅闈婦渚嬭鏄庯細
銆銆姝e父杈撳叆
銆銆渚嬪瀛楃涓茬殑Trim鍑芥暟錛屽姛鑳芥槸灝嗗瓧絎︿覆鍓嶅悗鐨勭┖鏍煎幓闄わ紝閭d箞姝e父鐨勮緭鍏ュ彲浠ユ湁鍥涚被錛氬墠闈㈡湁絀烘牸錛涘悗闈㈡湁絀烘牸錛涘墠鍚庡潎鏈夌┖鏍鹼紱鍓嶅悗鍧囨棤絀烘牸銆?br>銆銆杈圭晫杈撳叆
銆銆涓婁緥涓┖瀛楃涓插彲浠ョ湅浣滄槸杈圭晫杈撳叆銆?br>銆銆鍐嶅涓涓〃紺哄勾榫勭殑鍙傛暟錛屽畠鐨勬湁鏁堣寖鍥存槸0-100錛岄偅涔堣竟鐣岃緭鍏ユ湁涓や釜錛?鍜?00銆?br>銆銆闈炴硶杈撳叆
銆銆闈炴硶杈撳叆鏄甯稿彇鍊艱寖鍥翠互澶栫殑鏁版嵁錛屾垨浣夸唬鐮佷笉鑳藉畬鎴愭甯稿姛鑳界殑杈撳叆錛屽涓婁緥涓〃紺哄勾榫勭殑鍙傛暟錛屽皬浜?鎴栧ぇ浜?00閮芥槸闈炴硶杈撳叆錛屽啀濡備竴涓繘琛屾枃浠舵搷浣滅殑鍑芥暟錛岄潪娉曡緭鍏ユ湁榪欎箞鍑犵被錛氭枃浠朵笉瀛樺湪錛涚洰褰曚笉瀛樺湪錛涙枃浠舵鍦ㄨ鍏朵粬紼嬪簭鎵撳紑錛涙潈闄愰敊璇?br>銆銆濡傛灉鍑芥暟浣跨敤浜嗗閮ㄦ暟鎹紝鍒欐甯歌緭鍏ユ槸鑲畾浼氭湁鐨勶紝鑰岃竟鐣岃緭鍏ュ拰闈炴硶杈撳叆涓嶆槸鎵鏈夊嚱鏁伴兘鏈夈備竴鑸儏鍐典笅錛屽嵆浣挎病鏈夎璁℃枃妗o紝鑰冭檻浠ヤ笂涓夌杈撳叆涔熷彲浠ユ壘鍑哄嚱鏁扮殑鍩烘湰鍔熻兘鐐廣傚疄闄呬笂錛屽崟鍏冩祴璇曚笌浠g爜緙栧啓鏄?#8220;涓浣撲袱闈?#8221;鐨勫叧緋伙紝緙栫爜鏃跺涓婅堪涓夌杈撳叆閮芥槸蹇呴』鑰冭檻鐨勶紝鍚﹀垯浠g爜鐨勫仴澹у氨浼氭垚闂銆?br>
鍥涖鐧界洅瑕嗙洊
銆銆涓婇潰鎵璇寸殑嫻嬭瘯鏁版嵁閮芥槸閽堝紼嬪簭鐨勫姛鑳芥潵璁捐鐨勶紝灝辨槸鎵璋撶殑榛戠洅嫻嬭瘯銆傚崟鍏冩祴璇曡繕闇瑕佷粠鍙︿竴涓搴︽潵璁捐嫻嬭瘯鏁版嵁錛屽嵆閽堝紼嬪簭鐨勯昏緫緇撴瀯鏉ヨ璁℃祴璇曠敤渚嬶紝灝辨槸鎵璋撶殑鐧界洅嫻嬭瘯銆傚湪鑰佺撼鐪嬫潵錛屽鏋滈粦鐩掓祴璇曟槸瓚沖鍏呭垎鐨勶紝閭d箞鐧界洅嫻嬭瘯灝辨病鏈夊繀瑕侊紝鍙儨“瓚沖鍏呭垎”鍙槸涓縐嶇悊鎯崇姸鎬侊紝渚嬪錛氱湡鐨勬槸鎵鏈夊姛鑳界偣閮芥祴璇曚簡鍚楋紵紼嬪簭鐨勫姛鑳界偣鏄漢涓虹殑瀹氫箟錛屽父甯告槸涓嶅叏闈㈢殑錛涘悇涓緭鍏ユ暟鎹箣闂達紝鏈変簺緇勫悎鍙兘浼氫駭鐢熼棶棰橈紝鎬庢牱淇濊瘉榪欎簺緇勫悎閮界粡榪囦簡嫻嬭瘯錛熼毦浜庤 閲忔祴璇曠殑瀹屾暣鎬ф槸榛戠洅嫻嬭瘯鐨勪富瑕佺己闄鳳紝鑰岀櫧鐩掓祴璇曟伆鎭板叿鏈夋槗浜庤 閲忔祴璇曞畬鏁存х殑浼樼偣錛屼袱鑰呬箣闂村叿鏈夋瀬濂界殑浜掕ˉ鎬э紝渚嬪錛氬畬鎴愬姛鑳芥祴璇曞悗緇熻璇彞瑕嗙洊鐜囷紝濡傛灉璇彞瑕嗙洊鏈畬鎴愶紝寰堝彲鑳芥槸鏈鐩栫殑璇彞鎵瀵瑰簲鐨勫姛鑳界偣鏈祴璇曘?br>銆銆鐧界洅嫻嬭瘯閽堝紼嬪簭鐨勯昏緫緇撴瀯璁捐嫻嬭瘯鐢ㄤ緥錛岀敤閫昏緫瑕嗙洊鐜囨潵琛¢噺嫻嬭瘯鐨勫畬鏁存с傞昏緫鍗曚綅涓昏鏈夛細璇彞銆佸垎鏀佹潯浠躲佹潯浠跺箋佹潯浠跺肩粍鍚堬紝璺緞銆傝鍙ヨ鐩栧氨鏄鐩栨墍鏈夌殑璇彞錛屽叾浠栫被鎺ㄣ傚彟澶栬繕鏈変竴縐嶅垽瀹氭潯浠惰鐩栵紝鍏跺疄鏄垎鏀鐩栦笌鏉′歡瑕嗙洊鐨勭粍鍚堬紝鍦ㄦ涓嶄綔璁ㄨ銆傝窡鏉′歡鏈夊叧鐨勮鐩栧氨鏈変笁縐嶏紝瑙i噴涓涓嬶細鏉′歡瑕嗙洊鏄寚瑕嗙洊鎵鏈夌殑鏉′歡琛ㄨ揪寮忥紝鍗蟲墍鏈夌殑鏉′歡琛ㄨ揪寮忛兘鑷沖皯璁$畻涓嬈★紝涓嶈冭檻璁$畻緇撴灉錛涙潯浠跺艱鐩栨槸鎸囪鐩栨潯浠剁殑鎵鏈夊彲鑳藉彇鍊鹼紝鍗蟲瘡涓潯浠剁殑鍙栫湡鍊煎拰鍙栧亣鍊奸兘瑕佽嚦灝戣綆椾竴嬈★紱鏉′歡鍊肩粍鍚堣鐩栨槸鎸囪鐩栨墍鏈夋潯浠跺彇鍊肩殑鎵鏈夊彲鑳界粍鍚堛傝佺撼鍋氳繃涓浜涚矖嫻呯殑鐮旂┒錛屽彂鐜頒笌鏉′歡鐩存帴鏈夊叧鐨勯敊璇富瑕佹槸閫昏緫鎿嶄綔絎﹂敊璇紝渚嬪錛殀|鍐欐垚&&錛屾紡浜嗗啓!浠涔堢殑錛岄噰鐢ㄥ垎鏀鐩栦笌鏉′歡瑕嗙洊鐨勭粍鍚堬紝鍩烘湰涓婂彲浠ュ彂鐜拌繖浜涢敊璇紝鍙︿竴鏂歸潰錛屾潯浠跺艱鐩栦笌鏉′歡鍊肩粍鍚堣鐩栧線寰闇瑕佸ぇ閲忕殑嫻嬭瘯鐢ㄤ緥錛屽洜姝わ紝鍦ㄨ佺撼鐪嬫潵錛屾潯浠跺艱鐩栧拰鏉′歡鍊肩粍鍚堣鐩栫殑鏁堣垂姣斿亸浣庛傝佺撼璁や負鏁堣垂姣旇緝楂樹笖瀹屾暣鎬т篃瓚沖鐨勬祴璇曡姹傛槸榪欐牱鐨勶細瀹屾垚鍔熻兘嫻嬭瘯錛屽畬鎴愯鍙ヨ鐩栥佹潯浠惰鐩栥佸垎鏀鐩栥佽礬寰勮鐩栥傚仛榪囧崟鍏冩祴璇曠殑鏈嬪弸鎭愭曚細瀵硅佺撼鎻愬嚭鐨勬祴璇曡姹傜粰浜堜竴涓瓧鐨勮瘎浠鳳細鏅曪紒鎴栬呬袱涓瓧鐨勮瘎浠鳳細鐙傛檿錛佸洜涓鴻繖浼間箮鏄笉鍙兘鐨勮姹傦紝瑕佽揪鍒拌繖縐嶆祴璇曞畬鏁存э紝鍏舵祴璇曟垚鏈槸涓嶅彲鎯寵薄鐨勶紝涓嶈繃錛屽嚭瀹朵漢涓嶆墦閫涜錛岃佺撼涔嬫墍浠ユ彁鍑鴻繖縐嶆祴璇曡姹傦紝鏄洜涓哄埄鐢ㄤ竴浜涘伐鍏鳳紝鍙互鍦ㄨ緝浣庣殑鎴愭湰涓嬭揪鍒拌繖縐嶆祴璇曡姹傦紝鍚庨潰灝嗕細浣滆繘涓姝ヤ粙緇嶃?br>銆銆鍏充簬鐧界洅嫻嬭瘯鐢ㄤ緥鐨勮璁★紝紼嬪簭嫻嬭瘯棰嗗煙鐨勪功綾嶄竴鑸兘鏈夎榪幫紝鏅氭柟娉曟槸鐢誨嚭紼嬪簭鐨勯昏緫緇撴瀯鍥懼紼嬪簭嫻佺▼鍥炬垨鎺у埗嫻佸浘錛屾牴鎹昏緫緇撴瀯鍥捐璁℃祴璇曠敤渚嬶紝榪欎簺鏄函綺圭殑鐧界洅嫻嬭瘯錛屼笉鏄佺撼鎯蟲帹鑽愮殑鏂瑰紡銆傝佺撼鎵鎺ㄨ崘鐨勬柟娉曟槸錛氬厛瀹屾垚榛戠洅嫻嬭瘯錛岀劧鍚庣粺璁$櫧鐩掕鐩栫巼錛岄拡瀵規湭瑕嗙洊鐨勯昏緫鍗曚綅璁捐嫻嬭瘯鐢ㄤ緥瑕嗙洊瀹冿紝渚嬪錛屽厛媯鏌ユ槸鍚︽湁璇彞鏈鐩栵紝鏈夌殑璇濊璁℃祴璇曠敤渚嬭鐩栧畠錛岀劧鍚庣敤鍚屾牱鏂規硶瀹屾垚鏉′歡瑕嗙洊銆佸垎鏀鐩栧拰璺緞瑕嗙洊錛岃繖鏍風殑璇濓紝鏃㈡楠屼簡榛戠洅嫻嬭瘯鐨勫畬鏁存э紝鍙堥伩鍏嶄簡閲嶅鐨勫伐浣滐紝鐢ㄨ緝灝戠殑鏃墮棿鎴愭湰杈懼埌闈炲父楂樼殑嫻嬭瘯瀹屾暣鎬с備笉榪囷紝榪欎簺宸ヤ綔鍙笉鏄墜宸ヨ兘瀹屾垚鐨勶紝蹇呴』鍊熷姪浜庡伐鍏鳳紝鍚庨潰浼氫粙緇嶅彲浠ュ畬鎴愯繖浜涘伐浣滅殑嫻嬭瘯宸ュ叿銆?br>
浜斻鍗曞厓嫻嬭瘯宸ュ叿
銆銆鐜板湪寮濮嬩粙緇嶅崟鍏冩祴璇曞伐鍏鳳紝鑰佺撼鍙粙緇嶄笁縐嶏紝閮芥槸鐢ㄤ簬C++璇█鐨勩?br>銆銆棣栧厛鏄疌ppUnit錛岃繖鏄疌++鍗曞厓嫻嬭瘯宸ュ叿鐨勯薊紲栵紝鍏嶈垂鐨勫紑婧愮殑鍗曞厓嫻嬭瘯妗嗘灦銆傜敱浜庡凡鏈変竴浼楅珮浜哄啓浜嗕笉灝戝叧浜嶤ppUnit鐨勫緢濂界殑鏂囩珷錛岃佺撼灝變笉鐜頒笐浜嗭紝鎯充簡瑙ppUnit鐨勬湅鍙嬶紝寤鴻璇諱竴涓婥pluser 鎵浣滅殑銆奀ppUnit嫻嬭瘯妗嗘灦鍏ラ棬銆嬶紝緗戝潃鏄細http://blog.csdn.net/cpluser/archive/2004/09/21/111522.aspx銆傝鏂囦篃鎻愪緵浜咰ppUnit鐨勪笅杞藉湴鍧銆?br>銆銆鐒跺悗浠嬬粛C++Test錛岃繖鏄疨arasoft鍏徃鐨勪駭鍝併傦薊C++Test鏄竴涓姛鑳藉己澶х殑鑷姩鍖朇/C++鍗曞厓綰ф祴璇曞伐鍏鳳紝鍙互鑷姩嫻嬭瘯浠諱綍C/C++鍑芥暟銆佺被錛岃嚜鍔ㄧ敓鎴愭祴璇曠敤渚嬨佹祴璇曢┍鍔ㄥ嚱鏁版垨妗╁嚱鏁幫紝鍦ㄨ嚜鍔ㄥ寲鐨勭幆澧冧笅鏋佸叾瀹規槗蹇熺殑灝嗗崟鍏冪駭鐨勬祴璇曡鐩栫巼杈懼埌100%銆?/font>榪欐槸鍗庡攼鍏徃鐨勭綉欏典笂鐨勪粙緇嶃傝佺撼鎯沖啓浜涗粙緇岰++Test鐨勬枃瀛楋紝浣嗗彂鐜版棤娉曡秴瓚婂崕鍞愬叕鍙哥殑緗戦〉涓婄殑浠嬬粛錛屾墍浠ヤ篃灝辯渷鐐逛簨浜嗭紝鎯充簡瑙++Test鐨勬湅鍙嬶紝寤鴻璁塊棶璇ュ叕鍙哥殑緗戠珯銆傚崕鍞愬叕鍙鎬唬鐞咰++Test錛屾兂瑕佽喘涔版垨绱㈠彇鎶ヤ環銆佽瘯鐢ㄧ増閮藉彲浠ユ壘浠栦滑銆傝佺撼甯崕鍞愬叕鍙稿仛騫垮憡錛屼笉鐭ラ亾浼氫笉浼氬緱鐐逛粈涔堝ソ澶勶紵
銆銆鏈鍚庝粙緇峍isual Unit錛岀畝縐癡U錛岃繖鏄浗浜х殑鍗曞厓嫻嬭瘯宸ュ叿錛屾嵁璇寸敵璇蜂簡澶氶」涓撳埄錛屾嫢鏈変竴鎵瑰垱鏂扮殑鎶鏈紝涓嶈繃鑰佺撼鍙叧蹇冩槸涓嶆槸鏈夌敤鍜屽ソ鐢ㄣ傦薊鑷姩鐢熸垚嫻嬭瘯浠g爜 蹇熷緩绔嬪姛鑳芥祴璇曠敤渚?紼嬪簭琛屼負涓鐩簡鐒?鏋侀珮鐨勬祴璇曞畬鏁存?楂樻晥瀹屾垚鐧界洅瑕嗙洊 蹇熸帓閿?楂樻晥璋冭瘯 璇﹀敖鐨勬祴璇曟姤鍛婏冀銆傦薊錛藉唴鐨勬枃瀛楁槸VU寮鍙戝晢鐨勭綉欏典笂鎽樺綍鐨勶紝緗戝潃鏄細http://www.unitware.cn銆傚墠闈㈡墍榪版祴璇曡姹傦細瀹屾垚鍔熻兘嫻嬭瘯錛屽畬鎴愯鍙ヨ鐩栥佹潯浠惰鐩栥佸垎鏀鐩栥佽礬寰勮鐩栵紝鐢╒U鍙互杞繪澗瀹炵幇錛岃繕鏈変竴鐐瑰煎緱涓鎻愶細浣跨敤VU榪樿兘鎻愰珮緙栫爜鐨勬晥鐜囷紝鎬諱綋鏉ヨ錛屽湪瀹屾垚鍗曞厓嫻嬭瘯鐨勫悓鏃訛紝緙栫爜璋冭瘯鐨勬椂闂磋繕鑳藉ぇ騫呭害緙╃煭銆傜畻浜嗭紝涓嶆兂鍐嶈浜嗭紝鑰佺撼鏄炬憜鐞嗚銆佷粙緇嶇粡楠岃繕鏄湁鍏磋叮鐨勶紝鍥犱負鍙互婊¤凍鑰佺撼濂戒負浜哄笀鐨勮櫄鑽e績錛屼絾浠嬬粛宸ュ叿灝辮寰楃儲鐒舵棤鍛充簡錛屾瘯绔熷伐鍏峰ソ涓嶅ソ鐢紝鍚堜笉鍚堢敤錛岃璇曡繃鎵嶇煡閬擄紝榪樻槸鑷繁鍘誨紑鍙戝晢鐨勭綉绔欑湅鍚э紝鍙互涓嬭澆婕旂ず鐗堬紝榪樻湁婕旂ず璇句歡銆?/font>
杞嚜錛?/font>http://www.cnblogs.com/tester2test/archive/2006/08/04/467764.html