本文档介绍如何在 OceanBase seekdb 项目中编写和运行单元测试。
seekdb 使用 Google Test 作为单元测试框架。单元测试代码位于项目根目录下的 unittest 目录中。
seekdb 有两个单元测试目录:
unittest:主要的单元测试用例,测试src目录中的代码deps/oblib/unittest:oblib 库的测试用例
默认情况下,构建 seekdb 项目时不会自动编译单元测试。需要显式编译:
# 1. 首先编译项目(Debug 模式)
bash build.sh debug --init --make
# 2. 进入构建目录的 unittest 目录
cd build_debug/unittest
# 或者编译 oblib 的测试
# cd build_debug/deps/oblib/unittest
# 3. 编译单元测试
make -j4编译完成后,可以运行 run_tests.sh 脚本来运行所有测试用例:
./run_tests.sh可以编译并运行单个测试用例,这对于调试特定的测试很有用。
- 进入构建目录(不要进入
unittest目录):
cd build_debug- 编译特定测试用例:
make -j4 test_chunk_row_store- 查找并运行测试二进制文件:
# 查找测试文件位置
find . -name "test_chunk_row_store"
# 运行测试(示例路径)
./unittest/sql/engine/basic/test_chunk_row_store注意:必须在
build_debug目录下执行make命令,而不是在unittest目录下。
seekdb 使用 test_xxx.cpp 作为单元测试文件名。创建测试文件后,需要将文件名添加到对应的 CMakeLists.txt 文件中。
每个测试文件需要包含以下基本结构:
- 包含 Google Test 头文件:
#include <gtest/gtest.h>- 添加 main 函数:
int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}接着可以添加一些函数来测试不同的场景。下面是 test_ra_row_store_projector.cpp 的一个例子。
///
/// TEST 是 google test 的一个宏。
/// 用来添加一个新的测试函数。
///
/// RARowStore 是一个测试套件的名字,alloc_project_fail 是测试的名字。
///
TEST(RARowStore, alloc_project_fail)
{
ObEmptyAlloc alloc;
ObRARowStore rs(&alloc, true);
///
/// ASSERT_XXX 是一些测试宏,可以帮助我们判断结果是否符合预期,如果失败会终止测试。
///
/// 还有一些其它的测试宏,以 `EXPECT_` 开头,如果失败不会终止测试。
///
ASSERT_EQ(OB_SUCCESS, rs.init(100 << 20));
const int64_t OBJ_CNT = 3;
ObObj objs[OBJ_CNT];
ObNewRow r;
r.cells_ = objs;
r.count_ = OBJ_CNT;
int64_t val = 0;
for (int64_t i = 0; i < OBJ_CNT; i++) {
objs[i].set_int(val);
val++;
}
int32_t projector[] = {0, 2};
r.projector_ = projector;
r.projector_size_ = ARRAYSIZEOF(projector);
ASSERT_EQ(OB_ALLOCATE_MEMORY_FAILED, rs.add_row(r));
}- Google Test 文档 - 了解
TEST、ASSERT和EXPECT等宏的详细用法 - 编程惯例 - 了解 seekdb 的编程风格
在合并拉取请求之前,GitHub CI 会自动运行测试。Farm 将测试 mysqltest 和 unittest。您可以查看下面的 Details 链接查看详细的测试结果。
在 Pull Request 页面,可以看到 CI 测试的状态。点击 Details 链接可以查看:
- 测试执行情况
- 失败的测试用例
- 测试覆盖率等信息


