1.安装环境 VS2019安装gtest安装包
2.TEST 测试成员变量
//1.添加头文件
//2.被测试的类、函数、结构
//3.测试函数 test_case_name(group 一组测试),test_name(item 函数名)
//4.主函数 输出宏EXPECT_EQ
#include "pch.h"
#include <iostream>
#include <gtest/gtest.h>
struct BankAccount
{
int balance=1;
BankAccount(){}
explicit BankAccount(const int balance)// explicit 类构造函数
:balance{ balance } { }
};
TEST(AccountTest,BankAccountStartsEmpty)
{
BankAccount account;
EXPECT_EQ(0, account.balance);
}
int main(int argc, char* argv[])
{
testing::InitGoogleTest(&argc,argv);//&argc, argv 这两个参数是干什么?
return RUN_ALL_TESTS();
}
3.TEST_F 测试函数
struct BankAccount
{
//构造函数
int balance=1;
BankAccount()
{
}
explicit BankAccount(const int balance)// explicit 类构造函数
:balance{ balance }
{
}
virtual void deposit(int amount)
{
balance += amount;
}
};
//测试:测试函数返回值
TEST_F(BankAccountTest, CanDepositMoney)
{
account->deposit(100);
EXPECT_EQ(100, account->balance);
}
4.TEST_P测试有参函数
//1.需要被测试的类 BankAccount
//2.测试类:BankAccountTest:testing::Test
//3.测试的参数:account_state
//4.带参数的测试类:withdrawAccountTest
//struct withdrawAccountTest :BankAccountTest, 继承于testing testing::WithParamInterface<account_state>
//5.测试入口:TEST_P(withdrawAccountTest, FinalBalance)
//6.初始化带参数的测试环境 INSTANTIATE_TEST_CASE_P
//1.需要被测试的类 BankAccount
struct BankAccount
{
//构造函数
int balance=1;
BankAccount()
{
}
explicit BankAccount(const int balance)// explicit 类构造函数
:balance{ balance }
{
}
virtual void deposit(int amount)
{
balance += amount;
}
//
bool withdraw(int withdraw_amount)
{
if (withdraw_amount <= balance)
{
balance -= withdraw_amount;
return true;
}
return false;
}
};
//2.测试类:BankAccountTest:testing::Test
struct BankAccountTest :testing::Test
{
BankAccount* account;
BankAccountTest()
{
account = new BankAccount;
}
~BankAccountTest()
{
delete account;
}
};
//3.测试的参数:account_state
struct account_state
{
int initial_balance;
int withdraw_amount;
int final_balance;
bool success;
friend std::ostream& operator <<(std::ostream& os, const account_state& obj)
{
return os
<< "initial_balance:" << obj.initial_balance
<< "withdraw_amount:" << obj.withdraw_amount
<< "final_balance:" << obj.final_balance
<< "success:" << obj.success;
}
};
// 输入的参数 account_state
// testing::GetParam()里有这个得到参数的函数
// testing::WithParamInterface<account_state>
struct withdrawAccountTest :BankAccountTest, testing::WithParamInterface<account_state>
{
withdrawAccountTest()
{
account->balance = GetParam().initial_balance;
}
};
//5.测试入口
TEST_P(withdrawAccountTest, FinalBalance)
{
//调用参数
auto as = GetParam();
auto success = account->withdraw(as.withdraw_amount);
EXPECT_EQ(as.final_balance, account->balance);
EXPECT_EQ(as.success, success);
}
//6.初始化带参数的测试环境 INSTANTIATE_TEST_CASE_P
INSTANTIATE_TEST_CASE_P(Default, withdrawAccountTest,
testing::Values(
account_state{ 100,50,50,true }, //正确的
account_state{ 100,200,100 ,false}));//错误的
//argc 统计程序运行时发送给main函数的命令行参数的个数
//argv 用来存放指向的字符串参数的指针数组
int main(int argc, char* argv[])
{
//1.初始化
testing::InitGoogleTest(&argc,argv);//&argc, argv 这两个参数是干什么?
return RUN_ALL_TESTS();
}