MySQL gunit 运行
MySQL源码的unittest文件夹下虽然有基于googletest实现的unittest,但是默认是不运行的,因为MySQL默认不带googletest。两种方式可以使其编译运行:
- 自动下载。保证编译机器可以连github,cmake的时候加个
-DENABLE_DOWNLOADS=1
,它会自动从github下载对应版本的googletest。 - 本地zip。去看下
gunit/CMakeLists.txt
,看下他要的googletest是什么版本(在里面可能也写成gmock,googletest包含gtest和gmock两个模块),8.0.16之前依赖的是 googletest-1.8.0,找到对应的tag,下载zip(命名为 release-1.8.0.zip )。然后cmake 加个-DLOCAL_GMOCK_ZIP=/path/to/release-1.8.0.zip
。
按照官网加GTEST_PREFIX试了发现是没效的,以上是根据 MySQL/unittest/gunit/CMakeLists.txt
发现的办法。
由于默认不带gunit编译,如果是内部迭代后,有可能MySQL unittest部分编译不过。目前发现的可能会影响编译的是:
tap_event_listener.cc:test_part_result_type_tostring
的一个switch语句,加个default分支把最后的return "" 放进default中。fake_table.h: #include "gmock/gmock-generated-nice-strict.h"
改成#include "gmock/gmock-nice-strict.h"
,具体参见source_downloads下面的实际是什么样的文件,不要看原来zip的,它会变的。
可以单独编译自己想要的 -t 结尾的测试案例,比如 make union_syntax-t -j32
,编译出来的bin在build/runtime_output_directory
,具体不同编译方式的请查看make的日志,最后有写bin输出到哪个目录的。
需注意的是,MySQL的unittest白盒单测实际还比较少,更多是基于sql去做黑盒查询测试,mysqltest下的sql覆盖的会比较全。这里会导致一个MySQL开发者常见的问题,原有功能能跑,基于他的语义想去自己改改其他发现就踩坑了。换句话说,MySQL保证了某模块功能在MySQL现有路径是对的,但是没有保障模块功能它的期望语义的完整性和正确性(因为MySQL原生路径不需要用到完整的语义)。
同时,gunit下面暂未提供一个fake server实例,因此部分模块功能比较依赖整个server路径的没办法单测,只能通过sql 覆盖去测试。