数据库管理系统设计大赛的环境搭建和测试
环境部署
背景
RMDB的推荐实验环境如下:
- 操作系统:Ubuntu18.04 (x86_64)
- CMake:3.16及以上版本
- GCC:7.1及以上版本,要求⽀持C++17等新标准
因为要参加一下这个比赛,这个比赛要求在Ubuntu中开发。之前有用过CentOS,但是还是有点不同。这里也记录一下
操作系统
这里还是打算在VM虚拟机中模拟实验环境。安装好VM后,先找个Ubuntu的镜像。像CentOS建立虚拟机的步骤一样。然后就是尝试用ssh远程连接。之前用的是Xshell。因为项目要写C++代码,我们可以用VScode远程连接。
- 首先在VScode中添加remote-ssh扩展。然后点击软件左下角的远程连接按钮(没有的可以右键添加)
- 选中连接到主机
- 配置ssh主机
- .ssh/config
- 配置ip地址和用户名,并保存
- 再进入链接到主机,会看到已有该远程连接
- 进入之后输入登录密码即可
依赖环境库配置
在Linux中输入如下命令即可
sudo apt-get install build-essential # build-essential packages, including gcc,g++, make and so on
sudo apt-get install cmake # cmake package
sudo apt-get install flex bison # flex & bison packages
sudo apt-get install libreadline-dev # readline package
Git
还需要再Linux中使用Git,首先要现在Git
sudo apt-get update
sudo apt-get install git
然后可以用https方式把代码拉取到虚拟机,但是每次提交需要输入账号密码,所以用ssh会对经常提交的操作更方便。同样也建议用ssh方式连接vscode
首先我还没有gitlab的公钥,这里需要再项目的git中生成一下公钥。输入如下命令即可
ssh-keygen -t ed25519 -C "你的邮箱" # 推荐 ed25519 算法,也可用 rsa
然后一路回车,生成密钥
然后可以看出密钥已经保存。打开.pub文件,把公钥复制到gitlab中,保存即可
ssh的公钥理解
- 密钥生成:在虚拟机(本地机器)用 ssh - keygen 生成公钥 - 私钥对,公钥可公开,私钥自己妥善保存(像大门的 “加密锁” 和 “专属钥匙” )。
- 关联 GitLab:把虚拟机生成的公钥,添加到 GitLab 个人账户的 SSH 密钥配置里。这一步相当于告诉 GitLab:“这台虚拟机用这个公钥代表我,以后它用私钥证明身份时,你就认~”
- 免密原理:之后虚拟机和 GitLab 交互(拉取 / 推送代码),会用私钥加密验证信息,GitLab 拿你之前存的公钥解密。验证通过,就不用每次输账号密码,直接 “刷钥匙进门” 。
简单说,就是公钥当 “身份凭证” 存 GitLab,私钥在本地当 “密码钥匙”,配对成功就免密操作啦,核心是利用非对称加密的身份验证~
问题
- 这里现实连接失败,然后开始排查错误【Linux远程登录ssh不了,怎么解决?】,发现未安装 OpenSSH服务器软件包,输入apt install openssh-server后解决。
- 连接成功后,在vscode中无法修改和新建文件,这是因为权限问题,这里可以用umask关键字放开。 umask(用户掩码) 设置新建文件 / 目录默认权限,核心逻辑是 “默认最大权限减去 umask 值”。用umask指令可以查看当前的值,我们直接umask 0000。即可,这样新建文件目录时,默认没有权限限制。
编译测试
本地测试步骤
-
进入项目根目录:
cd /path/to/db2025
-
创建并进入构建目录:
mkdir -p build && cd build
-
使用CMake配置项目:
cmake ..
-
编译项目:
make -j4
-
运行单元测试:
./bin/unit_test
-
运行特定测试(如
RecordManagerTest.SimpleTest
):./bin/unit_test --gtest_filter=RecordManagerTest.SimpleTest
关键目录说明
-
src/
:源代码目录storage/
:存储管理相关代码(包括disk_manager.cpp
)record/
:记录管理相关代码test/
:测试代码(unit_test.cpp
在这里)
-
build/
:构建目录- 所有编译生成的文件都在这里
bin/unit_test
是测试可执行文件
-
rmdb_client/
:客户端代码- 需要单独编译和运行
完整测试流程示例
# 1. 进入项目根目录
cd ~/db2025
# 2. 清理并创建构建目录
rm -rf build/*
mkdir -p build && cd build
# 3. 配置项目
cmake ..
# 4. 编译项目
make -j4
# 5. 运行所有测试
./bin/unit_test
# 6. 或者只运行特定测试
./bin/unit_test --gtest_filter=RecordManagerTest.SimpleTest
# 7. 如果测试失败,查看详细输出
./bin/unit_test --gtest_filter=RecordManagerTest.simpleTest --gtest_output=xml:results.xml
常见问题解决
-
编译错误:
- 确保安装了所有依赖:
sudo apt-get install build-essential cmake flex bison libreadline-dev
- 检查CMake版本:
cmake --version
(需要≥3.16)
- 确保安装了所有依赖:
-
测试失败:
- 使用
gdb
调试:gdb ./bin/unit_test (gdb) run --gtest_filter=RecordManagerTest.simpleTest
- 使用
-
文件权限问题:
- 确保有读写权限:
chmod -R a+rw ~/db2025
- 确保有读写权限:
-
清理构建:
- 完全清理:
rm -rf build/*
- 部分清理:
make clean
- 完全清理:
./命令语法解释
./bin/unit_test [选项] [测试过滤参数]
-
./
- 表示在当前目录下执行命令
- 避免系统在 PATH 环境变量中搜索可执行文件
-
bin/
- 可执行文件所在的目录(通常是构建后生成的)
- 在 CMake 项目中默认存放编译后的二进制文件
-
unit_test
- 单元测试的可执行文件名
- 由 CMake 根据项目配置生成(通常是
add_executable(unit_test ...)
定义)
-
[选项]
- Google Test 框架提供的命令行选项
- 控制测试行为和输出格式
-
[测试过滤参数]
- 指定要运行的特定测试或测试套件
常用选项和参数
选项/参数 | 说明 | 示例 |
---|---|---|
--gtest_filter |
过滤要运行的测试 | --gtest_filter=RecordManagerTest.* |
--gtest_list_tests |
列出所有可用测试而不运行 | --gtest_list_tests |
--gtest_repeat |
重复运行测试 | --gtest_repeat=3 |
--gtest_output |
设置测试报告输出格式 | --gtest_output=xml:results.xml |
--gtest_break_on_failure |
遇到测试失败时进入调试器 | --gtest_break_on_failure |
--gtest_shuffle |
随机顺序运行测试 | --gtest_shuffle |
--gtest_color |
控制彩色输出 | --gtest_color=yes |