一般来说简单的测试用TEST
简单测试TEST
Cpp代码
#include <gtest/gtest.h>
int Factorial( int n )
{
if(n==2) return 100; //故意出个错,嘻嘻
return n<=0? 1 : n*Factorial(n - 1);
}
//用TEST做简单测试
TEST(TestFactorial, ZeroInput) //第一个参数是测试用例名,第二个参数是测试名:随后的测试结果将以"测试用例名.测试名"的形式给出
{
EXPECT_EQ(1, Factorial(0)); //EXPECT_EQ稍候再说,现在只要知道它是测试两个数据是否相等的就行了。
}
TEST(TestFactorial, OtherInput)
{
EXPECT_EQ(1, Factorial(1));
EXPECT_EQ(2, Factorial(2));
EXPECT_EQ(6, Factorial(3));
EXPECT_EQ(40320, Factorial(8));
}
主函数:
int main(int argc, char* argv[])
{
testing::InitGoogleTest(&argc,argv); //用来处理Test相关的命令行开关,如果不关注也可不加
RUN_ALL_TESTS(); //看函数名就知道干啥了
std::cin.get(); //只是让它暂停而已,不然一闪就没了
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
多个测试场景需要相同数据配置的情况,用TEST_FCpp代码
//用TEST_F做同配置的系列测试
typedef std::basic_string<TCHAR> tstring;
struct FooTest : testing::Test {
//这里定义要测试的东东
tstring strExe;
//可以利用构造、析构来初始化一些参数
FooTest() {}
virtual ~FooTest() {}
//如果构造、析构还不能满足你,还有下面两个虚拟函数
virtual void SetUp() {
// 在构造后调用
strExe.resize(MAX_PATH);
GetModuleFileName(NULL, &strExe[0], MAX_PATH);
}
virtual void TearDown() { } // 在析构前调用
};
tstring getfilename(const tstring &full) //偶写的从完整路径里取出文件名的函数(路径分隔符假定为'\\')
{
return full.substr(full.rfind(_T('\\')));
}
tstring getpath(const tstring &full) //偶写的从完整路径里取出路径名的函数(Windows路径)
{
return full.substr(0, full.rfind(_T('\\')));
}
TEST_F(FooTest, Test_GFN) //测试getfilename函数
{
EXPECT_STREQ(_T("Projectexe"), getfilename(strExe).c_str());
}
TEST_F(FooTest, Test_GP) //测试getpath函数
{
EXPECT_STREQ(_T("D:\\Code\\libs\\google\\gtest-1\\BCC_SPC\\bcc\\ex"), getpath(strExe).c_str());
}
int main(int argc, TCHAR* argv[]) //主函数还是一样地
{
testing::InitGoogleTest(&argc,argv);
RUN_ALL_TESTS();
std::cin.get();
return 0;
}
两个及以上的测试使用相同的数据,可以使用 test fixtures.使用相同的数据测试几个不同的测试.
1.从::testing::Test中继承.类中使用public或者protected,以便子类调用.
2.在类中,声明任何计划准备使用的任何对象.
3.如果需要,写一个默认的构造函数或者SetUp()函数,为测试准备对象.注意大小写
4.如果需要,写一个析构函数或TearDown()函数,释放各种资源.注意大小写
什么时候使用构造函数和析构函数,或SetUp函数和TearDown函数?
5.如果需要定义测试共享的子程序.
使用fixture,用TEST_F替代TEST(),允许访问对象和子程序.
TEST_F(test_case_name, test_name) { ... test body ...}
与TEST()相同,_F是指fixture.
在使用TEST_F()之前必须定义test fixture,否则会编译错误."`virtual outside class declaration`"
对于每个定义了TEST_F的测试,google test会
1.每次运行时创建一个新的test fixture.
2.通过SetUp,立即初始化
3.运行测试
4.通过调用TearDown进行清除工作.
5.删除test fixture.同一测试用例中,不同测试有不同的test fixture对象,每次google test 都会在创建下一个test fixture 之前删除上一个test fixture.google test不会对多个测试重复使用相同的test fixture.任何对fixture实例的改变不会影响到其他的测试.
使用EXPECT_CALL()宏来设置一个mock函数调用的预期结果。其语法为:
EXPECT_CALL(mock_object,method(matchers))
.Times(cardinality)
.WillOnce(action)
.WillRepeatedly(action);
第一个参数是mock对象,第二个参数是mock函数名及其参数。二者中间是以逗号(而不是点号)分隔的,至于为什么是这样,回答只有一个:技术原因。
宏后面还可以紧跟若干语句,以提供对mock函数调用的预期结果的更多信息。这种风格的语法被一些人称作是“特定领域语言”(Domain-SpecificLanguage,DSL)
- ON_CALL(subObj, readBuf(1000)).WillByDefault(Return(blen));
ON_CALL(#1, #2(#3)).WillByDefault(Return(#4));
#1表示mock对象。
#3表示readBuf方法的参数。这里的1000表示,只有调用CSubscriber::readBuf同时传递参数为1000时,才会用到ON_CALL的定义。
#4表示调用CSubscriber::readBuf同时传递参数为1000时,返回blen这个变量的值。