如何在当前事务执行完sql语句后,统计代码覆盖率

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】4.3.0
【问题描述】如何SQL语句执行触发的代码覆盖率
我们在做事务隔离级别的正确性实现验证工具,测试工具生成了许多 SQL 查询与事务的测试用例,现在想要进一步测试触发的代码覆盖率以验证这些测试用例的可靠性与全面性,请问有没有方法或文档能介绍下 Oceanbase 怎么查看执行的代码覆盖率呢?
编译和部署:

bash build.sh coverage --init --make

./tools/deploy/obd.sh prepare -p /tmp/obtest
./tools/deploy/obd.sh deploy -c ./tools/deploy/single.yaml

部署成功后,比如想简单测试一个事务触发的代码覆盖率,怎么获取呢:

MySQL [test]> begin;
Query OK, 0 rows affected (0.00 sec)

MySQL [test]> select * from t1 for update;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.04 sec)

MySQL [test]> commit;
Query OK, 0 rows affected (0.00 sec)

MySQL [test]> Bye

接下来,想通过gcov命令获取代码覆盖率,比如 src/storage/tx 文件夹下所有代码的覆盖度,
进入 ./build_coverage/src/storage/CMakeFiles/ob_storage.dir/Unity/unity_ob_storage_tx,
发现都是:

>> ls
0_cxx.cxx       0_cxx.cxx.gcno  0_cxx.cxx.o.d  1_cxx.cxx.gcda  1_cxx.cxx.o    2_cxx.cxx       2_cxx.cxx.gcno  2_cxx.cxx.o.d
0_cxx.cxx.gcda  0_cxx.cxx.o     1_cxx.cxx      1_cxx.cxx.gcno  1_cxx.cxx.o.d  2_cxx.cxx.gcda  2_cxx.cxx.o

想请问下如何获得 src/storage/tx 所有代码的覆盖度呢?

你搞的好复杂。。数据库侧最多把执行过的SQL或者事务给捞出来。
这样勉强有了分子,但是分母是测试工具生成了所有SQL与事务,这个东西数据库怎么统计出来。。
最后这个覆盖率肯定也算不了啊

PostgreSQL 官方文档有很详细的说明,是可以用 gcov 或 lcov 测试代码覆盖率的:https://www.postgresql.org/docs/current/regress-coverage.html.

这里也有个博客可以参考下:https://dbkernel.com/2016/03/30/test-postgresql-code-coverage-using-gcov-and-lcov/

看了你发的文档,里面不是写了编译的时候要加两个参数吗。。看描述这两个参数才是重点
看你的编译步骤没加,是不是要找下obd.sh里面gcc的命令加上这两个参数

编译时用的已经是加了这两个参数的选项了:build.sh 的 coverage 选项,加了才有 .gcda 文件,但可能是因为 unity 编译的原因,一个文件夹下所有源文件都打包到一起了,故解析不了。

现在的 oceanbase 即使最新分支也无法使用 -DOB_ENABLE_UNITY=OFF,编译过不了

这个真没招了,感觉你这种测试方法还是有点太底层了,不同数据库这样搞太费时间。。常规的sysbench、TPCC、TPCH不能满足你的要求吗

obd可以使用sysbench来做性能测试不知道可以满足你对ob测试的需求