我总是使用 Boost Test 自动注册。现在我想知道,手动注册是做什么用的?是否存在自动注册无法处理的情况?
补充说明一下,这次我也将使用turtle 进行模拟。
编辑:似乎我的问题不清楚,更准确地说:
- 我什么时候应该使用手动注册而不是自动注册?
- 我为什么要这样做?哪些现实生活中自动注册是不够的?
我总是使用 Boost Test 自动注册。现在我想知道,手动注册是做什么用的?是否存在自动注册无法处理的情况?
补充说明一下,这次我也将使用turtle 进行模拟。
编辑:似乎我的问题不清楚,更准确地说:
根据文档
为了缓解这个问题,UTF 提供了用于在测试树中自动(就地)创建和注册测试用例的工具。这些工具牺牲了一些通用性,并且仅适用于选定的测试功能签名。
但是,我从来没有遇到过自动考试注册失败的情况。例如,您可以测试一个 Fixture 类的函数(with BOOST_AUTO_TEST_CASE
)、函数模板(with BOOST_AUTO_TEST_CASE_TEMPLATE
)和成员函数(with BOOST_FIXTURE_TEST_CASE
)。
当您想要对测试的内容和顺序进行细粒度控制时。例如基于命令行参数。
就我而言,由于我希望完成测试,手动注册更容易。
这是因为我有少量测试应用于大量类,每个类都实现相同的接口。这些是支持许多不同文件格式的文件格式处理程序,我想对每个文件执行相同的测试集(例如,以每种格式打开一个文件并尝试读取一些数据。)
最初我使用的是自动注册,我不得不为每种支持的文件格式复制测试用例。实际上,我使用了#include
一些预编译器技巧来做到这一点,但仍然很难维护。
相反,我现在切换到手动注册,因为这允许我创建一组测试,并将这些测试添加到树中数十次,每个副本针对不同的类运行(以测试每种文件格式。)代码干净多了,现在大部分#ifdef
线路都消失了,这很好。
您的问题的答案类似于您是否会通过元编程解决 C++ 编码问题。C++ 元编程有点像自动复制和粘贴,因此您可以输入更少的代码,编写更通用的算法并让编译器完成工作。使用 Boost.Test 手动注册是类似的,允许您使用算法(代码)指定测试列表,而不是单独列出每个测试。
当然,如果您的大多数测试都是独一无二的,并且您没有使用不同的参数重复运行相同的测试,那么您可能不会看到切换到手动注册的任何好处。
您可以将类成员函数与 一起使用boost::bind
,您可以将 args 绑定到函数等
如果您只使用基于免费功能的测试用例,请使用自动注册工具 切换到自动注册真的很容易。而且您不再需要担心被遗忘的测试用例
http://www.boost.org/doc/libs/1_50_0/libs/test/doc/html/utf/usage-recommendations/generic.html