5

我有两个类共享完全相同的 API 和功能(它们包装不同的 3rd-party API 以提供相同的功能)。这两个类没有共同的基类/接口。

我对其中一个进行了提升单元测试,并希望在另一个上运行相同的确切测试,但现在我只知道如何复制粘贴测试并查找/替换类名。除了在两个地方更新测试很烦人之外,这也意味着不能保证两个类的测试是相同的。

有没有办法可以“模板化”一个测试用例?如果没有,你会如何解决这个问题?到目前为止,我能想到的只是(请原谅伪代码):

template<class T>
void runTests()
{
 T t;
 //do tests here
}

BOOST_AUTO_TEST_CASE(test_X)
{
 runTests<X>();
}
BOOST_AUTO_TEST_CASE(test_Y)
{
 runTests<Y>();
}

但我什至不知道这是否可行。

4

2 回答 2

9

完全没问题,为什么不呢?但是,在 boost 中有模板测试用例

http://www.boost.org/doc/libs/1_54_0/libs/test/doc/html/utf/user-guide/test-organization/auto-test-case-template.html

所以,这样的事情可以帮助

typedef boost::mpl::vector<X, Y> XY_types;
BOOST_AUTO_TEST_CASE_TEMPLATE(test_X_or_Y, T, XY_types)

并且 test 将被调用两次,第一次是 X,第二次是 Y。

于 2013-10-16T12:15:40.857 回答
5

您应该查看测试用例模板,因为它们提供了一种使用不同数据类型运行同一组测试的方法。据我了解,使用自动注册宏,您可以提供一个测试用例模板:

BOOST_AUTO_TEST_CASE_TEMPLATE(my_test, T, test_types)
{
    BOOST_CHECK(checkSomethingWithType(T));
}

哪里tests_types是 MPL 类型列表:

typedef boost::mpl::list<X, Y> test_types;

这些示例是从 Boost 测试文档中提取和改编的。

于 2013-10-16T12:16:31.933 回答