googletest和xUnit架构

googletest和xUnit架构

对于C++的测试,现在我知道两个cppunit和googletest。虽然他们都是写写xUnit构的,但是我偏向于喜欢googletest,可能是自己用得比较熟悉的原因。

什么是xUnix架构

我的一些简单理解,最先那个谁写了一个测试框架,然后大家都用,并且大家后来都觉得这种方式还不错,就这样成了惯例,然后在其他语言也有人根据这种模式写出类似的测试框架,不断的发展就成了xUnit框架,狭义的来讲x泛指各种语言。

xUnit有一些简单的概念:

  • Testcase 测试用例
    单元测试的基本单元,用来描述一个测试点 完整的测试由很多的测试用例构成
  • Testfixture 测试固件(测试上下文)
    我觉得翻译为 测试上下文 比较好理解,根据这个翻译就可以看出,测试上下 文就是为了给测试用例提供一个上下文。
  • Testsuit 测试套件
    把很多测试用例放到一起,共享相同的测试上下文,这就是一测试套件
  • Test execution 测试执行
    规定了测试用例的执行策略,比如为每个测试用例先建立测试上下文,然后运行测 试用例,对上下文进行清理
  • Test Assertions 测试断言
    断言这个比较容易理解,即使不再测试架构里面也有用。

满足上面的所以概念,他就xUnit了,so easy!

googletest对应于xUnit

  • 测试用例 与 断言
TEST(test_case_name, testname)
{
        ASSERT_EQ(1,1);
}

这个代码是一个 测试用例 的例子,在googletest中,在同一个测试用例下可以有 很多不同名字的测试,testname需要不一样。 断言 也出现在了上面的代码中,googletest中还有各种断言。

  • 测试固件 与 测试套件
class MyTest : public ::testing::Test
{
        protected:
                MyTest(){}
                virtual ~MyTest(){}

                virtual void SetUp(){}
                virtual void TearDown(){}
};

TEST_F( MyTest, TEST_NAME_1 )
{
        ASSERT_EQ(1,1);
}

TEST_F( MyTest, TEST_NAME_2 )
{
        ASSERT_EQ(1,1);
}

在googletest里面,需要固件就让你的testcase从::testing::Test派生出来。那测试 固件在那里呢?就在于通过这种方式,可以为你的测试用例提供一个上下文,你可以在 构造函数,SetUp函数中准备你的上下文,然后在析构函数和TearDown函数中进行必要 的清理。那测试套件又在那里呢?我的理解是逻辑上的来讲,整个就是一测试套件。

  • 测试执行

那测试套件的执行来说,就是创建测试上下文,执行测试用例下面的一个测试,清理上下文。然后从新再来