本地运行 rbd 测试用例

首先构建 ceph 代码:

$ pwd
/home/runsisi/src/ceph/build
## 适用于 Luminous 版本
$ cmake3 .. -DWITH_PYTHON2=ON -DWITH_LTTNG=OFF -DWITH_BABELTRACE=OFF -DWITH_RDMA=OFF -DWITH_LEVELDB=OFF -DWITH_LZ4=OFF -DWITH_TESTS=ON
## 适用于 Nautilus 版本
$ cmake3 .. -DWITH_PYTHON3=3.6 -DWITH_MGR_DASHBOARD_FRONTEND=OFF -DWITH_PYTHON2=ON -DMGR_PYTHON_VERSION=3 -DWITH_LTTNG=OFF -DWITH_BABELTRACE=OFF -DWITH_RDMA=OFF -DWITH_LEVELDB=OFF -DWITH_LZ4=OFF -DWITH_GRAFANA=OFF -DWITH_RADOSGW_AMQP_ENDPOINT=OFF -DWITH_TESTS=ON

然后 export 环境变量如下(如果固化在 bashrc 等配置文件的话,一定要注意在不同的本地 ceph 源代码工程之间切换时记得修改 CEPH_ROOT 并重新登录终端生效,否则虽然构建的是当前的 ceph 工程,但是运行的却是老的 CEPH_ROOT 中指定路径下的 ceph 程序):

export PYTHONV=2
export CEPH_ROOT=/home/runsisi/src/ceph
export CEPH_BUILD_DIR=$CEPH_ROOT/build
export CEPH_BIN=$CEPH_BUILD_DIR/bin
export CEPH_LIB=$CEPH_BUILD_DIR/lib

export PATH=$CEPH_BIN:$PATH
export LD_LIBRARY_PATH=$CEPH_LIB
export PYTHONPATH=$CEPH_LIB/cython_modules/lib.$PYTHONV:$CEPH_ROOT/src/pybind:$CEPH_ROOT/src/test/pybind
export CEPH_CONF=$CEPH_BUILD_DIR/ceph.conf
export CEPH_DEV=0

单元测试由于是打桩测试,调用的 librados 层的接口是桩(unittest_librbd 链接的是 rados_test_stub),所以不需要新建 ceph 集群, 构建之后可以直接使用 ctest 进行测试:

$ ctest -N | grep rbd
$ ctest -VV -R run-rbd-unit-tests.sh

也可以切换到 build/bin 目录直接执行单元测试可执行程序进行测试(注意设置上述的环境变量):

$ make unittest_librbd -j32
$ export RBD_FEATURES=127
$ export VALGRIND='--tool=memcheck --leak-check=full'
$ ./unittest_librbd --gtest_list_tests
$ valgrind ${VALGRIND} --track-origins=yes --suppressions=../qa/valgrind.supp --error-exitcode=1 ./unittest_librbd --gtest_filter=TestMockManagedLockAcquireRequest.LockBusy
$ valgrind ${VALGRIND} --track-origins=yes --suppressions=../qa/valgrind.supp --error-exitcode=1 ./unittest_librbd --gtest_filter=TestMockManagedLockAcquireRequest.LockBusy:TestMockManagedLockAcquireRequest.BreakLockError
$ valgrind ${VALGRIND} --track-origins=yes --suppressions=../qa/valgrind.supp --error-exitcode=1 ./unittest_librbd --gtest_filter=TestMockManagedLockAcquireRequest.*

集成测试由于是真实的 librados 调用(ceph_test_librbd 链接的是 librados),所以需要使用 vstart 搭建一个正常运行的 ceph 环境:

$ ../src/vstart.sh -n -i 10.123.123.123

然后运行集成测试用例中定义的命令(相应的命令行可以通过查看 qa/workunits/ 下的用例得到,也可以通过分析已有的 teuthology 日志得到)即可:

$ export RBD_FEATURES=127
$ export VALGRIND='--tool=memcheck --leak-check=full'
$ valgrind ${VALGRIND} --track-origins=yes --suppressions=../qa/valgrind.supp --error-exitcode=1 ceph_test_librbd

pybind 测试也需要先创建 vstart 集群,具体的测试命令如下:

$ nosetests -v test_rbd
$ nosetests -v test_rbd:TestGroups.test_group_image_list_move_to_trash

或者直接使用 nose 模块,这样可以很方便指定不同的 python 版本:

$ python2 -m nose -v test_rbdx
$ pip3 install --user nose
$ python3 -m nose -v test_rbdx
test_rbdx.TestGetInfo_Basic.test_basic ... ok
test_rbdx.TestGetInfo_children_v1.test_children_v1 ... ok

参考资料

Googletest - Google Testing and Mocking Framework

https://github.com/google/googletest

How to make nosetests use python3

https://stackoverflow.com/questions/22779289/how-to-make-nosetests-use-python3


最后修改于 2019-02-18

- 目录 -