C/C++ 单元自动化测试解决方案总结
背景
C/C++ 是一门常用的编程语言,广泛应用于嵌入式系统、操作系统、游戏等领域。在实际的开发过程中,单元测试是必不可少的环节,可以确保代码的质量和稳定性。
常用的单元测试框架
C/C++ 的单元测试框架有很多,包括 Google Test,CppUnit,Boost.Test 等。这些框架可以满足大部分的单元测试需求,提供了丰富的断言和测试用例组织方式。
以下以 Google Test 为例进行讲解。
Google Test 的使用方法
安装
Google Test 的安装非常简单,只需要将源代码下载到本地,并编译生成库文件即可。具体步骤如下:
git clone https://github.com/google/googletest.git
cd googletest
mkdir build && cd build
cmake ..
make
sudo make install
安装成功后,可以在项目的 Makefile 中添加如下依赖:
GTESTLIB = gtest
GTESTFLAGS = -pthread
SRCS = $(wildcard *.cpp)
OBJS = $(SRCS:.cpp=.o)
LIBS = -L/usr/local/lib -l$(GTESTLIB) $(GTESTFLAGS)
all: $(OBJS)
g++ -o test $(OBJS) $(LIBS)
%.o: %.cpp
g++ -c $< -o $@
测试用例
在 Google Test 中,测试用例使用 TEST 宏定义来实现。例如:
#include <gtest/gtest.h>
TEST(MyTestSuite, Test1) {
EXPECT_EQ(1 + 1, 2);
}
TEST(MyTestSuite, Test2) {
EXPECT_TRUE(0 == 0);
}
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
上述代码定义了两个测试用例,分别测试 1 + 1 是否等于 2,以及 0 是否等于 0。
断言
Google Test 提供了很多种常用的断言,例如 ASSERT_EQ,EXPECT_TRUE,EXPECT_THROW 等等。以下是一些常用断言的示例:
#include <gtest/gtest.h>
TEST(MyTestSuite, Test1) {
int a = 1, b = 2;
ASSERT_EQ(a + b, 3); // 断言 a + b 是否等于 3
}
TEST(MyTestSuite, Test2) {
bool flag = true;
EXPECT_TRUE(flag); // 断言 flag 是否为 true
}
TEST(MyTestSuite, Test3) {
std::vector<int> vec = {1, 2, 3};
EXPECT_EQ(vec.at(3), 4); // 断言 vec[3] 是否等于 4,注意 vec 只有三个元素
}
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
测试覆盖率
Google Test 也支持测试覆盖率的计算,可以通过 gcov 工具来分析代码覆盖率,具体步骤如下:
# 在 Makefile 中添加如下编译选项
CFLAGS = -fprofile-arcs -ftest-coverage
LDFLAGS = -fprofile-arcs -ftest-coverage
# 编译和运行单元测试
make test
./test
# 生成测试覆盖率报告
gcov -b *.cpp
以上示例是 Google Test 的一些常规用法,当然还有更多的用法可以参考 Google Test 的官方文档。
示例
以下是一个示例程序以及对应的测试用例:
源代码
// add.h
#ifndef ADD_H
#define ADD_H
int add(int a, int b);
#endif
// add.cpp
#include "add.h"
int add(int a, int b) {
return a + b;
}
// main.cpp
#include <iostream>
#include "add.h"
int main() {
int a = 1, b = 2;
std::cout << "a + b = " << add(a, b) << std::endl;
return 0;
}
测试用例
// test.cpp
#include <gtest/gtest.h>
#include "add.h"
TEST(AddTest, Test1) {
int a = 1, b = 2;
EXPECT_EQ(add(a, b), 3); // 断言 add(a, b) 是否等于 3
}
TEST(AddTest, Test2) {
int a = 0, b = -1;
EXPECT_EQ(add(a, b), -1); // 断言 add(a, b) 是否等于 -1
}
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
以上示例代码中,add 函数用于计算两个数的和,而测试用例则分别测试了 a + b 和 0 - 1 两个数的加法是否正确。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C/C++ 单元自动化测试解决方案总结 - Python技术站