BOOST_AUTO_TEST_SUITE 和 BOOST_AUTO_TEST_SUITE_END 宏分别表示测试套件的开头和结尾。各个测试放在这两个宏之间,从这一点来看,这些宏的语义很像 C++ 名称空间。每个单元测试用 BOOST_AUTO_TEST_CASE 宏来定义。清单 3 给出了 清单 2 中代码的输出。
清单 3. 清单 2 中代码的输出
[arpan@tintin] ./a.out |
下面详细讨论如何创建前面清单中的单元测试。基本思想是使用 Boost 提供的宏来测试各个类特性。BOOST_CHECK 和 BOOST_REQUIRE_EQUAL 是 Boost 提供的预定义宏(也称为测试工具),用于验证代码输出。
Boost 测试工具
Boost 有一整套测试工具,基本上可以说它们是用于验证表达式的宏。测试工具的三个主要类别是 BOOST_WARN、BOOST_CHECK 和 BOOST_REQUIRE。BOOST_CHECK 和 BOOST_REQUIRE 之间的差异在于:对于前者,即使断言失败,测试仍然继续执行;而对于后者,认为这是严重的错误,测试会停止。清单 4 使用一个简单的 C++ 片段展示了这些工具类别之间的差异。
清单 4. 使用 Boost 测试工具的三个变体
#define BOOST_TEST_MODULE enumtest |
第一个 BOOST_CHECK 会失败,第一个 BOOST_REQUIRE 也是如此。但是,当 BOOST_REQUIRE 失败时,代码退出,所以不会到达第二个 BOOST_CHECK。清单 5 显示了 清单 4 中代码的输出。
清单 5. 理解 BOOST_REQUIRE 和 BOOST_CHECK 之间的差异
[arpan@tintin] ./a.out |
同样,如果需要针对特定情况检查某些函数或类方法,最容易的方法是创建一个新测试,并使用参数和期望值调用这个例程。清单 6 提供了一个示例。
清单 6. 使用 Boost 测试检查函数和类方法
BOOST_AUTO_TEST(functionTest1) { BOOST_REQUIRE(myfunc1(99, ‘A’, 6.2) == 12); myClass o1(“hello world!/n”); BOOST_REQUIRE(o1.memoryNeeded( ) < 16); } |