介绍
这个测试框架只有125行的单个头文件。它的目的是提供一种简单的方式来对c++进行单元测试。因为简单,它还能狗容易定制。一些测试框架都需要链接分离的库文件或者经过多次跳转才能工作,这就使得写case是一件非常难得事情了。
其中一种情况是开发人员经常碰到当他们需要写单元测试用例的时候他们已经工作于项目上了。如果这个项目不应独立的库而坏掉,这就很难写出独立的单元测试用例。另外,一些程序的一些核心function不能简单的被破坏成一个单独可执行的用例。实际上,一个开发人员应该写一些单元测试用例,在一个程序内部调用自己的function,可以简单的使用#define。
这看起来不像一种很好的软件工程方法,但是,这些都是尽早测试,通常比其它方法更好,用最小的努力来写测试,最早的完成。测试集合随着项目前进而增长,由于时间限制测试就能集合到一个单独的库和可执行的东东。
我开始寻找一个现成的解决方案。在互联网上有很多xUnit的测试框架,比如Smalltalk SUnit,JUnit,NUnit,CppUnit等等
但是很多框架都有一个共同的就是能够让它的属性在一个function中run起来,或者让其自动的跑起来。C++程序员没有那么幸运,因为需要做很多手工的工作比如宏,模板之类的,尽管不是大的工作。
设计
在评估一些测试框架后,我决定它们都不是能够满足我的简单的而且能够使用修改的要求。我决定写一个测试框架,写到一个头文件中,尽量只包含尽量少的代码。这里列出设计原则:
能够在一个单独的头文件中(没有模块或库)
几百行代码
易于修改扩展
信息输出
可选宏
不要模板
不要动态内存分配
用于嵌入式系统中
用兼容与低级别的C++ compilers (没有超炫的功能)
使用Code
建立case有三件事需要做
一个测试用例test case
一个测试集合test suite
测试集合需要添加到runner然后被调用
写一个case
这个例子中,我们从TestCase基类派生出我们的测试用例
TestCase,像其他的框架的一样,是一个结构体,能够帮助我们避免一些公共访问。
测试code被加到一个测试方法中,TestSuite类含有一切能够让所有测试用例能够访问的任何数据,能够传递到每个测试用例的函数。当测试失败事件是能够输出有意义的输出。
struct TestAclearcase/" target="_blank" >ccountWithdrawal : TestCase
{
const char* name() { return "Account withdrawal test"; }
void test(TestSuite* suite)
{
TestAccountSuite* data = (TestAccountSuite*)suite;
data->account->Deposit(10);
bool succeeded = data->account->Withdraw(11);
T_ASSERT(succeeded == false);
T_ASSERT(data->account->Balance() == 10);
}
};