sudo apt install libgtest-dev
http://pkgs.org/search/?q=gtest # 下载gtest-devel.rpm
rpm -ivh gtest-devel.rpm # 安装rpm包
Cmakelists.txt 文件中添加以下代码:
enable_testing() # 开启测试,否则无法执行make test
add_executable(add_test_exe add_test.cpp) # 添加可执行程序
target_link_libraries(add_test_exe PRIVATE gtest pthread) # 链接gtest库
add_test(add_test_exe ${CMAKE_BINARY_DIR}/add_test_exe) # 添加测试,保证make test可以执行该测试用例
add_test.cpp:
#include <gtest/gtest.h>
int add(int a, int b) {
return a + b;
}
TEST(TEST_ADD, UNSIGNED_INT_VALUE) {
int result = add(100, 200);
EXPECT_EQ(result, 300);
result = add(200, 300);
EXPECT_NE(result, 400);
}
int main() {
testing::InitGoogleTest();
return RUN_ALLTESTS();
}
4. 编译运行
~/Projects/Test master +625 !5592 ?1 ) mkdir build && cd build && cmake .. && make -j4
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler:/usr/bin/cc
-- Check for working CXX compiler:/usr/bin/c++
-- Configuring done
-- Generating done
-- Build files have been written to:/home/limstor/Projects/Test/build
Scanning dependencies of target add_test_exe
[50%] Building CXX object CMakeFiles/add_test_exe.dir/aadd_test.cpp.o
[100%] Linking CXX executable add_test_exe
[100%] Built target add_test_exe
~/Projects/Test/build master +625 !5592 ?2)/add_test_exe
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from TEST_ADD
[ RUN ]TEST_ADD.UNSIGNED_INT_VALUE
[ OK ]TEST_ADD.UNSIGNED_INT_VALUE (O ms)
[----------] 1 test from TEST_ADD (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0ms total)
[ PASSED ] 1 test.
说明:该宏定义用来测试其内部代码,其内部断言决定最终的测试结果。使用方式:
TEST(TestSuiteName, TestName) {
... statements ...
}
用途:针对多个用例之间不需要进行数据共用的测试场景。示例:
int add(int a, int b) {
return a + b;
}
TEST(TEST_ADD, UNSIGNED_INT_VALUE) {
int result = add(100, 200);
EXPECT_EQ(result, 300);
result = add(200, 300);
EXPECT_NE(result, 400);
}
TEST(TEST_ADD, NEGATIVE_INT_VALUE) {
int result = add(-100, -200);
EXPECT_EQ(result, -300);
result = add(-200, -300);
EXPECT_NE(result, -400);
}
说明:该宏定义用来对 TestFixtureName 类进行多样测试。使用方法:
TEST_F(TestFixtureName, TestName) {
... statements ...
}
用途:针对多个用例之间需要进行数据共用的测试场景,用于多样测试,也有助于简化测试代码。使用示例:
class Student {
public:
Student(int id, std::string name): id_(id), name_(name) {};
~Student() = default;
void SetAge(int age) { age_ = age; }
int GetAge() const { return this->age_; }
void SetScore(int score) { score_ = score; }
int GetScore() const { return this->score_; }
private:
int id_;
std::string name_;
int age_;
int score_;
};
class StudentTest : public testing::Test {
protected:
void SetUp() override {
student = new Student(1234, "Tom");
}
void TearDown() override {
delete student;
}
Student* student;
};
TEST_F(StudentTest, SET_AGE_TEST) {
student->SetAge(16);
int age = student->GetAge();
EXPECT_EQ(age, 16);
}
TEST_F(StudentTest, SET_SCORE_TEST) {
student->SetScore(99);
int score = student->GetScore();
ASSERT_EQ(score, 99);
}int main() {
testing::InitGoogleTest();
return RUN_ALL_TESTS();
}
使用方式:
TEST_P(TestFixtureName, TestName) {
... statements ...
}
用途:当待测试方法的行为取决于传入的参数时,而且这些参数的不同组合有多种, 而你又不想为此写多个类似的 test case 时,可以用参数化测试。示例:
struct TestData {
int a;
int b;
int result;
char type;
};
class CalculateTest : public ::testing::TestWithParam<TestData> {
protected:
void checkData() {
int a = GetParam().a;
int b = GetParam().b;
int result = GetParam().result;
switch (GetParam().type) {
case '+':
EXPECT_EQ(a + b, result);
break;
case '-':
EXPECT_EQ(a - b, result);
break;
case '*':
EXPECT_EQ(a * b, result);
break;
case '/':
EXPECT_EQ(a / b, result);
break;
default:
break;
}
}
};
TEST_P(CalculateTest, Test) {
checkData();
}
INSTANTIATE_TEST_SUITE_P(TestMyClassParams,
CalculateTest,
::testing::Values(
TestData{100, 200, 300, '+'},
TestData{20, 5, 15, '-'},
TestData{5, 6, 30, '*'},
TestData{8, 2, 3, '/'}
));
int main() {
testing::InitGoogleTest();
return RUN_ALL_TESTS();
}
断言:对测试代码中的检查点进行检查。分为以下两种断言类型:
· ASSERT_*断言:当检查点失败时,退出当前函数;· EXPECT_*断言:当检查点失败时,继续往下执行。
8. Windows 平台的 HRESULT 检查
testing::StaticAssertTypeEq(); 类似模板中的编译检查除以上 9 种断言使用方法外,还可以在断言后增加自定义信息输出EXPECT_EQ(a, b) << "Vectors x and y differ at index ";