boost:lightweight_test r囧r小猫 2022-10-20 15:00 68阅读 0赞 # 概述 # * lightweight\_test是一个轻量级的单元测试框架,它原本位于`<boost/detail>`,仅供Boost库内部使用,但在boost1.56版后被移入了core库,成为了boost程序库的正式成员 * 如何使用:引入头文件即可 #include <boost/core/lightweight_test.hpp> ## 测试断言 ## * lightweight\_test只提供最基本的单元测试功能,不支持测试用例,测试套件的概念;但因为简单小巧,适合要求不高或快速的测试工作 * lightweight\_test定义了数个测试断言,下面列出比较常用的几个: <table> <thead> <tr> <th>断言</th> <th>说明</th> </tr> </thead> <tbody> <tr> <td>BOOST_TEST(e)</td> <td>断言表达式成立</td> </tr> <tr> <td>BOOST_TEST_NOT(e)</td> <td>断言表达式不成立</td> </tr> <tr> <td>BOOST_ERROR(s)</td> <td>直接断言失败,输出错误信息s</td> </tr> <tr> <td>BOOST_TEST_EQ(e1, e2)</td> <td>断言两个表达式相等</td> </tr> <tr> <td>BOOST_TEST_NE(e1, e2)</td> <td>断言两个表达式不等</td> </tr> <tr> <td>BOOST_TEST_CSTR_EQ(e1, e2)</td> <td>断言两个C字符串相等</td> </tr> <tr> <td>BOOST_TEST_CSTR_NE(e1, e2)</td> <td>断言两个C字符串不等</td> </tr> <tr> <td>BOOSR_TEST_THROWS(e, ex)</td> <td>断言表达式e抛出异常ex</td> </tr> </tbody> </table> 以上断言如果失败会增加内部的错误计数,lightweight\_test提供函数boost::report\_errors()来输出测试结果,在测试结束时我们必须调用`report_errors()`,否则会发生BOOST\_ASSERT断言错误 ## 用法 ## #include <boost/core/lightweight_test.hpp> #include <boost/smart_ptr.hpp> int main() { auto p = make_shared<int>(10); BOOST_TEST(*p = 10); BOOST_TEST(p.unique()); BOOST_TEST_NOT(!p); BOOST_TEST_EQ(p.use_count(), 1); BOOST_TEST_NE(*p, 20); p.reset(); BOOST_TEST(!p); BOOST_TEST_THROWS(*p, std::runtime_error); BOOST_ERROR("error accured~~"); return boost::report_errors(); } 这段代码虽然很短,但是具备了单元测试的各个基本要素,说明了单元测试的基本步骤: * 在main()函数里建立了这个程序的唯一的一个测试用例,同时也是唯一的一个测试套件,测试的对象是boost::shared\_ptr * 然后我们可以使用各种方法操作测试对象,并用BOOST\_TEST系列测试断言宏来验证操作结果: * 如果结果如预期,那么一切都好 * 否则,单元测试框架会向std::cerr输出断言失败的位置和其他相关信息,可以据此跟踪错误发源地,进而纠正错误。 * 单元测试程序运行结束后,我们使用report\_errors()输出本次测试的总结,报告错误的数量 ![在这里插入图片描述][20210518142102984.png] ## 测试元编程 ## * lightweight\_test库也提供了对元编程测试的有限支持,在头文件`<boost/core/lightweight_test_trait.hpp>`里定义了两个编译期的断言: #define BOOST_TEST_TRAIT_TRUE((type)) #define BOOST_TEST_TRAIT_FALSE((type)) * 这两个宏的效果类似BOOST\_STATIC\_ASSERT,但是它们判断的是type::value而不是type本身,所以宏的参数type应该是能够返回bool值的元函数。还需要特别注意的是:由于内部实现的原因,type必须使用`()`包围(宏展开为一个模板函数的参数) #include <boost/core/lightweight_test_trait.hpp> int main() { BOOST_TEST_TRAIT_TRUE((is_integral<int>)); BOOST_TEST_TRAIT_FALSE((is_function<int>)); return boost::report_errors(); } ![在这里插入图片描述][20210518143025369.png] [20210518142102984.png]: /images/20221020/771c26ffbc164c7aade17f0429a8a290.png [20210518143025369.png]: /images/20221020/ced9c0d2ee384fb7b8e3a85941747b6a.png
还没有评论,来说两句吧...