gtest 的彩色信息输出 + boost.test 的内存泄漏检测及定位


gtest  的彩色信息输出 + boost.test 的内存泄漏检测及定位

 
/* Author : Andrew.Wu    [ Created on : 2009/04/29 - Last Modified On  : 2009/05/02 ] 
http://blog.youkuaiyun.com/WuErPing/archive/2009/04/29/4136920.aspx

*/
 
gtest 的彩色信息显示看起来比较醒目,boost。test 的内存泄漏检查很实用。真希望两个功能在一个库里,可以省不少事情。不过如果想在作者们没有这么做之前结合使用这两个功能,下面的方法可以试。

 
1: #include <iostream>
2:
3: #include <gtest/gtest.h>
4: #pragma comment(lib, "gtestd_d.lib")
5:
6: #include <boost/test/unit_test.hpp>
7:
8: TEST(FooTest, test)
9: {
10: char *t = new char[2];
11: EXPECT_EQ(3, 3);
12: EXPECT_EQ(2, 3);
13: }
14:
15: using boost::unit_test::test_case;
16: void testf()
17: {
18: char *t = new char[2];
19: BOOST_CHECK(3 == 3);
20: BOOST_CHECK(2 == 3);
21: }
22:
23: using boost::unit_test::test_suite;
24: test_suite* init_unit_test_suite( int argc, char* argv[] )
25: {
26: std::cout << " gtest.../n";
27: ::testing::InitGoogleTest(&argc, argv);
28: ::testing::UnitTest::GetInstance()->Run();
29:
30: std::cout << "/n/n boost.test.../n";
31: test_suite* ts = BOOST_TEST_SUITE( "" );
32: ts->add( BOOST_TEST_CASE( &testf ) );
33: return ts;
34: }

 
(具体使用 test case 时只用 gtest 的即可,里面两者都写仅仅是为了有个对比)
 
gtest 1.3.0
http://code.google.com/p/googletest/
booost 1.8.0
http://www.boost.org/
 
output: 

 
 
windows mfc 程序定位实例 :
场景1:

Detected memory leaks!
Dumping objects ->
f:/dd/vctools/vc7libs/ship/atlmfc/src/mfc/strcore.cpp(141) : {1081} normal block
 at 0x0038F448, 30 bytes long.
 Data: <   x            > 0C 00 E5 78 06 00 00 00 06 00 00 00 01 00 00 00
f:/dd/vctools/vc7libs/ship/atlmfc/src/mfc/inet.cpp(509) : {1080} client block at
 0x01268148, subtype c0, 28 bytes long.
a CHttpConnection object at $01268148, 28 bytes long
Object dump complete.

 
--
inet.cpp(509) : {1080}
inet.cpp 的第 509 行分配的内存
specified object allocation order number 1080
--
 
找到本机对应的文件
C:/Program Files/Microsoft Visual Studio 9.0/VC/atlmfc/src/mfc/inet.cpp
 
找到相应的行
CHttpConnection* CInternetSession::GetHttpConnection(LPCTSTR pstrServer,
 INTERNET_PORT nPort /* = INTERNET_INVALID_PORT_NUMBER */,
 LPCTSTR pstrUserName /* = NULL */, LPCTSTR pstrPassword /* = NULL */)
{
 ASSERT(AfxIsValidString(pstrServer));
       // line 509
 CHttpConnection* pResult = new CHttpConnection(this,
  pstrServer, nPort, pstrUserName, pstrPassword, m_dwContext);
 return pResult;
}
 
如此应该是有这个函数的调用者没有清理返回的 CHttpConnection*,搜索调用代码发现果然如此
 
场景2:
内存泄漏检测信息中没有文件名及行号
Detected memory leaks!
Dumping objects ->
{1080} normal block at 0x00C28148, 1 bytes long.
 Data: < > CD
Object dump complete.

 
 
在程序的开始加入 _CrtSetBreakAlloc(1080);
--

 
Start debugging
在此内存分配的位置(但不精确)会停下来提示

xxx.exe has triggered a breakpoint


当然,还是有文件名与行号省事,试试在文件适当位置加入
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//#define DEBUG_NEW new(THIS_FILE, __LINE__)
 
如此就可以象上面一样看到文件名及行号
 
Detected memory leaks!
Dumping objects ->
d:/work/xxx/xxx.cpp(167)
 : {1080} normal block at 0x00C28148, 1 bytes long.
 Data: < > CD
Object dump complete.

 
 
 
Sets a breakpoint on a specified object allocation order number (debug version only).
--

07-16
### C++ 单元测试框架 C++ 提供了多种单元测试框架,这些框架可以帮助开发者编写和运行测试用例,以确保代码的正确性和稳定性。常见的 C++ 单元测试框架包括 **Google Test (GTest)**、**CppUnit**、**Boost.Test**、**CppUTest** 和 **CxxTest** 等。这些框架通常提供断言宏、测试套件管理、自动化测试等功能,简化了单元测试的开发和维护过程。 #### Google Test (GTest) Google Test 是由 Google 开发的一个开源测试框架,广泛用于 C++ 项目的单元测试。它支持多种断言方式,并允许开发者通过 `TEST()` 和 `TEST_F()` 宏定义测试用例和测试套件。例如,可以使用 `TEST_F()` 来定义一个基于测试夹具(Fixture)的测试用例,这样可以在多个测试之间共享一些初始化和清理代码 [^4]。 #### CppUnit CppUnit 是 XUnit 家族的一员,最初是从 JUnit 移植而来,适用于 C++ 语言的单元测试。它提供了一套完整的测试框架,支持测试用例的组织、执行和结果报告。CppUnit 的设计思想来源于极限编程(Extreme Programming),强调自动化测试和持续集成 [^2]。 #### Boost.Test Boost.TestBoost 库的一部分,功能强大且灵活。它支持自动注册和手动注册测试用例的方式,适合需要高度定制化测试流程的项目。Boost.Test 的优势在于其与 Boost 库的紧密集成,使得在使用其他 Boost 组件的项目中,测试代码的编写更加便捷 [^1]。 #### CppUTest CppUTest 是一个专为嵌入式系统设计的轻量级测试框架,支持多种操作系统。它的特点是宏设计简单,即使不熟悉 C++ 的程序员也可以轻松使用。CppUTest 使用 C++ 的子集,避免了对复杂语言特性的依赖,适合在资源受限的环境中进行开发 [^1]。 #### CxxTest CxxTest 是一个基于 C++ 的测试框架,提供了代码生成工具,帮助开发者自动生成测试代码框架。测试人员可以通过定义测试用例和测试方法来验证代码的行为。CxxTest 的断言宏可以检测预期结果与实际结果之间的差异,并在不匹配时记录错误 [^1]。 ### C++ 测试工具 除了单元测试框架外,还有一些辅助工具可以帮助开发者进行更高效的测试工作。例如: - **CTest**:CMake 项目的一部分,用于管理和执行测试用例,支持并行执行和结果汇总。 - **CTest + CDash**:CTest 可以与 CDash 结合使用,提供测试结果的可视化展示,便于团队协作和持续集成。 - **Valgrind**:虽然不是专门的测试工具,但 Valgrind 可以帮助检测内存泄漏和非法内存访问等问题,常用于测试阶段的调试。 ### C++ 测试方法 C++ 的测试方法主要包括 **单元测试**、**集成测试** 和 **系统测试** 等。其中,单元测试是最基础也是最重要的测试类型,它专注于验证单个函数或类的功能是否符合预期。 #### 单元测试 单元测试的目标是验证程序中最小可测试单元的正确性。通常,每个单元测试都应独立于其他测试,确保测试结果的可重复性和准确性。Google Test 和 CppUnit 等框架提供了丰富的断言宏,帮助开发者编写清晰、简洁的测试用例 [^3]。 #### 集成测试 集成测试是在所有模块完成单元测试后进行的,目的是验证模块之间的接口和交互是否正确。集成测试可以发现单元测试中未暴露的问题,如模块间的数据传递错误或同步问题。 #### 系统测试 系统测试是对整个系统的全面测试,涵盖功能、性能、安全等多个方面。系统测试通常在接近真实运行环境的条件下进行,确保系统能够满足用户需求和业务目标。 ### 示例代码 以下是一个使用 Google Test 编写的简单计算器类的单元测试示例: ```cpp #include "calculator.h" #include "gtest/gtest.h" // 定义测试集合 class CalculatorTest : public ::testing::Test { protected: Calculator calc; // 实例化 Calculator 对象 }; // 测试加法 TEST_F(CalculatorTest, Add) { EXPECT_EQ(calc.add(1, 2), 3); EXPECT_EQ(calc.add(-1, 1), 0); EXPECT_EQ(calc.add(-1, -1), -2); } // 测试减法 TEST_F(CalculatorTest, Subtract) { EXPECT_EQ(calc.subtract(10, 5), 5); EXPECT_EQ(calc.subtract(3, 5), -2); EXPECT_EQ(calc.subtract(-1, -1), 0); } ``` ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值