我正在使用 Boost::Test 框架为比较函数编写单元测试。对于每个测试用例,我创建一系列输入元素并成对比较它们以检查每对比较函数的返回值。我可以手动写出来,也可以写一个函数。在单元测试中编写函数并不好,因为当出现故障时我们得到的有用信息较少。手动写出每个检查会导致非常长的单元测试。所以我决定使用宏来遍历要检查的元素。它看起来像这样:
#define CHECK_NODE_LESS(less, more) do {\
BOOST_CHECK_EQUAL(compareQueueUnderTest((less), (more)), true); \
BOOST_CHECK_EQUAL(compareQueueUnderTest((more), (less)), false); \
} while (false)
#define CHECK_NODE_ORDER_ELEMENT(r, elem1, elem2) CHECK_NODE_LESS(elem1, elem2);
#define CHECK_NODE_ORDER_INNER_LOOP(r, list, i, elem) \
BOOST_PP_SEQ_FOR_EACH(CHECK_NODE_ORDER_ELEMENT, elem, \
BOOST_PP_SEQ_REST_N(i, list))
#define CHECK_NODE_ORDER(nodes) \
BOOST_PP_SEQ_FOR_EACH_I(CHECK_NODE_ORDER_INNER_LOOP, \
BOOST_PP_SEQ_TAIL(nodes), nodes)
在部分排序但没有全部排序的测试用例中,我CHECK_NODE_LESS
在适当的元素上使用宏来检查排序的元素,它工作正常。在总排序的测试用例中,我使用CHECK_NODE_ORDER
宏。例如:
CHECK_NODE_ORDER((node1)(rootNode1)(node2)(rootNode2));
现在这个没有编译。我测试的第一件事是注释掉CHECK_NODE_LESS
宏并运行预处理器以查看生成的内容。这是我所期望的:CHECK_NODE_LESS
被要求使用正确的元素。然后我重新引入CHECK_NODE_LESS
并运行预处理器,看看会发生什么。结果真的很丑,因为Boost Test中使用了宏,但是可以看出有些宏没有展开。
最后,我更改CHECK_NODE_LESS
为以下内容,现在它工作正常:
#define CHECK_NODE_LESS(less, more) do {\
BOOST_CHECK(compareQueueUnderTest((less), (more))); \
BOOST_CHECK(!compareQueueUnderTest((more), (less))); \
} while (false)
我认为问题在于当我与其他宏一起使用时,Boost Preprocessor 库中存在一些迭代限制BOOST_CHECK_EQUAL
,或者编译器中存在预处理器深度限制(我使用 Clang 3.4)。这个限制是多少,我该如何增加它?