【问题标题】:Execute one test case several times with different fixture each time每次使用不同的夹具多次执行一个测试用例
【发布时间】:2014-02-27 10:09:59
【问题描述】:

我有一个测试用例,我想针对不同的数据库状态执行该测试用例。我在夹具中将对象插入数据库(我想保持这种状态)。我想为数据库中的不同配置创建虚拟数据库初始化方法和专用夹具。

我能想到的一种方法是:

void doTest(){
    //test code here
}

BOOST_FIXTURE_TEST_CASE(test1, fixture1)
{
    doTest();
}

BOOST_FIXTURE_TEST_CASE(test2, fixture2)
{
    doTest();
}

BOOST_FIXTURE_TEST_CASE(test3, fixture3)
{
    doTest();
}

但是有没有更干净、更整洁的方法呢? 或者也许我不应该完全这样做?我会感谢测试专家的任何建议。

【问题讨论】:

  • 您是否正在尝试为 .cpp 文件创建测试脚本?我会创建一个脚本
  • 如果您使用 Google Test 而不是 boost 测试,您可以使用“TestWithParam”和“INSTANTIATE_TEST_CASE_P”以不同的值多次实例化/运行测试:code.google.com/p/googletest/wiki/…
  • @KRUKUSA 遗憾的是我不能在这里使用脚本(这些将自动执行)
  • @MichaelAaronSafyan 谢谢,看起来不错,但我必须使用 boost 测试框架。

标签: c++ boost fixtures boost-test mt


【解决方案1】:

您可以使用BOOST_FIXTURE_TEST_CASE_TEMPLATE 来实例化多个测试:

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE TestModuleName
#include <boost/test/unit_test.hpp>
#include <boost/mpl/vector.hpp>

struct Fixture1 { int i; Fixture1() : i(1) {} };
struct Fixture2 { int i; Fixture2() : i(2) {} };
struct Fixture3 { int i; Fixture3() : i(3) {} };

typedef boost::mpl::vector<Fixture1, Fixture2, Fixture3> Fixtures;

BOOST_FIXTURE_TEST_CASE_TEMPLATE(Test, T, Fixtures, T){
    std::cout << T::i << "\n";
}

将打印

1
2
3

此代码为mpl::vector“Fixtures”中的每种类型实例化一个自己的测试用例。每个 Fixture 类型将作为 TBOOST_FIXTURE_TEST_CASE_TEMPLATE 的第二个参数)传入,T 将用作测试用例的 Fixture(最后一个参数)。

警告

由于测试用例(类)的模板性质,您需要在前面加上 T:: 来访问固定装置成员,以表明它们是(模板参数)依赖名称。

改进

因为BOOST_FIXTURE_TEST_CASE_TEMPLATE 非常通用,所以可能需要定义一个方便的“快捷方式”,更明确地说明正在做什么:

#define MULTI_FIXTURE_TEST_CASE(NAME, TPARAM, ...) \
        typedef boost::mpl::vector<__VA_ARGS__> NAME##_fixtures; \
        BOOST_FIXTURE_TEST_CASE_TEMPLATE(NAME, TPARAM, NAME##_fixtures, TPARAM)

MULTI_FIXTURE_TEST_CASE(Test, T, Fixture1, Fixture2, Fixture3){
    std::cout << T::i << "\n";
}

如您所见,它在某种程度上隐藏了mpl::vector。我认为最好在它自己的头文件中定义这个宏,它也做#include &lt;boost/mpl/vector.hpp&gt; 以避免丢失依赖项。固定装置列表名称是测试用例的名称加上“_fixtures”,因此希望它不会与现有名称冲突并且有点意义。

【讨论】:

  • 它看起来正是我正在寻找的东西,我将其标记为已接受的答案,直到被证明是错误的。 ;) 谢谢!
  • @Dino:我添加了另一个方便的宏,使界面更好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2023-01-22
  • 1970-01-01
  • 2021-09-03
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多