Browsed by
月份:2012年4月

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函数中进行必要 的清理。那测试套件又在那里呢?我的理解是逻辑上的来讲,整个就是一测试套件。

  • 测试执行

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

googlemock中遇到pthread问题

googlemock中遇到pthread问题

今天在搭建googlemock的环境,以前都没有出过问题,今天居然碰到了, 直接checkout googlemock的代码,然后到make文件夹下面直接make,居然连接的时候连接不上,报pthread中的东西找不到。 各种check:

  • 连接参数是否有 -lpthread有
  • locate pthread系统中也有
  • g++ -print-search-dirs 前面找到的库也在路径中
  • 直接把找到的pthread路径用-L写在makefile中还是报错

经过上面的步骤我觉得应该是能够解决我的问题的,什么状况,感觉超出了我的能力。。。

经过各种google,都没有找出问题来。

没办法了,各种尝试,记得最后成功的方式:把-lpthread放到了连接参数的后面,看下面的diff

--- Makefile    (revision 404)
+++ Makefile    (working copy)
@@ -95,4 +95,4 @@
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/gmock_test.cc

gmock_test : gmock_test.o gmock_main.a
-       $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
+       $(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@ -lpthread

初步原因,这个取决于连接器在链接是加载文件的顺序有关系:

g++ -o gmock_test gmock_test.o gmock_main.a -lpthread

上面是我可以成功编译的命令,可以看出加载的顺序是从右到左的。

从这个文档可以看到下面的解释:<http://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Link-Options.html#Link-Options>

Note

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, ‘foo.o -lz bar.o’ searches library ‘z’ after file foo.o but before bar.o. If bar.o refers to functions in ‘z’, those functions may not be loaded.

不过看起来这个说明和我遇到的实际情况刚好相反,没有继续求证,但应该就是这个问题。 所以以后编译链接有问题 链接器的加载顺序 需要考虑