我有一些日志在我的应用程序(它恰好是log4cxx,但我是灵活的),我有一些单元测试使用boost单元测试框架。当我的单元测试运行时,我从通过和失败的测试中获得大量日志输出(不仅是boost断言日志,还有我自己的应用程序代码的调试日志)。我想让单元测试框架在通过测试期间丢弃日志,并从失败的测试中输出日志(我在使用python/nose时逐渐欣赏这种行为)。
是否有一些标准的方式这样做与boost单元测试框架?如果没有,是否有一些测试的开始/结束的测试挂钩,我可以用它来缓冲我的日志和有条件地输出它们来实现这种行为自己?
您可以为此目的使用测试开始和测试结束钩子。要设置这些钩子,您需要定义boost::unit_test::test_observer的子类,创建将在整个测试中持续存在的类的实例(静态全局对象或BOOST_TEST_GLOBAL_FIXTURE),然后将类传递给boost::unit_test::framework::register_observer。
用开始测试钩子重写的方法是test_unit_start
,用结束测试钩子重写的方法是test_unit_finish
。然而,这些钩子既可以触发测试套件,也可以触发单独的测试用例,这可能是一个问题,取决于钩子的设置方式。test_unit_finish
挂钩也不能明确地告诉你某项测试是否通过了,而且似乎也没有一种清晰明显的方法来获取这一信息。有一个boost::unit_test::results_collector单例,它有一个results()方法,如果您将提供给test_unit_finish
的测试单元的test_unit_id
传递给它,您将得到一个test_results对象,它有一个passed()方法。我真的看不到一种方法来获得test_unit_id
,这显然是公共API的一部分——你可以直接访问p_id成员,但这可能会在未来的增强版本中发生变化。您还可以使用来自test_observer子类的assertion_result
、exception_caught
、test_unit_aborted
和test_unit_timed_out
钩子手动跟踪每个测试是否通过或失败(assertion_result
表示当前测试失败,只要它的参数为false,其他钩子表示失败,如果它被调用)。
根据Boost。测试文档,用--log_level=error
运行你的测试可执行文件。这将只捕获失败的测试用例。
我检查了它使用BOOST_CHECK(false)
在一个有几千个单元测试的正常运行的项目上工作。
使用--log_level=all
运行会得到所有断言的结果。我检查了通过管道到wc -l
,日志中的行数与测试中的断言数完全相同(该数字也由--report_level=detailed
报告)。当然,您也可以grep
字符串error
或failed
的日志。