• [boost] : test库


    最小化的测试套件minimal_test

    test库提供一个最小化的测试套件minimal_test, 类似lightweight_test适合入门级测试.
    需要包含文件文#include <boost/test/minimal_test.hpp>
    minimal_test内部实现了main(), 因此无需自己编写main()函数, 只要实现test_main()即可, 它是minimal_test的真正功能函数. 注意test_main()必须返回一个整数.
    minimal_test提供四个测试断言宏

    BOOST_CHECK(e) 断言测试通过, 如不通过不影响程序执行
    BOOST_REQUIRE(e) 要求断言必须通过, 否则程序停止执行
    BOOST_ERROR(e1, e2) 给出错误信息, 程序继续执行
    BOOST_FAIL(e1, e2) 给出错误信息, 程序运行停止
    // Copyright (c) 2015
    // Author: Chrono Law
    #include <iostream>
    using namespace std;
    
    #include <boost/format.hpp>
    #include <boost/test/minimal.hpp> // 最小化测试头文件
    
    int test_main( int argc, char* argv[] )
    {
        using namespace boost;
        format fmt("%d-%d");
    
        BOOST_CHECK(fmt.size() != 0); // 断言测试通过, 如不通过不影响程序执行
        fmt % 12 % 34;
        BOOST_REQUIRE(fmt.str() == "12-34"); // 要求断言必须通过, 否则程序停止执行
    
        BOOST_ERROR("演示一条错误消息"); // 给出错误信息, 程序继续执行
    
        fmt.clear();
        fmt % 12;
        try
        {
            std::cout << fmt; // 输入参数不完整, 抛出异常
        }
        catch (...)
        {
            BOOST_FAIL("致命错误,测试终止"); // 给出错误信息, 程序运行停止
        }
        return 0; // 必须返回值
    }
    

    运行输出

    minimal_test.cpp(18): 演示一条错误消息 in function: 'int test_main(int, char**)'
    minimal_test.cpp(28): 致命错误,测试终止 in function: 'int test_main(int, char**)'
    

    minimal_test与lightweight_test区别:

    • 测试断言有CHECK/REQUIRE/ERROR/FAIL级别
    • 不支持捕获异常的测试
    • 必须实现test_main()函数作为测试入口
    • 自动输出测试报告

    单元测试框架UTF

    Boost test库提供了一个用于单元测试的基于命令行界面的测试套件UTF: Unit Test Framework,具有单元测试、检测内存泄露、监控程序运行的功能。

    UTF测试断言

    UTF中的测试断言:BOOST_LEVEL_ITEM

    LEVEL WARN
    CHECK
    REQUIRE
    ITEM EQUAL/CLOSE
    GE/GT/LT/LE/NE
    (NO_)THROW
    MESSAGE

    测试用例与测试套件

    test库将测试程序定义为一个测试模块,由测试安装,测试主体,测试清理和测试运行器四个部分组成。测试主体是测试模块的实际运行部分,由测试用例和测试套件组织成测试树的形式。
    测试用例是一个包含多个测试断言的函数, 是可以被独立执行测试的最小单元, 各个测试用例之间是无关的, 发生的错误不会影响其他测试用例.
    测试套件是测试用例的容器,可以嵌套,包含一个或多个测试用例,将多个测试用例分组管理,共享安装/清理代码, 更好的组织测试用例。
    主测试套件, 任何UTF单元测试程序必须存在唯一一个主测试套件, 它是整个测试树的根节点, 其他测试套件都是它的子节点. 主测试套件的定义可以使用宏BOOST_TEST_MAIN或者
    BOOST_TEST_MODULE, 它们必须出现在<boost/test/unit_test.hpp>之前.

    // Copyright (c) 2015
    // Author: Chrono Law
    //#define BOOST_TEST_MAIN
    #define BOOST_TEST_MODULE // 主测试套件
    #include <boost/test/unit_test.hpp> // test库头文件
    
    #include <boost/smart_ptr.hpp>
    using namespace boost;
    
    
    BOOST_AUTO_TEST_SUITE(s_smart_ptr) // 测试套件开始
    
    BOOST_AUTO_TEST_CASE(t_scoped_ptr) // 测试用例1
    {
        scoped_ptr<int> p(new int(874));
        BOOST_CHECK(p);
        BOOST_CHECK_EQUAL(*p , 874);
    
        p.reset();
        BOOST_CHECK(p == 0);
    }
    
    BOOST_AUTO_TEST_CASE(t_shared_ptr) // 测试用例2
    {
        shared_ptr<int> p(new int(100));
    
        BOOST_CHECK(p);
        BOOST_CHECK_EQUAL(*p , 100);
        BOOST_CHECK_EQUAL(p.use_count(), 1);
    
        shared_ptr<int> p2 = p;
        BOOST_CHECK_EQUAL(p, p2);
        BOOST_CHECK_EQUAL(p2.use_count(), 2);
    
        *p2 = 255;
        BOOST_CHECK_EQUAL(*p, 255);
        BOOST_CHECK_GT(*p, 200);
    }
    
    BOOST_AUTO_TEST_SUITE_END() // 测试套件结束
    

    输出结果

    Running 2 test cases...
    
    *** No errors detected
    

    测试夹具: 测试安装和测试清理好比c++中的构造函数和析构函数,“测试夹具”实现了自动的测试安装和测试清理。基本形式为:

    struct test_fixture_name  // 测试夹具类, 通常是struct, 将被UTF继承
    {
      test_fixture_name(){}   // 测试安装工作
      ~test_fixture_name(){}  // 测试清理工作
    };
    

    测试夹具类需要使用以下两个宏指定测试用例和测试套件

    #define BOOST_FIXTURE_TEST_SUITE(suite_name, F)
    #define BOOST_FIXTURE_TEST_CASE(test_name, F)
    
    // Copyright (c) 2015
    // Author: Chrono Law
    #include <iostream>
    #include <vector>
    using namespace std;
    
    #define BOOST_TEST_MAIN
    #include <boost/test/unit_test.hpp>
    #include <boost/assign.hpp>
    using namespace boost;
    
    struct global_fixture // 全局测试夹具类
    {
        global_fixture(){cout << ("global setup
    ");}
        ~global_fixture(){cout << ("global teardown
    ");}
    };
    
    // 该宏定义的夹具类被应用于整个测试用例的所有测试套件, 包括主测试套件
    BOOST_GLOBAL_FIXTURE(global_fixture);
    
    struct assign_fixture // 测试套件夹具类
    {
        assign_fixture()
        {cout << ("suit setup
    ");}
        ~assign_fixture()
        {cout << ("suit teardown
    ");}
    
        vector<int> v;    // 所有测试用例都可以用的成员变量
    };
    
    // 定义测试套件级别的夹具
    BOOST_FIXTURE_TEST_SUITE(s_assign, assign_fixture)
    
    BOOST_AUTO_TEST_CASE(t_assign1) // 测试用例1, 测试+=操作符
    {
        using namespace boost::assign;
    
        v += 1,2,3,4;
        BOOST_CHECK_EQUAL(v.size(), 4);
        BOOST_CHECK_EQUAL(v[2], 3);
    }
    
    BOOST_AUTO_TEST_CASE(t_assign2) // 测试用例2, 测试push_back函数
    {
        using namespace boost::assign;
    
        push_back(v)(10)(20)(30);
    
        BOOST_CHECK_EQUAL(v.empty(), false);
        BOOST_CHECK_LT(v[0], v[1]);
    }
    
    BOOST_AUTO_TEST_SUITE_END() // 测试套件结束
    

    输出结果为:

    global setup
    Running 2 test cases...
    suit setup
    suit teardown
    suit setup
    suit teardown
    global teardown
    
    *** No errors detected
    
  • 相关阅读:
    hdoj:2075
    hdoj:2072
    hdoj:2071
    hdoj:2070
    hdoj:2069
    test001
    hdoj:2067
    hdoj:2061
    hdoj:2058
    hdoj:2057
  • 原文地址:https://www.cnblogs.com/moon1992/p/7482033.html
Copyright © 2020-2023  润新知