gtest提供了一种机制,可以为同一用例中的全部测试设定一个相同的初始环境,并且在完成每一测试后进行后处理。可以继承testing::Test类,将类名指定为用例的名字,并在子类中实现两个虚函数SetUp和TearDown(其中SetUp用于初始化,而TearDown则用于释放空间之类的收尾操作),然后可以用TEST_F宏代替TEST宏进行测试。
示例如下:
#include <gtest/gtest.h>
#include <string>
#include <iostream>
class Say{
public:
std::string prefix;
std::string SayAWord(std::string word){
return prefix + word;
}
};
class TEST_STRING : public testing::Test{
protected:
Say _s;
virtual void SetUp() {
std::cout<<"In SetUp()"<<std::endl;
_s.prefix = "Say ";
}
virtual void TearDown() {
std::cout<<"In TearDown()"<<std::endl;
}
};
TEST_F(TEST_STRING, BLANK){
EXPECT_STREQ("Say ",_s.SayAWord("").c_str());
}
TEST_F(TEST_STRING, STRING){
EXPECT_STREQ("Say hello",_s.SayAWord("hello").c_str());
EXPECT_STREQ("Say hello",_s.SayAWord("bye").c_str());
}
int main(int argc, char* argv[]){
testing::InitGoogleTest(&argc,argv);
RUN_ALL_TESTS();
return 0;
}
在这个例子中,我们可以在TEST_STRING类中指定要测试的Say类中的prefix,那么每一个测试中,则不需要再指定prefix的内容。这个程序的运行结果如下所示:
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from TEST_STRING
[ RUN ] TEST_STRING.BLANK
In SetUp()
In TearDown()
[ OK ] TEST_STRING.BLANK
[ RUN ] TEST_STRING.STRING
In SetUp()
d:/my documents/visual studio 2008/projects/try_gtest/try_gtest/try_test_f.h(38)
: error: Value of: _s.SayAWord("bye").c_str()
Actual: "Say bye"
Expected: "Say hello"
In TearDown()
[ FAILED ] TEST_STRING.STRING
[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran.
[ PASSED ] 1 test.
[ FAILED ] 1 test, listed below:
[ FAILED ] TEST_STRING.STRING
1 FAILED TEST
根据结果,我们可以看到每个测试开始后,首先进入SetUp,然后进行测试,最后进入TearDown,即gtest为每一个测试都创建了一个TEST_STRING类的对象。对于同一个用例,不能够把TEST_F和TEST宏混用,如果在TEST_STRING.BLANK后面加入如下的测试:
TEST(TEST_STRING, TEST_ERROR){
EXPECT_STREQ("Say ","Say ");
}
那么会得到如下的报错信息:
[ RUN ] TEST_STRING.TEST_ERROR
../src/gtest.cc(1962): error: Failed
All tests in the same test case must use the same test fixture
class, so mixing TEST_F and TEST in the same test case is
illegal. In test case TEST_STRING,
test BLANK is defined using TEST_F but
test TEST_ERROR is defined using TEST. You probably
want to change the TEST to TEST_F or move it to another test
case.
[ FAILED ] TEST_STRING.TEST_ERROR
实际上,使用TEST宏时,相当于建立了一个SetUp和TearDown都为空的类,及相当于一个复制了一个testing::Test类,并且命名为用例的名字。
示例如下:
#include <gtest/gtest.h>
#include <string>
#include <iostream>
class Say{
public:
std::string prefix;
std::string SayAWord(std::string word){
return prefix + word;
}
};
class TEST_STRING : public testing::Test{
protected:
Say _s;
virtual void SetUp() {
std::cout<<"In SetUp()"<<std::endl;
_s.prefix = "Say ";
}
virtual void TearDown() {
std::cout<<"In TearDown()"<<std::endl;
}
};
TEST_F(TEST_STRING, BLANK){
EXPECT_STREQ("Say ",_s.SayAWord("").c_str());
}
TEST_F(TEST_STRING, STRING){
EXPECT_STREQ("Say hello",_s.SayAWord("hello").c_str());
EXPECT_STREQ("Say hello",_s.SayAWord("bye").c_str());
}
int main(int argc, char* argv[]){
testing::InitGoogleTest(&argc,argv);
RUN_ALL_TESTS();
return 0;
}
在这个例子中,我们可以在TEST_STRING类中指定要测试的Say类中的prefix,那么每一个测试中,则不需要再指定prefix的内容。这个程序的运行结果如下所示:
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from TEST_STRING
[ RUN ] TEST_STRING.BLANK
In SetUp()
In TearDown()
[ OK ] TEST_STRING.BLANK
[ RUN ] TEST_STRING.STRING
In SetUp()
d:/my documents/visual studio 2008/projects/try_gtest/try_gtest/try_test_f.h(38)
: error: Value of: _s.SayAWord("bye").c_str()
Actual: "Say bye"
Expected: "Say hello"
In TearDown()
[ FAILED ] TEST_STRING.STRING
[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran.
[ PASSED ] 1 test.
[ FAILED ] 1 test, listed below:
[ FAILED ] TEST_STRING.STRING
1 FAILED TEST
根据结果,我们可以看到每个测试开始后,首先进入SetUp,然后进行测试,最后进入TearDown,即gtest为每一个测试都创建了一个TEST_STRING类的对象。对于同一个用例,不能够把TEST_F和TEST宏混用,如果在TEST_STRING.BLANK后面加入如下的测试:
TEST(TEST_STRING, TEST_ERROR){
EXPECT_STREQ("Say ","Say ");
}
那么会得到如下的报错信息:
[ RUN ] TEST_STRING.TEST_ERROR
../src/gtest.cc(1962): error: Failed
All tests in the same test case must use the same test fixture
class, so mixing TEST_F and TEST in the same test case is
illegal. In test case TEST_STRING,
test BLANK is defined using TEST_F but
test TEST_ERROR is defined using TEST. You probably
want to change the TEST to TEST_F or move it to another test
case.
[ FAILED ] TEST_STRING.TEST_ERROR
实际上,使用TEST宏时,相当于建立了一个SetUp和TearDown都为空的类,及相当于一个复制了一个testing::Test类,并且命名为用例的名字。