在手动定义的套件树中增强测试用例和套件固定装置

发布于 2024-11-27 09:07:40 字数 1762 浏览 3 评论 0原文

在 Windows x86、Android TI 2.2 上使用 Boost 1.46.1

我定义了自己的测试套件树,因为我需要用户选择测试顺序。尽管我知道测试应该是独立的,但这是一个要求。使用我自己的 test_suite* init_unit_test_suite(int, char**) 实现重新定义了测试套件树。

对于自动化测试用例和自动化测试套件,有 Boost 宏:BOOST_FIXTURE_TEST_CASEBOOST_FIXTURE_TEST_SUITE( suite_name, F )。这些宏将函数注册到framework::master_test_suite(),在这种情况下这是不期望的行为。

全局固定装置 (BOOST_GLOBAL_FIXTURE(fixure_name)) 在手动测试套件定义中保持不受影响。

我想使用 Boost 单元测试框架中的固定装置来手动定义测试套件和案例。一个简洁的方法。

有一些解决方法:

  • 测试套件夹具 - 可以定义为其中的第一个和最后一个测试 这是儿童套房/箱子。但这会影响测试结果 作为一个单独的测试,这并不是一个很好的解决方案。
  • 测试用例夹具 - 通过将范围实例包装在测试用例周围 功能。

对于我的问题还有其他更干净、更好的解决方案吗?我真的没有资源来深入研究 Boost 库。另一方面,我不想显着降低我这边代码的质量和可读性。

此致, LK

#include <boost/bind.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/test/unit_test.hpp>
using namespace boost::unit_test;

BOOST_GLOBAL_FIXTURE(GFixture);

test_suite* init_unit_test_suite( int, char** )
{
    test_suite* ts1 = BOOST_TEST_SUITE( "Suite1" );

    boost::shared_ptr<TestClass1> test1 ( new TestClass1 );
    ts1->add( BOOST_TEST_CASE( boost::bind(&TestClass1::Run, test1)));
    boost::shared_ptr<TestClass2> test2 ( new TestClass2 );
    ts1->add( BOOST_TEST_CASE( boost::bind(&TestClass2::Run, test2)));
    boost::shared_ptr<TestClass3> test3 ( new TestClass3);
    ts1->add( BOOST_TEST_CASE( boost::bind(&TestClass3::Run, test3)));

    framework::master_test_suite().add( ts1 );
    return 0;
}

单元测试框架:用户指南
http://www.boost .org/doc/libs/1_46_1/libs/test/doc/html/utf/user-guide.html

Using Boost 1.46.1 on Windows x86, Android TI 2.2

I have defined my own test suite tree, since I need the user to choose order of the tests. although I'm aware the tests should be independent, this is a requirement. The test suite tree was redefined using my own implementation of test_suite* init_unit_test_suite(int, char**).

For automated test cases and automated test suites, there are Boost macros: BOOST_FIXTURE_TEST_CASE and BOOST_FIXTURE_TEST_SUITE( suite_name, F ). These macros register the function to the framework::master_test_suite(), which is undesired behavior in this case.

Global fixture (BOOST_GLOBAL_FIXTURE(fixure_name)) remains unaffected in manual test suite definition.

I would like to use fixtures in Boost Unit Testing Framework for manually defined test suites and cases. A neat way.

There are some workarounds:

  • Test Suite Fixture - can be defined as a first and last test among
    it's children suites/cases. This however affects the test results and
    acts as a separate test, which is not really a fine solution.
  • Test Case Fixture - by wrapping a scoped instance around the test case
    function.

Is there any other, cleaner and nicer solution to my problem? I don't really have resources to dig deep into Boost library. On the other hand, I don't want to significantly decrease the quality and readability of the code on my side.

Regards, LK

#include <boost/bind.hpp>
#include <boost/smart_ptr.hpp>
#include <boost/test/unit_test.hpp>
using namespace boost::unit_test;

BOOST_GLOBAL_FIXTURE(GFixture);

test_suite* init_unit_test_suite( int, char** )
{
    test_suite* ts1 = BOOST_TEST_SUITE( "Suite1" );

    boost::shared_ptr<TestClass1> test1 ( new TestClass1 );
    ts1->add( BOOST_TEST_CASE( boost::bind(&TestClass1::Run, test1)));
    boost::shared_ptr<TestClass2> test2 ( new TestClass2 );
    ts1->add( BOOST_TEST_CASE( boost::bind(&TestClass2::Run, test2)));
    boost::shared_ptr<TestClass3> test3 ( new TestClass3);
    ts1->add( BOOST_TEST_CASE( boost::bind(&TestClass3::Run, test3)));

    framework::master_test_suite().add( ts1 );
    return 0;
}

Unit Test Framework: User's guide
http://www.boost.org/doc/libs/1_46_1/libs/test/doc/html/utf/user-guide.html

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

羁拥 2024-12-04 09:07:40

考虑以下代码:

#define BOOST_TEST_MAIN
#include <boost/test/included/unit_test.hpp>
#include <boost/test/unit_test_suite.hpp>

BOOST_GLOBAL_FIXTURE( ... );

BOOST_AUTO_TEST_SUITE( Suite1 )

    BOOST_AUTO_TEST_CASE( Test1 )
    {
        TestClass1 testClass;

        testClass.Run();
    }


    BOOST_AUTO_TEST_CASE( Test2 )
    {
        TestClass2 testClass;

        testClass.Run();
    }

    BOOST_AUTO_TEST_CASE( Test3 )
    {
        TestClassT testClass;

        testClass.Run();
    }

BOOST_AUTO_TEST_SUITE_END()

这足以执行测试。

consider the following code:

#define BOOST_TEST_MAIN
#include <boost/test/included/unit_test.hpp>
#include <boost/test/unit_test_suite.hpp>

BOOST_GLOBAL_FIXTURE( ... );

BOOST_AUTO_TEST_SUITE( Suite1 )

    BOOST_AUTO_TEST_CASE( Test1 )
    {
        TestClass1 testClass;

        testClass.Run();
    }


    BOOST_AUTO_TEST_CASE( Test2 )
    {
        TestClass2 testClass;

        testClass.Run();
    }

    BOOST_AUTO_TEST_CASE( Test3 )
    {
        TestClassT testClass;

        testClass.Run();
    }

BOOST_AUTO_TEST_SUITE_END()

This is enough to perform test.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文