Boost 测试库的进度指示器
如何在 Boost 测试应用程序中显示进度。
引言
Boost 测试库可能不是最流行的工具,但它对于编写单元测试非常有用。以下技巧展示了如何在测试运行中添加一些进度指示器。
使用代码
基于 Boost 测试库的简单单元测试代码如下所示:
#include <boost/test/unit_test.hpp>
#define BOOST_TEST_MODULE test_module
BOOST_FIXTURE_TEST_CASE(test_1)
{
// calculate value_1
value_1=...;
BOOST_CHECK_EQUAL(value_1, 10);
}
BOOST_FIXTURE_TEST_CASE(test_2)
{
// calculate value_2
value_2=...;
BOOST_CHECK_EQUAL(value_2, 10);
}
BOOST_FIXTURE_TEST_CASE(test_100)
{
...
}
该代码将执行所有列出的子测试,并在检查点失败时打印错误消息。但如果没有发生错误,代码将不会打印任何内容,直到最后。最后,它会打印类似以下内容:
正在运行 100 个测试用例...
*** 未检测到错误。
为了让框架打印进度信息,我们可以使用 --show_progress=true 命令行选项,或者将 BOOST_TEST_SHOW_PROGRESS 环境变量设置为 true。
但是,如果我们想强制显示进度指示器和/或 自定义它 (例如,打印点而不是星号,或者以绝对值而不是百分比显示进度),我们可以通过微小的修改来实现:
宏 BOOST_FIXTURE_TEST_CASE
接受第二个参数,即类名。每次子测试开始时都会创建一个类的实例,并在子测试完成后销毁它。为了显示进度,我们只需要一个在析构函数中打印点的类即可。
#include <boost/test/unit_test.hpp>
#include <iostream>
#define BOOST_TEST_MODULE test_module
struct UF
{
UF(){}
~UF()
{
// indicate that the test
// was completed
std::cout<<"."<<std::flush;
}
};
BOOST_FIXTURE_TEST_CASE(test_1, UF)
{
// calculate value_1
value_1=...;
BOOST_CHECK_EQUAL(value_1, 10);
}
BOOST_FIXTURE_TEST_CASE(test_2, UF)
{
// calculate value_2
value_2=...;
BOOST_CHECK_EQUAL(value_2, 10);
}
BOOST_FIXTURE_TEST_CASE(test_100, UF)
{
...
}
输出将是:
正在运行 100 个测试用例...
..............................................................................................
*** 未检测到错误。