好吧,没有外部工具,你能做的最好的事情很可能是使用宏。那是因为你需要TEST(GROUP_NAME, TEST_NAME)
为每个测试用例。
情况可能并非如此。您可以不用为每个场景设置单独的测试用例,或者 CppUTest 可能支持以编程方式添加测试用例。在这种情况下,您可以创建一个采用 input-output-testcasename 元组向量的方法。并将在每个元组上添加测试用例/运行测试。不需要宏。
类似的东西(伪代码):
typedef std::tuple<std::string, std::string, PriorityType, CompressType, ExpectedValueType> TestInfo;
void RunTest(const TestInfo& testInfo)
{
// Assuming here you're OK with this kind of test cases separation
std::cout << "Running test" << std::get<0>(testInfo) << ", " << std::get<1>(testInfo) << std::endl;
int hit;
setupDB(std::get<2>(testInfo), std::get<3>(testInfo), isX);
hit = func(std::get<2>(testInfo), std::get<3>(testInfo), isX);
CHECK_EQUAL(std::get<4>, hit);
}
void RunTests(const TestInfo& testInfo)
{
std::for_each(testInfo.begin(), testInfo.end(), RunTest);
}
std::vector<TestInfo> tests = { test1, test2 };
RunTests(tests);
如果这不起作用,宏实际上很好,您也可以在那里使用基于表格的方法。看看boost预处理器(http://www.boost.org/doc/libs/1_54_0/libs/preprocessor/doc/index.html)
再次伪代码:
#include <boost\preprocessor\seq.hpp>
#define GENERATE_TEST_CASE(_ignore1_, _ignore2_, _testCaseInfoSequence_) \
TEST(BOOST_PP_SEQ_ELEM(0, testCaseInfoSequence), BOOST_PP_SEQ_ELEM(1, testCaseInfoSequence)) \
{ \
int hit; \
setupDB(BOOST_PP_SEQ_ELEM(2, testCaseInfoSequence), BOOST_PP_SEQ_ELEM(3, testCaseInfoSequence), BOOST_PP_SEQ_ELEM(4, testCaseInfoSequence)); \
hit = func(BOOST_PP_SEQ_ELEM(2, testCaseInfoSequence), BOOST_PP_SEQ_ELEM(3, testCaseInfoSequence), BOOST_PP_SEQ_ELEM(4, testCaseInfoSequence)); \
CHECK_EQUAL(BOOST_PP_SEQ_ELEM(5, testCaseInfoSequence), hit); \
}
#define TESTCASES \
( \
(Group1)(Test1)(prio1)(isCompress1)(isX1)(expectedVal1) \
(Group1)(Test2)(prio2)(isCompress2)(isX2)(expectedVal2) \
)
// This statement will generate all tests cases in defined in TESTCASES sequnce.
BOOST_PP_SEQ_FOREACH(GENERATE_TEST_CASE, _ignore_, TESTCASES);