snail源代码分析, 提取了一个c++的单元测试框架
来源:互联网 发布:算法竞赛入门经典2pdf 编辑:程序博客网 时间:2024/06/06 20:13
c++的单元测试框架有很多中了, 据说bcb2007里面就包含了一个单元测试框架, 不过没怎么用过.
其他的不甚了了.
snail的源代码中, 包含了一个c++的unittest框架, 差不多可以叫做SLUnit .
可以阅读其源代码, 其实写得东西很少. 其基本思想我们在这里描述一下.
呵呵, 听说junit是作者在坐飞机的时候写出来的, 可想而知, 单元测试, 在于思想, 不在于表现. 理解的人, 可以一下悟到, 不理解的, 也可以先用着工具, 将来也能一下豁然开朗.
junit和nunit都是基于反射来实现单元测试的. 所以, 只需要写一些metadata或者对方法的名字有所规定, 就能实现一个testcase, 由framework来执行这些testcase.
c++在metadata, rtti方面的支持比较弱. 所以企图靠metadata, 方法命名来做这件事情的尝试, 肯定是行不通了.
不过, 思想还是一样的. metadata, 从本质而言, 是一些额外的类型,等信息, 还有一些是编译器生成的, 还有一些是认为自定义的. 既然是一些额外的信息, 那么我们在做cpp的单元测试框架的时候, 需要手工添加一些额外信息就可以了.
此外c++里面有宏可以利用, 可以减少一些书写这些metadata的书写工作.
还有一个功能就是: 出错, 报告之后, 定位. 报告哪里出的错误. 这个需要用到__LINE__, __FILE__等信息了..
好了闲话少说. 帖一段代码, 呵呵很简单东西也很少.:
#ifndef __SUNIT_HPP__
#define __SUNIT_HPP__
/*
** simple unit test framework for c++
** author: bianpeng
** date: 2008-01-31
** license: apache 2.0
*/
#include <vector>
#include <string>
#include <iostream>
namespace sunit {
class SUnitFrameWork;
/// use for non pointer compare
template<class T>
bool _CheckEquals(const T & a, const T & b) {
return a == b;
}
/// use for pointer compare
template<class T>
bool _CheckEquals(T * a, T * b) {
return *a == *b;
}
#define AssertEqual(a, b) /
_AssertEqual(a, b, __FILE__, __LINE__);
#define __CHECK_EQUAL__(a, b) /
do { /
if (!_CheckEquals(a, b)) { /
char strBuf[50];strBuf[49]=0;sprintf_s(strBuf, 49, "%d", line); /
SUnitFrameWork::Instance()->Console()->Write(file); /
SUnitFrameWork::Instance()->Console()->Write(": "); /
SUnitFrameWork::Instance()->Console()->WriteLn(strBuf); /
} /
} while(0);
template<class T>
void _AssertEqual(const T & a, const T & b, const char * file, const int line) {
__CHECK_EQUAL__(a, b);
}
template<class T>
void _AssertEqual(T * a, T * b, const char * file, const int line) {
__CHECK_EQUAL__(a, b);
}
// 保证肯定有一个实例化的测试用例,
template<class T>
class SingletonTestCase {
protected:
static T * _instance;
};
template<class T>
T * SingletonTestCase<T>::_instance = new T;
class SUnitTestCase {
public:
SUnitTestCase();
~SUnitTestCase();
public:
virtual void SetUp() {}
virtual void Run() {}
virtual void TearDown() {}
};
class SUnitConsole {
public:
virtual void WriteLn(const std::string & msg) = 0;
virtual void Write(const std::string & msg) = 0;
};
class SUnitFrameWork {
private:
std::vector<SUnitTestCase*> _testCases;
static SUnitFrameWork * _instance;
SUnitConsole * _console;
public:
void RunConsole();
void RunGUI();
public:
static SUnitFrameWork * Instance() {
if (!_instance) {
_instance = new SUnitFrameWork();
}
return _instance;
}
void Add(SUnitTestCase * test) {
_testCases.push_back(test);
}
SUnitConsole * Console() {
return _console;
}
};
};
/// some usefull testcase implementation...
#define CLASS_DEF(name) /
class SUnitTestcase_##name : /
public sunit::SUnitTestCase, /
public SingletonTestCase<SUnitTestcase_##name> { /
private: /
void Dummy() { (void)_instance;} /
public:
#define CLASS_END /
};
#define METHOD_IMPL(_ClassName, _MethodName) /
SUnitTestcase_##_ClassName::_MethodName
#endif //__SUNIT_HPP__
其他的不甚了了.
snail的源代码中, 包含了一个c++的unittest框架, 差不多可以叫做SLUnit .
可以阅读其源代码, 其实写得东西很少. 其基本思想我们在这里描述一下.
呵呵, 听说junit是作者在坐飞机的时候写出来的, 可想而知, 单元测试, 在于思想, 不在于表现. 理解的人, 可以一下悟到, 不理解的, 也可以先用着工具, 将来也能一下豁然开朗.
junit和nunit都是基于反射来实现单元测试的. 所以, 只需要写一些metadata或者对方法的名字有所规定, 就能实现一个testcase, 由framework来执行这些testcase.
c++在metadata, rtti方面的支持比较弱. 所以企图靠metadata, 方法命名来做这件事情的尝试, 肯定是行不通了.
不过, 思想还是一样的. metadata, 从本质而言, 是一些额外的类型,等信息, 还有一些是编译器生成的, 还有一些是认为自定义的. 既然是一些额外的信息, 那么我们在做cpp的单元测试框架的时候, 需要手工添加一些额外信息就可以了.
此外c++里面有宏可以利用, 可以减少一些书写这些metadata的书写工作.
还有一个功能就是: 出错, 报告之后, 定位. 报告哪里出的错误. 这个需要用到__LINE__, __FILE__等信息了..
好了闲话少说. 帖一段代码, 呵呵很简单东西也很少.:
#ifndef __SUNIT_HPP__
#define __SUNIT_HPP__
/*
** simple unit test framework for c++
** author: bianpeng
** date: 2008-01-31
** license: apache 2.0
*/
#include <vector>
#include <string>
#include <iostream>
namespace sunit {
class SUnitFrameWork;
/// use for non pointer compare
template<class T>
bool _CheckEquals(const T & a, const T & b) {
return a == b;
}
/// use for pointer compare
template<class T>
bool _CheckEquals(T * a, T * b) {
return *a == *b;
}
#define AssertEqual(a, b) /
_AssertEqual(a, b, __FILE__, __LINE__);
#define __CHECK_EQUAL__(a, b) /
do { /
if (!_CheckEquals(a, b)) { /
char strBuf[50];strBuf[49]=0;sprintf_s(strBuf, 49, "%d", line); /
SUnitFrameWork::Instance()->Console()->Write(file); /
SUnitFrameWork::Instance()->Console()->Write(": "); /
SUnitFrameWork::Instance()->Console()->WriteLn(strBuf); /
} /
} while(0);
template<class T>
void _AssertEqual(const T & a, const T & b, const char * file, const int line) {
__CHECK_EQUAL__(a, b);
}
template<class T>
void _AssertEqual(T * a, T * b, const char * file, const int line) {
__CHECK_EQUAL__(a, b);
}
// 保证肯定有一个实例化的测试用例,
template<class T>
class SingletonTestCase {
protected:
static T * _instance;
};
template<class T>
T * SingletonTestCase<T>::_instance = new T;
class SUnitTestCase {
public:
SUnitTestCase();
~SUnitTestCase();
public:
virtual void SetUp() {}
virtual void Run() {}
virtual void TearDown() {}
};
class SUnitConsole {
public:
virtual void WriteLn(const std::string & msg) = 0;
virtual void Write(const std::string & msg) = 0;
};
class SUnitFrameWork {
private:
std::vector<SUnitTestCase*> _testCases;
static SUnitFrameWork * _instance;
SUnitConsole * _console;
public:
void RunConsole();
void RunGUI();
public:
static SUnitFrameWork * Instance() {
if (!_instance) {
_instance = new SUnitFrameWork();
}
return _instance;
}
void Add(SUnitTestCase * test) {
_testCases.push_back(test);
}
SUnitConsole * Console() {
return _console;
}
};
};
/// some usefull testcase implementation...
#define CLASS_DEF(name) /
class SUnitTestcase_##name : /
public sunit::SUnitTestCase, /
public SingletonTestCase<SUnitTestcase_##name> { /
private: /
void Dummy() { (void)_instance;} /
public:
#define CLASS_END /
};
#define METHOD_IMPL(_ClassName, _MethodName) /
SUnitTestcase_##_ClassName::_MethodName
#endif //__SUNIT_HPP__
- snail源代码分析, 提取了一个c++的单元测试框架
- 一个简单的C++单元测试框架
- [PYTHON]一个简单的单元测试框架
- PyQt的一个UI单元测试框架思路
- CPPUTest 单元测试框架(针对 C 单元测试的使用说明)
- c语言实现一个单元测试框架(Unit Test Framework)
- c语言实现一个单元测试框架(Unit Test Framework)代码
- C语言单元测试框架
- C语言单元测试框架
- Android单元测试框架源码分析(三)构建自己的单元测试框架
- Google 开源了自己的 C++ 单元测试框架 : googletest
- 看了GAL游戏资源文件黑盒分析,想起以前做的一个提取器,发来大家共享一下
- 分析 JUnit 框架源代码
- 分析 JUnit 框架源代码
- 分析 JUnit 框架源代码
- fleaphp框架源代码分析
- 分析 JUnit 框架源代码
- 分析 JUnit 框架源代码
- CTI技术常见名词解释
- Asterisk 配置文件
- Asterisk 可加载模块
- Zapata配置
- Zaptel配置
- snail源代码分析, 提取了一个c++的单元测试框架
- 开发标准的JMX MBean服务
- 如何提高工作效率!
- .net基础知识总结
- 一目了然电脑配置的火眼金睛是如何练成的
- 说说Lib和Dll
- 最简单的spring示例
- C++中的内存划分
- 操作系统内核:Linux Kernel 2.6.24发布