由于不同的项目分别使用了cxxtest和gtest不同的UT测试框架,所以对它们有点了解。总体来说,gtest功能比较强大,但相对复杂一点。
cxxtest的测试用例是先写到一个.h的文件里,然后用脚本把它转成.cpp的文件,看起来有点别扭,但集成到你的makefile里,也是比较简单的。不过它有个麻烦的地方是你要先装个perl或者python。
它的例子如下:
class SampletestSuite : publicCxxTest::TestSuite
{
public:
//定义测试,以test作为测试函数前缀,
//这是cxxtestgen.pl或cxxtestgen.py对测试文件进行扫描,抽取测试用例的依据
void testMultiplication(void )
{
TS_ASSERT_EQUALS( 2 * 2, 5 );
}
};
如果要在每个用例之前执行环境准备工作可以在setUp();函数里添加。如果要在每个用例之后执行一些清理工作则在tearDown();函数里实现。这两个函数实现时都包含在测试类里面。
gtest则直接在.cpp文件里写你的测试用例,不用工具转换,这点省事一点。你写测试用例时需要使用它的宏来声明你用例。例如:TEST(SUITECASENAME,TESTCASENAME){}。gtest重要的地方是它的功能比较强大。它支持参数化测试。在你需要考虑给被测函数传入不同的值的情况时非常有用。同时gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作。总结一下gtest的事件一共有3种:
1. 全局的,所有案例执行前后。
2. TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。
3. TestCase级别的,每个TestCase前后。
但是要实现上面的功能,都有一些额外的要求。比如:要实现第三情况:需要写一个类,继承testing::Test,然后再实现的是SetUp方法和TearDown方法,同时在编写测试案例时,还需要使用TEST_F这个宏,相对cxxtest有点罗嗦。下面是个例子:
class FooCalcTest:public testing::Test
{
protected:
virtual void SetUp()
{
m_foo.Init();
}
virtual void TearDown()
{
m_foo.Finalize();
}
FooCalc m_foo;
};
TEST_F(FooCalcTest, HandleNoneZeroInput)
{
EXPECT_EQ(4, m_foo.Calc(12, 16));
}
TEST_F(FooCalcTest, HandleNoneZeroInput_Error)
{
EXPECT_EQ(5, m_foo.Calc(12, 16));
}
总结:如果你没有啥特殊要求,写用例简单至上,你可以考虑cxxtest;如果你需要考虑特殊的应用场景,可以考虑gtest,它功能强大。
其他gtest 相关的的文章可以看http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html
这篇博客对比了CxxTest和Google Test两个单元测试框架。CxxTest需要通过Perl或Python脚本将测试用例转换为.cpp文件,而Google Test可以直接在.cpp文件中编写,功能更加强大,如支持参数化测试和多种事件机制。CxxTest集成到makefile简单,但需要额外安装Perl或Python。对于没有特殊需求的简单用例,CxxTest是一个不错的选择;而面对复杂应用场景,推荐使用Google Test。
1050

被折叠的 条评论
为什么被折叠?



