??xml version="1.0" encoding="utf-8" standalone="yes"?>国产69精品久久久久9999,伊人久久五月天,亚洲精品国产成人99久久http://www.shnenglu.com/shuiyuan2004/category/4978.html——候鸟Q候补的菜鸟也zh-cnTue, 20 May 2008 18:38:56 GMTTue, 20 May 2008 18:38:56 GMT60[转]Boost Test Libraryhttp://www.shnenglu.com/shuiyuan2004/archive/2008/03/29/45677.html不?/dc:creator>不?/author>Sat, 29 Mar 2008 07:39:00 GMThttp://www.shnenglu.com/shuiyuan2004/archive/2008/03/29/45677.htmlhttp://www.shnenglu.com/shuiyuan2004/comments/45677.htmlhttp://www.shnenglu.com/shuiyuan2004/archive/2008/03/29/45677.html#Feedback0http://www.shnenglu.com/shuiyuan2004/comments/commentRss/45677.htmlhttp://www.shnenglu.com/shuiyuan2004/services/trackbacks/45677.htmlboost ?Test

test 库中有如下的lgQ?br>Execution Monitor  一个基本用?program ?test program 的异怸错误与报告机制QExecution Monitor 调用用户提供的函数ƈ报告所有捕L(fng)q行时的异常Q它只被其他 Boost Test Library components 内部调用Q当然也可以用于一?production environment 控制那些会导致程序崩溃的函数的调用;

Program Execution Monitor  一个简单的 helper facility 用于监控一个程序的q行QProgram Execution Monitor 提供?main() 函数?Execution Monitor 监控E序的执行,可以用以 production environment 产生一致错误报告,控制?test environment 环境中运行的E序Q直接?Test Execution MonitorQ?br>
Test Tools  一个用以进?testing 的一?toolboxQTest Tools 被用来测试在 Test Execution Monitor ?Unit Test Framework 控制下运行的E序Q?br>
Test Execution Monitor  让一个测试程序在 monitored environment 环境中运行,Test Execution Monitor 提供?main() 来控制被试E序的运行ƈ可以?Test Tools 实现试的逻辑Q它被用?test environmentQ如果要控制 production code 的运行?Program Execution MonitorQ?br>
Unit Test Framework  用以化编写和l织 test cases ?frameworkQ支持简单函数或者是成员函数~写?test cases q将他们l织成一?test suites ?treeQ该 framework 使用 Test Tools 来实?test cases q提供了一U机制用以管?log report level ?result report levelQ?br>
minimal testing facility  提供 Boost Test 最初版本的提供的功能的?facilityQ提供了?Test Execution Monitor 一L(fng)机制Q但额外定义了一些简单提?Test Tools cM功能?test toolsQ它不需要和M的外部组?linkQ适合单和快速测试的需要,使用?test environment?br>(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!146.entry)


boost Test ?Execution Monitor

使用 Execution Monitor 的三部曲Q?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 ) q行 monitored function。如果调用成功则q回一?integer valueQ如果有如下的事情发?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
如果希望E序 error message 被{化ؓ  execution_exception ?error messageQ则扔出如下的三cd常:C stringQstd:stringQany exception class in std::exception hierarchy?br> 
l止 monitored function 而不?Execution Monitor 报告 any error 的最x法是抛出 boost::execution_aborted。如果不喜欢 "unknown exception caught" message 而更愿意使用自定义的 exceptionQ可以向 execution monitor ?any exception types 注册 translator 函数Q如
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 报告捕获的问题,其最大的特点是不分配M 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 Quncaught C++ exceptions 被当?errorQ如果应用程序捕获到 C++ exceptionQ则?exception 不会?boost::execution_monitorQ?br>Note 2 Q这?error 包括 UNIX signals ?Windows structured exceptionsQ这些经常由 hardware traps 触发?br>
execution_monitor 可以动态连接,库中没有提供 main 函数。由于只有一?libs/test/execution_monitor.cpp 文gQ因此可以直?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 errorsQ而如 dereferencing an invalid pointer ?System-detected errors 则以其他方式报告?br> 
Boost Test Library ?Program Execution Monitor 减轻了用户处理复杂的 error detection ?reportingQƈ提供?main() 函数?monitored environment 来调用用h供的 cpp_main() 函数Qmain() 函数以一致的方式和报告多种 errors 的发生,其转化Z致的 return code q回l?host enviroment?br>BOOST_TEST_CATCH_SYSTEM_ERRORS 讄允许 Execution Monitor 捕获 system errorsQ默认gؓ "yes"?br>BOOST_PRG_MON_CONFIRM 讄是否允许用户交互认E序正确q行Q默认gؓ"yes"?br> 
Program Execution Monitor 使用 Execution Monitor 监视用户提供?cpp_main() 函数的运行。尽?Program Execution Monitor ?libs/test/src/cpp_main.cpp 提供?main() 函数Q但是ؓ?link 正确Q用户必L供一个与 main() 函数一h口的 cpp_main() 函数。如 cpp_main() 抛出异常或返回非 0 |Program Execution Monitor p为程序发生错误?br>Program Execution Monitor ?cout ?cerr 上分别提供详细和简要的错误报告。Program Execution Monitor 提供?main() 函数q回如下的?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 Z让用户用方便,提供了一pd的宏Q这些宏分三U,其效果是不同的:
WARN 不增加引用计敎ͼl箋执行E序
CHECK 增加应用计数Ql执行程?br>REQUIRE 增加应用计数Q中断程序的q行
 
使用 CHECK level tools 实现 assertionsQ?WARN level tools 验不太重要但是正的斚wQ如Q性能、可UL性、有用性,?assertions p|׃应该让程序l运行则使用 REQUIRE level tools?br> 
Test Tools 提供了两?.hpp 文g boost/test/test_tools.hpp ?boost/test/floating_point_comparison.hppQ一?.cpp 文g 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 l合?Test Tools ?Execution Monitor 的特点简化了烦琐试工作Q它提供?main() 函数调用用户提供?test_main() 函数Q用户可以?Test Tools 来进行复杂的验证工作?br> 
Test Execution Monitor 被设计用来进行测试简单的E序或者从已存在的 production code ?dig a problem。Program Execution Monitor 更适合监控 production (non-test) programsQ因为它不媄响程序的性能Q,?Unit Test Framework 更适合 complex test programsQ因?Unit Test Framework 可以
1. 可以?test 分割到多?test casesQ它会ؓ每一?test case 分别产生 pass/fail 的统计信息;
2. 假如某一?test case p|了不会媄响其他的 testQ?br>3. 可以通过指定 name 来运行特定的 test case
4. 分离?test cases q行更清楚发现特定测试模块的目的
5. 可以讄更多的选项
(http://yaekees.spaces.live.com/blog/cns!1955ee8c6707277a!150.entry)


boost Test ?Unit Test Framework

regression testing 只关注程序运行的时候是否有错误发生Q?unit test 则需要尽可能详细的输出错误的信息。Unit Test Framework ?test tools 化了 test cases 的编写ƈ其l织为有层次?test suites。它提供?main() 函数初始?frameworkQ通过命o行参数或者是环境变量讄参数Qƈ通过 init_unit_test_suite(argc, argv)Q然后运行用L(fng) test suite。Framework 跟踪所有的 passed/failed ?Test Tools assertionsQ可以通过 test cases 的数目(part ?totalQ得到测试进度,q且可以多种形式提供l果。Unit Test Framework 可被用来q行单测试和复杂重要试Q它不适合用在 production codeQ同时它以运行时的效率ؓ代h(hun)加速编译?br> 
该函数负责创建和初始化顶层的 test_suite 实例Q如 test_suite 创徏p|该函数返?NULL 指针Q测试终止ƈq回一?boost::exit_test_failure。Framework 在测试运行时传递特定的命o行参敎ͼ同时排斥其他 framework 指定的参敎ͼ同时 framework 负责 test_suite 的生命周期,?test l止时会被销毁?br> 
假如 test cases 会丢定义的异常,可以?Execution Monitor 那样注册特定?translatorQ注册函数的原型定义如下
template<typename Exception, typename ExceptionTranslator>
void boost::unit_test::register_exception_translator( ExceptionTranslator const& tr, boost::type<Exception>* d = 0 )
 
一旦测试结束,framework 会报告结果ƈq回 return code。下面是集成?unit test framework 内部的的q回?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 没有通过(对多U承没有通过)
 
单的使用Ҏ(gu)Q?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> 
另一cM用方法,首先包含如下
#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 M外部的组件。用户只需要提供了如下的函?br>int test_main( int argc, char* argv[] ) 可以了。minimal testing facility 提供?BOOST_CHECK(predicate)QBOOST_REQUIRE(predicate)QBOOST_ERROR(message)Q?BOOST_FAIL(message)。除了这四个 MACRO 以外可以通过抛出异常?return q回值报告错误。下面是 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 如果该表辑ּp|了,会出现源代码文g名、代码行受ƈ且会增加 error countQ一旦程序终?error count 会显C在 std::coutQ?br>BOOST_REQUIRE cM?BOOST_CHECKQ但是会抛出?nbsp; Minimal testing facility 捕获的异常?br>(http://yaekees.spaces.live.com/blog/cns!1955EE8C6707277A!147.entry)



]]>
CxxTest使用指南Q入门篇Q?/title><link>http://www.shnenglu.com/shuiyuan2004/archive/2007/08/31/31322.html</link><dc:creator>不?/dc:creator><author>不?/author><pubDate>Fri, 31 Aug 2007 10:42:00 GMT</pubDate><guid>http://www.shnenglu.com/shuiyuan2004/archive/2007/08/31/31322.html</guid><wfw:comment>http://www.shnenglu.com/shuiyuan2004/comments/31322.html</wfw:comment><comments>http://www.shnenglu.com/shuiyuan2004/archive/2007/08/31/31322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shuiyuan2004/comments/commentRss/31322.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shuiyuan2004/services/trackbacks/31322.html</trackback:ping><description><![CDATA[  <p><span>CxxTest</span><span>使用指南Q入门篇Q?/span></p> <p><span>准备工作Q?/span></p> <p><span><span>1?nbsp;</span></span><span>安装</span><span>perl/Python</span></p> <p><span><span>2?nbsp;</span></span><span>下蝲解压</span><span>CxxTest</span></p> <p><span><span>3?nbsp;</span></span><span>讄环境变量Q?/span></p> <p align=left><span>如果使用<span>Perl,</span>则设|一个名?span>PERL</span>的环境变量,gؓ<span>perl.exe</span>的位|。(比如<span>D:\Perl\Bin\Perl.exe</span>Q;</span></p> <p align=left><span>如果安装<span>Python,</span>则设|一个名?span>PYTHON</span>的环境变量,gؓ你安装的<span>Python</span>目录下的<span>python.exe</span>路径Q比?span>D:\Python25\python.exe</span>Q;</span></p> <p align=left><span>讄一个名?span>CXXTESTDIR </span>的环境变量,gؓ<span>CxxTest</span>解压后的目录。(比如<span>D:\Cxxtest</span>Q。(讄<span>CXXTESTDIR</span>的原因:免去每次?span>makefile</span>文g中指?span>CXXTESTDIR</span>的目录)</span></p> <p align=left> </p> <p align=left><span>方式一Q?span>CxxTest</span></span><span> </span><span>\sample\msvc</span><span>中的框架</span></p> <p align=left><span><span>1?nbsp;</span></span><span>拯<span>msvc</span>文g夹到工程目录?/span></p> <p align=left><span>打开<span>CxxTest_Workspace.sln</span>Q可以看C个项目:</span></p> <p align=left><span>- CxxTest_3_Generate </span><span>q行</span><span> cxxtestgen.pl </span><span>生成</span><span> runner.cpp </span><span>文gQ?/span></p> <p align=left><span>- CxxTest_2_Build </span><span>~译生成?/span><span>runner.cpp</span><span>文gQ?/span></p> <p align=left><span>- CxxTest_1_Run </span><span>q行试Q?/span></p> <p align=left><span><span>2?nbsp;</span></span><span>修改其中?span>makefile</span>文g<span>:</span></span></p> <p align=left><span>1</span><span>Q将以下内容Q?/span></p> <p align=left><span># Where to look for the tests</span></p> <p align=left><span>TESTS<span>            </span>= ..\gui\*.h ..\*.h</span></p> <p align=left><span>修改为:</span></p> <p align=left><span># Where to look for the tests</span></p> <p align=left><span>TESTS<span>            </span>= *.h</span></p> <p align=left><span>q段话的作用是查找测试文Ӟ我们的测试文件是<span>.h</span>格式的,攑֜当前目录下。(如果?span>.hpp</span>格式的话Q自然改?span>*.hpp</span>Q放在其它目录的话,q要修改路径Q?/span></p> <p align=left><span>2</span><span>Q将以下内容删除Q?/span></p> <p align=left><span># Where the CxxTest distribution is unpacked</span></p> <p align=left><span>CXXTESTDIR<span>       </span>= ..\..</span></p> <p align=left><span>因ؓ先前已经定义?span>CXXTESTDIR</span>的环境变量,q里的定义可以省掉?/span></p> <p align=left><span><span>3?nbsp;</span></span><span>?/span><span>CxxTest_3_Generate</span><span>目中添加测试文?/span></p> <p align=left><span>q是试文g的一个简单的例子Q?/span></p> <p align=left><span>// Sampletest.h</span></p> <p align=left><span>#include</span><span> <span><cxxtest/TestSuite.h></span></span></p> <p align=left><span>//</span><span>定义一个测试套件类Q将试用例攑օ其中</span></p> <p align=left><span>class</span><span> <span>SampletestSuite</span> : <span>public</span> <span>CxxTest</span>::<span>TestSuite</span><span>    </span></span></p> <p align=left><span>{</span></p> <p align=left><span>public</span><span>:</span></p> <p align=left><span><span>     </span><span>//</span></span><span>定义试Q以<span>test</span>作ؓ试函数前缀Q?/span></p> <p align=left><span><span>     </span><span>//</span></span><span>q是<span>cxxtestgen.pl</span>?span>cxxtestgen.py</span>Ҏ(gu)试文件进行扫描,抽取试用例的依?/span></p> <p align=left><span><span>     </span><span>void</span> <span>testMultiplication</span>( <span>void</span> )<span>    </span></span></p> <p align=left><span><span>     </span>{</span></p> <p align=left><span><span>         </span><span>TS_ASSERT_EQUALS</span>( 2 * 2, 5 );</span></p> <p align=left><span><span>     </span>}</span></p> <p><span>};</span></p> <p><span><span>4?nbsp;</span></span><span>q行试Q即生成</span><span>CxxTest_1_Run</span><span>Q可在输出窗口看到测试结果,q双ȝ果行可定位到源代码?/span></p> <p> </p> <p><span>Ҏ(gu)二:?span>msvc</span>Q将</span><span>Generate</span><span>Q?/span><span>Build</span><span>Q?/span><span>Run</span><span>集成C个项目中</span></p> <p><span><span>1?nbsp;</span></span><span>在工E中d新项目:</span><span>Unit</span><span>_<span>Test</span></span></p> <p><span>修改后?span>makefile</span>文g拯?span>Unit_Test</span>目录中?/span></p> <p><span><span>2?nbsp;</span></span><span>?span>Unit_Test</span>目源文件中d新徏?span>dummy</span></span></p> <p><span>无论dq来的是<span>.cpp,</span>q是<span>.h,</span>后~名去掉?/span></p> <p><span>叛_<span>dummy</span>Q选择属性,在弹出的属性页中,“自定义生成步?#8221;选项<span>-></span>“命o?#8221;选项Q输入:</span></p> <p><span>ECHO Don't Delete this file!!! > Dummy</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -------------------- Generating test cases --------------------</span></p> <p><span>if exist runner.cpp <st1:place w:st="on"><st1:state w:st="on">del</st1:state></st1:place> runner.cpp /Q</span></p> <p><span>NMAKE runner.cpp /nologo</span></p> <p><span>ECHO -</span></p> <p><span>ECHO –</span></p> <p> </p> <p><span>?#8220;输出”选项中输入:</span></p> <p><span>Runner.cpp</span></p> <p> </p> <p align=left><span>Dummy</span><span>只是一个文Ӟ里边可以是Q何内容,</span><span>关键点在于对<span>Dummy</span>文gq行~译的时候所执行的操作,q是一个批处理文gQ这个批处理文g执行生成<span> testcase </span>的操作,也就是调?span>Python/Perl</span>生成试用例Q也是<span>runner.cpp</span>文gQ。ؓ了保持每ơ编译都可以生成新的<span>runner</span>文gQ就必须保证</span></p> <p align=left><span>1</span><span>Q?span>Dummy</span>文g?span>runner.cpp</span>之前q行~译Q?/span></p> <p align=left><span>2</span><span>Q?span>Dummy</span>文g每次都必被重新~译?/span> </p> <p align=left><span>W一Ҏ(gu)通过文g序来的Q第二点是在生成事g里边重新生成<span>Dummy</span>文g来保证的Q?span>VS2005</span>g没问题,<span>VC6</span>gq是有些问题的)?/span></p> <p align=left><span>从另外一个角度讲Q这?span>Dummy</span>文g相当?span> samples/msvc </span>W一和第二个目的功能。(?/span><span>Generate</span><span>?/span><span>Build</span><span>Q?/span></p> <p align=left> </p> <p><span><span>3?nbsp;</span></span><span>~译<span>dummy</span>文gQ生?span>runner.cpp</span>Q将其添加到<span>Unit_Test</span>“源文?#8221;中?/span></p> <p><span>定当前目录中已?span>.h</span>试文gQ否则可能提C错误?/span></p> <p><span><span>4?nbsp;</span></span><span>叛_<span>Unit_Test</span>Q选择属性,在弹出来的属性页中, “生成事g”选项<span>-></span>“生成后事?span>”</span>选项<span>-></span>“命o?#8221;选项中输入:</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -------------------- Running Unit Test Cases --------------------</span></p> <p><span>$(OutDir)\$(TargetName).exe</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -</span></p> <p><span>ECHO -------------------------------------------------------------------------------</span></p> <p><st1:place w:st="on"><st1:state w:st="on"><span>DEL</span></st1:state></st1:place><span> runner.cpp</span></p> <p> </p> <p><span>攑֜目“生成后事?#8221;中的q一D命令,q行生成的测试,相当?/span><span>samples/msvc </span><span>W三个项目的功能。(?/span><span>Run</span><span>Q?/span></p> <p> </p> <p><span><span>5?nbsp;</span></span><span>?span>Unit_Test</span>“头文?#8221;中,d新的<span>.h</span>试文g?/span></p> <p><span>生成<span>Unit_Test</span>Q即可在输出H口分割U下看到q行试的结果,双击l果行可以定位到源代码?/span></p> <p><span>如:</span></p> <p align=left><span>1>-------------------- Running Unit Test Cases --------------------</span></p> <p align=left><span>1>Running 1 test</span></p> <p align=left><span>1>In MathsTestSuite::testMultiplication:</span></p> <p align=left><span>1>f:\test\cxxunittest\cxxunittest\sampletest.h(9): Error: Expected (2 * 2 == 5), found (4 != 5)</span></p> <p align=left><span>1>Failed 1 of 1 test</span></p> <p align=left><span>1>Success rate: 0%</span></p> <p><span>1>----------------------------------------------------------------------------------</span></p> <p> </p> <p><span>Ҏ(gu)三:抽取Z?span>Unit_Test</span>文g?/span></p> <p><span>所谓方法三Q不q是方法二中的<span>Unit_Test</span>文g夹,替代Ҏ(gu)一中的<span>msvc</span>文g夹,Ud到其它的目中用而已?/span></p> <p><span>不像Ҏ(gu)一?span>msvc</span>那样需要三个项目,也不需像方法二那样Q每ơ都修改<span>dummy</span>Q和目属性,d命o行。将<span>Unit_Test</span>文g夹各个属性都配置好之后,独立出来随时备用?/span></p> <p> </p> <p><span>准备工作Q如前所a?/span></p> <p><span>要进行测试时Q?/span></p> <p><span>?/span><span>Unit_test</span><span>文gҎ(gu)贝放到工E目录中Q在工程中添加里面的</span><span>Unit_Test</span><span>目Q仿?/span><span>Sampletest.h</span><span>写自q试文g?/span></p> <p><span>q行试Ӟ</span></p> <span>先编?/span><span>dummy</span><span>Q再生成该测试项目?/span><span>(</span><span>如果没有另外d</span><span>*.h</span><span>文gQ直接生成就可以?/span><span>) </span> <img src ="http://www.shnenglu.com/shuiyuan2004/aggbug/31322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shuiyuan2004/" target="_blank">不?/a> 2007-08-31 18:42 <a href="http://www.shnenglu.com/shuiyuan2004/archive/2007/08/31/31322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++单元试框架的比较[me]http://www.shnenglu.com/shuiyuan2004/archive/2007/08/29/31105.html不?/dc:creator>不?/author>Wed, 29 Aug 2007 01:30:00 GMThttp://www.shnenglu.com/shuiyuan2004/archive/2007/08/29/31105.htmlhttp://www.shnenglu.com/shuiyuan2004/comments/31105.htmlhttp://www.shnenglu.com/shuiyuan2004/archive/2007/08/29/31105.html#Feedback0http://www.shnenglu.com/shuiyuan2004/comments/commentRss/31105.htmlhttp://www.shnenglu.com/shuiyuan2004/services/trackbacks/31105.htmlC++单元试框架的比?/span>

单元试现在已经成ؓ标准的编E实践,但是C++~少Java?/span>.Netq_语言的反机Ӟ所以无法枚举测试方法,必须手工dQ或者用一些特别的宏,弄得代码非常隄?/span>Java语言单元试?/span>JUnit的天下,C#基本上都?/span>NUnitQ?/span>C++则群花怒放Q单元测试框枉常多Q?/span>JUnitULq来?/span>CppUnitQ?/span>Boost::testQ?/span>CppTestQ?/span>CxxTestQ?/span> TUT{等。但是解x案最好的?/span>CxxTest?/span>TUTQ?/span>CxxTest采用的方法比较特D,?/span>Perl分析C++的源文gQ从中抽取测试方法,创徏TestSuite。语法与JUnit非常怼Q没有用高U的C++Ҏ(gu),也没有定义特别的宏,无须写额外的代码?/span>TUT也是一个不错的解决Ҏ(gu)Q利用高U?/span>C++ Template功能Q必L较新的编译器才支持,比如VC6?/span>VS.NET 2002׃支持Q必?/span>VS.NET 2003以上或?/span>Intel C++ Complier 8.1以上?/span>

 

1?nbsp;TUT

l构框架单。添加新的测试工作量;无须注册试Q可UL性好Q因其只需两个头文Ӟ可以完成测试工作)Q便于装卸;提供接口可以扩展其输出方式等?/span>

最大的优点Q轻量Q便于装卸和可扩展其输出方式Q?/span>

~点Q断ag不是很好Q只用了一?/span>ensure()函数Q不知道对复杂的试是否支持Q输出的试l果较ؓ单?/span>

2?nbsp;Boost::test

l构框架较ؓ复杂。添加新的测试工作量也不大;提供多种试Ҏ(gu)Q可注册试用例Q也可不注册Q可UL性一般;装卸不易Q在控制异常、崩溃方面的能力胜过其它所有对手;拥有良好的断a功能Q大概能支持多种输出方式Q但更改输出方式不易Q支持测试套件?/span>

最大的优点Q控制异常崩溃的能力、良好的断言、输出结果较l、编写测试的Ҏ(gu)灉|Q?/span>

~点Q结构框架较为复杂,更改输出方式不易Q装怸易?/span>

3?nbsp;CXXTest

l构框架的复杂性处?/span>TUT?/span>boost::test之间。添加新的测试工作量非常;无须注册试用例Q可UL性很好;便于装卸Q控制异常、崩溃方面的能力也不错;拥有良好的断a功能Q支持多U输出方式;支持试套g?/span>

最大的优点Q?/span>~译x试方式,q且可以双击l果行立卛_位到相应的源代码Q相当吸引hQ支持多U输出,输出l果较ؓ详细Q编写测试简单;

~点Q需要用?/span>perlҎ(gu)试代码进行文法扫描,生成可执行代码,需要用?/span>makefile文gQ不是必)Q准备工作比较麻烦?/span>



]]>
C++试框架的选择[转]http://www.shnenglu.com/shuiyuan2004/archive/2007/08/26/30852.html不?/dc:creator>不?/author>Sun, 26 Aug 2007 06:34:00 GMThttp://www.shnenglu.com/shuiyuan2004/archive/2007/08/26/30852.htmlhttp://www.shnenglu.com/shuiyuan2004/comments/30852.htmlhttp://www.shnenglu.com/shuiyuan2004/archive/2007/08/26/30852.html#Feedback2http://www.shnenglu.com/shuiyuan2004/comments/commentRss/30852.htmlhttp://www.shnenglu.com/shuiyuan2004/services/trackbacks/30852.html

http://www.gamesfromwithin.com/articles/0412/000061.htmlQ?/font>在这文章中QNoel Llopis提出了一个对C++ test framework评判的一些依据,按照Noel Llopisl出的重要性,我节略在q里?/p>

1.加入新测试最化工作?/p>

2.便于修改和移植(作者的意思是说比如RTTIQSTLQExceptionq些高Ҏ(gu)可能妨在不同的^収ͼ不同版本~译器下面的可移植性)

3.便于装配/拆卸试环境

4.对异总及崩溃很好的控制

5.好的断言功能

6.支持不同的输出方?/p>

7.支持试套g(suites)

 

按照q个标准QNoel Llopis对下面的test frameworkq行了评?/p>

CPPUnit

1.工作量多

2.CPPUnit能在Windows , Linux上面q行Q功能进行了很好的模块化Q但是另一斚wQCPPUnit需要RTTIQSTLQ或者异常(作者不是很肯定Q?/p>

3.

4.CPPUnit使用protectors包装试Qƈ且捕捉所有的异常Q尝试识别某些异常)QLinux下面不会捕捉pȝ异常Q但是要增加自定义的包装是很Ҏ(gu)的?/p>

5.很好Q支持一个最集合的断言语句Q包括比较QҎ(gu)?/p>

6.支持

7.支持

M评h(hun)QOverall, CppUnit is frustrating because it's almost exactly what I want, except for my most wanted feature. (CPPUnit够闷的,不过我觉得改q易用性应该可以期待)

 

Boost.TestQ我试使用Q在VC.Net 2003下面遇到链接问题Q还没有解决Q?/p>

1.基本满

2.和CPPUnitcMQ但的是改代码的隑ֺ以及依赖Boost本n

3.避开了常规的setup/teardownl构Q可以不需要动态生成fixture 对象Q可以将fixture对象攑ֈstack里面?/p>

4.Boost.Test在这斚w过了所有的其他竞争Ҏ(gu)

5.Yes

6.大概能支持,但改变输件事情ƈ不是很容?/p>

7.支持Q?..Q这句如何理解?Yes, but with a big catchQ?/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(׃作者比较了一个被他改动的版本Q我不再xQ?/p>

 

NanoCppUnitQ这个库甚至需要你Mweb pages上面copy代码Q然后自己搞一个工E,我觉得我不太喜欢q种方式的package发布Q毕竟,我希望少操心Q所以我也不xQ?/p>

 

Unit++

首先指出一个独特的Ҏ(gu):More C++ LikeQ作者的意思是它没有用宏Q的,前面几种framework开始一个测试的时候都使用了宏Q这在许多C++ Library中是惯例Q用来简化一些代码。我们通过从基cȝ承从而创建测试包Q当然在其他framework里面本质也是q样Q但是都攑֜q后q行Q宏掩盖了具体情c?/p>

1.不好

2.一般般

3.不支?/p>

4.表现q_

5.文档没说如何支持不同的输?/p>

6.不支持QҎ(gu)

7.支持

 

CxxTest

首先作者认为文档最好(很重要?Q另外作者指?CxxTest的作者Erez Volk意识到我们是在写工具帮助试C++E序Q所以不必受限于C++的特征?

1.非常?/p>

2.很好

3.支持

4.很好

5.yes

6.yes

7.yes

 

 

文章最后给Z个综qͼ是个表现好的QCPPUnit, CppUnitLite, Boost.Test, CxxTestQ作者本人喜ƢCxxTest.

(?

 

转自Q?a >http://hi.baidu.com/fangfang%5Fi/blog/item/32876bfb5d140a64024f56e6.html

]]>
全面介绍单元试 Q{?/title><link>http://www.shnenglu.com/shuiyuan2004/archive/2007/08/26/30851.html</link><dc:creator>不?/dc:creator><author>不?/author><pubDate>Sun, 26 Aug 2007 06:33:00 GMT</pubDate><guid>http://www.shnenglu.com/shuiyuan2004/archive/2007/08/26/30851.html</guid><wfw:comment>http://www.shnenglu.com/shuiyuan2004/comments/30851.html</wfw:comment><comments>http://www.shnenglu.com/shuiyuan2004/archive/2007/08/26/30851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/shuiyuan2004/comments/commentRss/30851.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/shuiyuan2004/services/trackbacks/30851.html</trackback:ping><description><![CDATA[<span id="keekass" class=smalltxt><span id="gsoquuc" class=bold><font size=2> <p><font size=2><span id="goauqky" class=smalltxt><span id="muqceus" class=bold>全面介绍单元试 Q{?/span></span><br><br></font><span style="FONT-SIZE: 12px"><font size=2>q是一全面介l单元测试的l典之作Q对理解单元试和Visual Unit很有帮助Q作者老纳Q收录时作了量修改<br><br>一 单元试概述<br>  工厂在组装一台电(sh)视机之前Q会Ҏ(gu)个元仉q行试Q这Q就是单元测试?br>  其实我们每天都在做单元测试。你写了一个函敎ͼ除了极简单的外,L要执行一下,看看功能是否正常Q有时还要想办法输出些数据,如弹Z息窗口什么的Q这Q也是单元测试,老纳把这U单元测试称Z(f)时单元测试。只q行了(f)时单元测试的软gQ针对代码的试很不完整Q代码覆盖率要超q?0%都很困难Q未覆盖的代码可能遗留大量的l小的错误,q些错误q会互相影响Q当BUG暴露出来的时候难于调试,大幅度提高后期测试和l护成本Q也降低了开发商的竞争力。可以说Q进行充分的单元试Q是提高软g质量Q降低开发成本的必由之\?br>  对于E序员来_如果L了对自己写的代码q行单元试的习惯,不但可以写出高质量的代码Q而且q能提高~程水^?br>  要进行充分的单元试Q应专门~写试代码Qƈ与品代码隔R老纳认ؓQ比较简单的办法是ؓ产品工程建立对应的测试工E,为每个类建立对应的测试类Qؓ每个函数Q很单的除外Q徏立测试函数。首先就几个概念谈谈老纳的看法?br>  一般认为,在结构化E序时代Q单元测试所说的单元是指函数Q在当今的面向对象时代,单元试所说的单元是指cR以老纳的实跉|看,以类作ؓ试单位Q复杂度高,可操作性较差,因此仍然d以函C为单元测试的试单位Q但可以用一个测试类来组l某个类的所有测试函数。单元测试不应过分强调面向对象,因ؓ局部代码依然是l构化的。单元测试的工作量较大,单实用高效才是硬道理?br>  有一U看法是Q只试cȝ接口(公有函数)Q不试其他函数Q从面向对象角度来看Q确实有光理,但是Q测试的目的是找错ƈ最l排错,因此Q只要是包含错误的可能性较大的函数都要试Q跟函数是否U有没有关系。对于C++来说Q可以用一U简单的Ҏ(gu)区隔需试的函敎ͼ单的函数如数据读写函数的实现在头文g中编?inline函数)Q所有在源文件编写实现的函数都要q行试(构造函数和析构函数除外)?br>  什么时候测试?单元试早好Q早C么程度?XP开发理ITDDQ即试驱动开发,先编写测试代码,再进行开发。在实际的工作中Q可以不必过分强调先什么后什么,重要的是高效和感觉舒适。从老纳的经验来看,先编写品函数的框架Q然后编写测试函敎ͼ针对产品函数的功能编写测试用例,然后~写产品函数的代码,每写一个功能点都运行测试,随时补充试用例。所谓先~写产品函数的框Ӟ是指先编写函数空的实玎ͼ有返回值的随便q回一个|~译通过后再~写试代码Q这Ӟ函数名、参数表、返回类型都应该定下来了,所~写的测试代码以后需修改的可能性比较小?br>  p试Q单元测试与其他试不同Q单元测试可看作是编码工作的一部分Q应该由E序员完成,也就是说Q经q了单元试的代码才是已完成的代码,提交产品代码时也要同时提交测试代码。测试部门可以作一定程度的审核?br>  关于桩代码,老纳认ؓQ单元测试应避免~写桩代码。桩代码是用来代替某些代码的代码,例如Q品函数或试函数调用了一个未~写的函敎ͼ可以~写桩函数来代替该被调用的函敎ͼ桩代码也用于实现试隔离。采用由底向上的方式q行开发,底层的代码先开发ƈ先测试,可以避免~写桩代码,q样做的好处有:减少了工作量Q测试上层函数时Q也是对下层函数的间接测试;当下层函CҎ(gu)Q通过回归试可以认修改是否D上层函数产生错误?br><br>二 试代码~写<br>  多数讲述单元试的文章都是以JavaZQ本文以C++ZQ后半部分所介绍的单元测试工具也只介lC++单元试工具。下面的CZ代码的开发环境是VC6.0?br><br>产品c:<br>class CMyClass <br>{<br>public:<br>       int Add(int i, int j);<br>       CMyClass();<br>       virtual ~CMyClass();<br><br>private:<br>       int mAge;         //q龄<br>       CString mPhase; //q龄阶段Q如"年"Q?青年"<br>};<br><br>建立对应的测试类CMyClassTesterQؓ了节U编q,只列出源文g的代码:<br>void CMyClassTester::CaseBegin()<br>{<br>       //pObj是CMyClassTestercȝ成员变量Q是被测试类的对象的指针Q?br>       //为求单,所有的试c都可以用pObj命名被测试对象的指针?br>       pObj = new CMyClass();<br>}<br><br>void CMyClassTester::CaseEnd()<br>{<br>       delete pObj;<br>}<br>试cȝ函数CaseBegin()和CaseEnd()建立和销毁被试对象Q每个测试用例的开头都要调用CaseBegin()Q结N要调用CaseEnd()?br><br>接下来,我们建立CZ的品函敎ͼ<br>int CMyClass::Add(int i, int j)<br>{<br>       return i+j;<br>}<br>和对应的试函数Q?br>void CMyClassTester::Add_int_int()<br>{<br>}<br>把参数表作ؓ函数名的一部分Q这样当出现重蝲的被试函数Ӟ试函数不会产生命名冲突。下面添加测试用例:<br>void CMyClassTester::Add_int_int()<br>{<br>       //W一个测试用?br>       CaseBegin();{                 //1<br>       int i = 0;                   //2<br>       int j = 0;                   //3<br>       int ret = pObj->Add(i, j); //4<br>       ASSERT(ret == 0);             //5<br>       }CaseEnd();                   //6<br>}<br>W?和第6行徏立和销毁被试对象Q所加的{}是ؓ了让每个试用例的代码有一个独立的域,以便多个试用例使用相同的变量名?br>W?和第3行是定义输入数据Q第4行是调用被测试函敎ͼq些Ҏ(gu)理解Q不作进一步解释。第5行是预期输出Q它的特Ҏ(gu)当实际输Z预期输出不同时自动报错,ASSERT是VC的断a宏,也可以用其他类似功能的宏,使用试工具q行单元试Ӟ可以使用该工具定义的断言宏?br><br>  CZ中的格式昑־很不z,2、3??行可以合写ؓ一行:ASSERT(pObj->Add(0, 0) == 0);但这U不z的格式却是老纳极力推荐的,因ؓ它一目了Ӟ易于建立多个试用例Qƈ且具有很好的适应性,同时Q也是极佳的代码文档QMQ老纳Q输入数据和预期输出要自成一块?br>  建立了第一个测试用例后Q应~译q运行测试,以排除语法错误,然后Q用拷?修改的办法徏立其他测试用例。由于各个测试用例之间的差别往往很小Q通常只需修改一两个数据Q拷?修改是徏立多个测试用例的最快捷办法?br><br>三 试用例<br>  下面说说试用例、输入数据及预期输出。输入数据是试用例的核心,老纳对输入数据的定义是:被测试函数所d的外部数据及q些数据的初始倹{外部数据是对于被测试函数来说的Q实际上是除了局部变量以外的其他数据Q老纳把这些数据分为几c:参数、成员变量、全局变量、IO媒体。IO媒体是指文g、数据库或其他储存或传输数据的媒体,例如Q被试函数要从文g或数据库d数据Q那么,文g或数据库中的原始数据也属于输入数据。一个函数无论多复杂Q都无非是对q几cL据的d、计和写入。预期输出是指:q回值及被测试函数所写入的外部数据的l果倹{返回值就不用说了Q被试函数q行了写操作的参?输出参数)、成员变量、全局变量、IO媒体Q它们的预期的结果值都是预期输出。一个测试用例,是讑֮输入数据Q运行被试函数Q然后判断实际输出是否符合预期。下面D一个与成员变量有关的例子:<br>产品函数Q?br>void CMyClass::Grow(int years)<br>{<br>       mAge += years;<br><br>       if(mAge < 10)<br>           mPhase = "儿童";<br>       else if(mAge <20)<br>           mPhase = "年";<br>       else if(mAge <45)<br>           mPhase = "青年";<br>       else if(mAge <60)<br>           mPhase = "中年";<br>       else<br>           mPhase = "老年";<br>}<br><br>试函数中的一个测试用例:<br>       CaseBegin();{<br>       int years = 1;<br>       pObj->mAge = 8;<br>       pObj->Grow(years);<br>       ASSERT( pObj->mAge == 9 );<br>       ASSERT( pObj->mPhase == "儿童" );<br>       }CaseEnd();<br>在输入数据中对被试cȝ成员变量mAgeq行赋|在预期输Z断言成员变量的倹{现在可以看到老纳所推荐的格式的好处了吧Q这U格式可以适应很复杂的试。在输入数据部分q可以调用其他成员函敎ͼ例如Q执行被试函数前可能需要读取文件中的数据保存到成员变量Q或需要连接数据库Q老纳把这些操作称为初始化操作。例如,上例?ASSERT( ...)之前可以加pObj->OpenFile();。ؓ了访问私有成员,可以测试类定义Z品类的友元类。例如,定义一个宏Q?br>#define UNIT_TEST(cls) friend class cls##Tester;<br>然后在品类声明中加一行代码:UNIT_TEST(ClassName)?br><br>  下面谈谈试用例设计。前面已l说了,试用例的核心是输入数据。预期输出是依据输入数据和程序功能来定的,也就是说Q对于某一E序Q输入数据确定了Q预期输Z可以确定了Q至于生?销毁被试对象和运行测试的语句Q是所有测试用例都大同异的,因此Q我们讨论测试用例时Q只讨论输入数据?br>  前面说过Q输入数据包括四c:参数、成员变量、全局变量、IO媒体Q这四类数据中,只要所试的程序需要执行读操作的,p讑֮其初始|其中Q前两类比较常用Q后两类较少用。显Ӟ把输入数据的所有可能取值都q行试Q是不可能也是无意义的,我们应该用一定的规则选择有代表性的数据作ؓ输入数据Q主要有三种Q正常输入,边界输入Q非法输入,每种输入q可以分c,也就是^常说的等L(fng)法,每类取一个数据作入数据,如果试通过Q可以肯定同cȝ其他输入也是可以通过的。下面D例说明: <br>  正常输入<br>  例如字符串的Trim函数Q功能是字W串前后的空格去除,那么正常的输入可以有四类Q前面有I格Q后面有I格Q前后均有空|前后均无I格?br>  边界输入<br>  上例中空字符串可以看作是边界输入?br>  再如一个表C年龄的参数Q它的有效范围是0-100Q那么边界输入有两个Q??00?br>  非法输入<br>  非法输入是正常取D围以外的数据Q或使代码不能完成正常功能的输入Q如上例中表C年龄的参数Q小?或大?00都是非法输入Q再如一个进行文件操作的函数Q非法输入有q么几类Q文件不存在Q目录不存在Q文件正在被其他E序打开Q权限错误?br>  如果函数使用了外部数据,则正常输入是肯定会有的,而边界输入和非法输入不是所有函数都有。一般情况下Q即使没有设计文档,考虑以上三种输入也可以找出函数的基本功能炏V实际上Q单元测试与代码~写?#8220;一体两?#8221;的关p,~码时对上述三种输入都是必须考虑的,否则代码的健壮性就会成问题?br><br>四 白盒覆盖<br>  上面所说的试数据都是针对E序的功能来设计的,是所谓的黑盒试。单元测试还需要从另一个角度来设计试数据Q即针对E序的逻辑l构来设计测试用例,是所谓的白盒试。在老纳看来Q如果黑盒测试是_充分的,那么白盒试没有必要,可惜“_充分”只是一U理想状态,例如Q真的是所有功能点都测试了吗?E序的功能点是h为的定义Q常常是不全面的Q各个输入数据之_有些l合可能会生问题,怎样保证q些l合都经q了试Q难于衡量测试的完整性是黑盒试的主要缺P而白盒测试恰恰具有易于衡量测试完整性的优点Q两者之间具有极好的互补性,例如Q完成功能测试后l计语句覆盖率,如果语句覆盖未完成,很可能是未覆盖的语句所对应的功能点未测试?br>  白盒试针对E序的逻辑l构设计试用例Q用逻辑覆盖率来衡量试的完整性。逻辑单位主要有:语句、分支、条件、条件倹{条件值组合,路径。语句覆盖就是覆盖所有的语句Q其他类推。另外还有一U判定条件覆盖,其实是分支覆盖与条g覆盖的组合,在此不作讨论。跟条g有关的覆盖就有三U,解释一下:条g覆盖是指覆盖所有的条g表达式,x有的条g表达式都臛_计算一ơ,不考虑计算l果Q条件D盖是指覆盖条件的所有可能取|x个条件的取真值和取假值都要至计一ơ;条g值组合覆盖是指覆盖所有条件取值的所有可能组合。老纳做过一些粗的研究Q发C条g直接有关的错误主要是逻辑操作W错误,例如Q||写成&&Q漏了写!什么的Q采用分支覆盖与条g覆盖的组合,基本上可以发现这些错误,另一斚wQ条件D盖与条g值组合覆盖往往需要大量的试用例Q因此,在老纳看来Q条件D盖和条g值组合覆盖的效费比偏低。老纳认ؓ效费比较高且完整性也_的测试要求是q样的:完成功能试Q完成语句覆盖、条件覆盖、分支覆盖、\径覆盖。做q单元测试的朋友恐怕会对老纳提出的测试要求给予一个字的评P晕!或者两个字的评P狂晕Q因g是不可能的要求,要达到这U测试完整性,其测试成本是不可惌的,不过Q出家h不打逛语Q老纳之所以提U测试要求,是因为利用一些工P可以在较低的成本下达到这U测试要求,后面会作进一步介l?br>  关于白盒试用例的设计,E序试领域的书c一般都有讲qͼ普通方法是dE序的逻辑l构囑֦E序程图或控制图Q根据逻辑l构图设计测试用例,q些是纯_的白盒试Q不是老纳x荐的方式。老纳所推荐的方法是Q先完成黑盒试Q然后统计白盒覆盖率Q针Ҏ(gu)覆盖的逻辑单位设计试用例覆盖它,例如Q先查是否有语句未覆盖,有的话设计测试用例覆盖它Q然后用同样Ҏ(gu)完成条g覆盖、分支覆盖和路径覆盖Q这L(fng)话,既检验了黑盒试的完整性,又避免了重复的工作,用较?yu)的旉成本辑ֈ非常高的试完整性。不q,q些工作可不是手工能完成的,必须借助于工P后面会介l可以完成这些工作的试工具?br><br>五 单元试工具<br>  现在开始介l单元测试工P老纳只介l三U,都是用于C++语言的?br>  首先是CppUnitQ这是C++单元试工具的E,免费的开源的单元试框架。由于已有一众高人写了不关于CppUnit的很好的文章Q老纳׃C了,想了解CppUnit的朋友,M下Cpluser 所作的《CppUnit试框架入门》,|址是:</font><a target=_blank><font color=#003366 size=2><u>http://blog.csdn.net/cpluser/archive/2004/09/21/111522.aspx</u></font></a><font size=2>。该文也提供了CppUnit的下载地址?br>  然后介绍C++TestQ这是Parasoft公司的品。EC++Test是一个功能强大的自动化C/C++单元U测试工P可以自动试MC/C++函数、类Q自动生成测试用例、测试驱动函数或桩函敎ͼ在自动化的环境下极其Ҏ(gu)快速的单元的测试覆盖率辑ֈ100%?/font><font size=2>q是华唐公司的网上的介l。老纳惛_些介lC++Test的文字,但发现无法超华唐公司的|页上的介绍Q所以也q点事了,想了解C++Test的朋友,讉K该公司的|站。华唐公总理C++TestQ想要购买或索取报h(hun)、试用版都可以找他们。老纳帮华唐公司做q告Q不知道会不会得点什么好处?<br>  最后介lVisual UnitQ简UVUQ这是国产的单元试工具Q据说申请了多项专利Q拥有一批创新的技术,不过老纳只关心是不是有用和好用。E自动生成试代码 快速徏立功能测试用?E序行ؓ一目了?极高的测试完整?高效完成白盒覆盖 快速排?高效调试 详尽的测试报告]。EQ内的文字是VU开发商的网上摘录的,|址是:</font><a target=_blank><font color=#003366 size=2><u>http://www.unitware.cn</u></font></a><font size=2>。前面所q测试要求:完成功能试Q完成语句覆盖、条件覆盖、分支覆盖、\径覆盖,用VU可以L实现Q还有一点值得一提:使用VUq能提高~码的效率,M来说Q在完成单元试的同Ӟ~码调试的时间还能大q度~短。算了,不想再讲了,老纳显摆理论、介l经验还是有兴趣的,因ؓ可以满老纳好ؓ人师的虚荣心Q但介绍工具p得烦然无味了Q毕竟工具好不好用,合不合用Q要试过才知道,q是自己d发商的网站看吧,可以下蝲演示版,q有演示课g?/font></span></p> <p><span style="FONT-SIZE: 12px"><font size=2>转自Q?/font><a ><font color=#0000ff size=2><u>http://www.cnblogs.com/tester2test/archive/2006/08/04/467764.html</u></font></a></span></p> </font></span></span> <img src ="http://www.shnenglu.com/shuiyuan2004/aggbug/30851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/shuiyuan2004/" target="_blank">不?/a> 2007-08-26 14:33 <a href="http://www.shnenglu.com/shuiyuan2004/archive/2007/08/26/30851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.moldpx.cn" target="_blank">þþþavר</a>| <a href="http://www.t6s.com.cn" target="_blank">þþþһ</a>| <a href="http://www.linkyes.cn" target="_blank">69Ʒþþþ99</a>| <a href="http://www.haolepay.cn" target="_blank">Ʒþþþ</a>| <a href="http://www.njcwhs.cn" target="_blank">þ97þ97Ʒӿ</a>| <a href="http://www.jkmdz.cn" target="_blank">޾ƷĻþò </a>| <a href="http://www.52shadu.cn" target="_blank">þ99Ʒ99þ</a>| <a href="http://www.8x8z.cn" target="_blank">91鶹Ʒ91þþ</a>| <a href="http://www.gxyy.org.cn" target="_blank">996þùƷ߹ۿ</a>| <a href="http://www.26zf.cn" target="_blank">޹ƷþþþþԻ </a>| <a href="http://www.cnshscj.cn" target="_blank">þƵվ</a>| <a href="http://www.oysport.cn" target="_blank">ھƷþþþӰԺ</a>| <a href="http://www.swwpb.cn" target="_blank">һþ֪ۺϾþ</a>| <a href="http://www.168sf.com.cn" target="_blank">޹þþþþþ</a>| <a href="http://www.bfav.cn" target="_blank">þĻ</a>| <a href="http://www.cixivip.cn" target="_blank">ɫþùƷ12p</a>| <a href="http://www.njkyt.cn" target="_blank">ƷþþĻ </a>| <a href="http://www.haokan1.cn" target="_blank">þþþù</a>| <a href="http://www.yuyuetiyu.cn" target="_blank">þۺϾɫۺϾ99</a>| <a href="http://www.56zhuanjia.com.cn" target="_blank">777þþƷһ</a>| <a href="http://www.meelin.cn" target="_blank">ݺۺϾþۺ88</a>| <a href="http://www.daidai360.cn" target="_blank">þþƷAvӰƬ </a>| <a href="http://www.royfq.cn" target="_blank">Ļ뾫ƷԴþ</a>| <a href="http://www.ylssmedia.cn" target="_blank">ľþۺĻ</a>| <a href="http://www.adpz.cn" target="_blank">պӰþþñ</a>| <a href="http://www.kangaiw.cn" target="_blank">˾þۺ</a>| <a href="http://www.zxk2008bj.cn" target="_blank">þҹ³Ƭ</a>| <a href="http://www.siteni.cn" target="_blank">ƷƵþ</a>| <a href="http://www.tonyifu.cn" target="_blank">һɫۺϾþ</a>| <a href="http://www.t0oal.cn" target="_blank">99þùۺϾƷˮ </a>| <a href="http://www.itkuo.cn" target="_blank">޹Ʒþþþþ</a>| <a href="http://www.qequ.cn" target="_blank">Ʒþþþ</a>| <a href="http://www.sunriseydy.cn" target="_blank">Ʒһþ㽶߿ۿ</a>| <a href="http://www.ynymdp.cn" target="_blank">þþ뾫ƷպĦ </a>| <a href="http://www.dmbetter.cn" target="_blank">þþƷѿ</a>| <a href="http://www.998tel.cn" target="_blank">þһҹ </a>| <a href="http://www.fengguan1688.cn" target="_blank">ݺɫ˾þþƷۺ</a>| <a href="http://www.9527dm.cn" target="_blank">jizzjizzƷþ</a>| <a href="http://www.anglein.cn" target="_blank">þþþþƷAV</a>| <a href="http://www.qnui.cn" target="_blank">Ʒݾþþþø99</a>| <a href="http://www.0108400.cn" target="_blank">þþþƷ2019ѹۿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>