读《玩转GTest》http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html
0. 杂问
Q:如何让VC6运行gtest1.6?
1. 生成并使用gtest库
* 生成库
# ./configure
#./make
注:所有库文件在${home}/lib/.libs目录中
* 使用库
Makefile文件
[root@localhost frank-study]# make clean
rm -f FooTest gtest.a gtest_main.a *.o
[root@localhost frank-study]# make
g++ -I../include -g -Wall -Wextra -c ./Foo.cpp
g++ -g -Wall -Wextra -I../include -c -o FooTest.o FooTest.cpp
g++ -I../include -g -Wall -Wextra -lpthread -lgtest_main -L../lib/.libs Foo.o FooTest.o -o FooTest
[root@localhost frank-study]# ./FooTest
./FooTest: error while loading shared libraries: libgtest_main.so.0: cannot open shared object file: No such file or directory
[root@localhost frank-study]#
处理方法:将libgtest_main.so.0拷至/usr/lib
[root@localhost .libs]# cp libgtest_main.so.0 /usr/lib
[root@localhost frank-study]# ./FooTest
Running main() from gtest_main.cc
[==========] Running 2 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 1 test from FooTest
[ RUN ] FooTest.HandleNoneZeroInput
FooTest.cpp:6: Failure
Value of: Foo(30,18)
Actual: 6
Expected: 5
[ FAILED ] FooTest.HandleNoneZeroInput (4 ms)
[----------] 1 test from FooTest (7 ms total)
[----------] 1 test from FooTest2
[ RUN ] FooTest2.HandleNoneZeroInput
[ OK ] FooTest2.HandleNoneZeroInput (0 ms)
[----------] 1 test from FooTest2 (3 ms total)
[----------] Global test environment tear-down
[==========] 2 tests from 2 test cases ran. (32 ms total)
[ PASSED ] 1 test.
[ FAILED ] 1 test, listed below:
[ FAILED ] FooTest.HandleNoneZeroInput
1 FAILED TEST
Q:如何系统地安装.so文件?
Q:why gtest的make install不work ?
Q:why static lib libgtest_main.a不能link?从文件大小上看,libgtest_main.a未能build进FooTest
2. 《初识gtest》
* TEST(FooTest, HandleNoneZeroInput)
[TestCaseName,TestName],而我对这两个参数的定义是:[TestSuiteName,TestCaseName]
3. 《断言》
* ASSERT_* 系列的断言,当检查点失败时,退出当前测试
* EXPECT_* 系列的断言,当检查点失败时,继续往下测试
例子:
[root@localhost frank-study]# vi FooTest.cpp
#include <gtest/gtest.h>
extern int Foo(int, int);
TEST(FooTest, HandleNoneZeroInput) {
EXPECT_EQ(2, Foo(4,10)) << "Hi!";
EXPECT_EQ(5, Foo(30,18)) << "Hello! 1";
//ASSERT_EQ(5, Foo(30,18)) << "Assert Failed !" ;
EXPECT_EQ(5, Foo(30,18)) << "Hello! 2";
EXPECT_EQ(5, Foo(30,18)) << "Hello! 3";
}
TEST(FooTest2, HandleNoneZeroInput) {
EXPECT_EQ(2, Foo(4,10));
EXPECT_EQ(6, Foo(30,18)) << "Hi ther!";
}
问题:throw
int Foo(int a, int b) {
if (a==0 || b==0) {
throw "don't do that";
}
int c=a%b;
if(c==0) {
return b;
}
return Foo(b,c);
}
[ RUN ] FooTest3.HandleZeroInput
FooTest.cpp:20: Failure
Expected: Foo(0,5) throws an exception of type char*.
Actual: it throws a different type.
^ WHY ???
[ FAILED ] FooTest3.HandleZeroInput (6 ms)
3. 《事件机制》
1. 全局的,所有案例执行前后。
[root@localhost frank-study]# make
g++ -g -Wall -Wextra -I../include -c -o FooTest.o FooTest.cpp
FooTest.cpp: In function ‘int main(int, char**)’:
FooTest.cpp:26: 错误:expected type-specifier before ‘FooEnvironment’
FooTest.cpp:26: 错误:expected `)' before ‘FooEnvironment’
FooTest.cpp:26: 错误:不能从 ‘int*’ 转换到 ‘testing::Environment*’,为实参 ‘1’(属于 ‘testing::Environment* testing::AddGlobalTestEnvironment(testing::Environment*)’)
A:FooTest.cpp中,需要定义FooEnvironment类,如下:
#include "FooEnvironment.cpp"
[root@localhost frank-study]# make
g++ -g -Wall -Wextra -I../include -c -o FooTest.o FooTest.cpp
FooEnvironment.cpp: In member function ‘virtual void FooEnvironment::SetUp()’:
FooEnvironment.cpp:4: 错误:‘out’ 不是 ‘std’ 的成员
FooEnvironment.cpp: In member function ‘virtual void FooEnvironment::TearDown()’:
FooEnvironment.cpp:8: 错误:‘out’ 不是 ‘std’ 的成员
make: *** [FooTest.o] 错误 1
A:应该为std::cout
[root@localhost frank-study]# make
make: *** 没有规则可以创建“FooEnvironment.o”需要的目标“Environment.cpp”。 停止。
A:规则中文件名错误,应该为FooEnvironment.cpp而非Environment.cpp
[root@localhost frank-study]# make
g++ -I../include -g -Wall -Wextra -c ./FooEnvironment.cpp
./FooEnvironment.cpp:3: 错误:‘testing’ 未声明
./FooEnvironment.cpp:3: 错误:expected `{' before ‘Environment’
./FooEnvironment.cpp:3: 错误:无效的函数声明
A:缺少#include <gtest/gtest.h>
2. TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。
3. TestCase级别的,每个TestCase前后