聊聊ClickHouse的开发、编译和测试

简介: 聊聊ClickHouse的开发、编译和测试

ClickHouse为了一款性能极佳的开源OLAP数据库,在最近几年也是越来越火,除了在各大互联网公司落地生根之外,也吸引了一大批热心的贡献者。


截止到v21.10版本,CH在全球一共有1064名contributor。

SELECT count(1)
FROM system.contributors
Query id: 7cdf54f1-cb50-45c0-99b9-14d73d283e39
┌─count()─┐
│    1064 │
└─────────┘

而要给社区贡献代码,首先就要经历一次完整的开发、编译和测试过程,文本将总结上述流程中常用到的一些工具和技巧,希望对有志于贡献CH代码的同学能有所帮助。



开发


开发环境配置可参考以下文章


  • C++开发环境最佳实践
  • vscode clangd c++开发常见问题和解决方案



编译


在编译之前,下载最新代码

git clone https://github.com/clickhouse/clickhouse

然后git submodule三连, 拉取第三方库代码

git submodule update --init --recursive 
git submodule foreach git checkout .
git submodule sync     --recursive

接下来便是编译了,由于社区已经明确不支持gcc了,所以建议使用clang-12或clang-13编译。

mkdir -p build_clang
cd build_clang
cmake  -G Ninja "-DCMAKE_C_COMPILER=$(command -v clang-13)" "-DCMAKE_CXX_COMPILER=$(command -v clang++-13)"  -DCMAKE_BUILD_TYPE=Debug -DENABLE_TESTS=0 -DENABLE_UTILS=0  -DENABLE_THINLTO=0 -DENABLE_NURAFT=0 -DDISABLE_HERMETIC_BUILD=1 ..
ninja clickhouse



调试


调试环境搭建可参考:vscode c++远程调试实战

另外调试CH的过程中最好忽略SIGUSR1SIGUSR2信号(这俩信号用于统计query的一些指标),否则你会发现调试过程老被这俩信号打断。


debugger为gdb时,设置:

handle  SIGUSR1  noprint nostop
handle  SIGUSR2  noprint nostop

debugger为lldb时,设置:

pro hand -p false -s false -n false SIGUSR1
pro hand -p false -s false -n false SIGUSR1



测试


虽然社区已经有github actions用于检查新提交PR, 但肯定不如本地检查来的快。以下将介绍几个常用的测试工具:


check-style


check-style用于检查代码风格,CH对代码的要求还是比较高的,所以建议写完代码之后用check-style工具跑一遍,看看有哪些地方不符合社区的要求。

./utils/check-style/check-style | tee style.log

一般新手常见的错误有两种:


  • 大括号没有换行写


  • 行尾有空格


functional test


CH中最普遍最常用的一种测试情况,输入为sql或shell文件, 输出为sql执行结果,如果发现sql预期执行结果与实际不同,则判定该functional test失败。


那么如何运行functional test呢,分两种情况


对于输入为sql的functional test:

export CLICKHOUSE_CLIENT="/path/to/clickhouse client --host XX --port XX --user XX --password XX -m"
cat tests/queries/0_stateless/XXX.sql | $CLICKHOUSE_CLIENT

对于输入为shell的:

export CLICKHOUSE_CLIENT="/path/to/clickhouse client --host XX --port XX --user XX --password XX -m"
bash -x  tests/queries/0_stateless/01675_distributed_bytes_to_delay_insert_long.sh

fast test


被社区用于对PR的快速验证,会执行编译,并运行部分functional tests。当你发现提交的PR没通过fast test时,最好的办法便是在本地环境复现它。

export LLVM_VERSION=13
export PULL_REQUEST_NUMBER=31104
export stage="" # stage按照顺序有"", clone_root, run, clone_submodules, run_cmake, build, configure, run_test等选项,用户可按需设置stage参数。
export FASTTEST_WORKSPACE=/path/to/fasttest/workspace # fast test会在该目录下下载PR代码并编译运行
cd ./docker/test/fasttest
bash -x run.sh  | tee run.log  

integration test


在CH中,有很多测试依赖集群环境或者其他组件(mysql, zookeeper, hdfs等等),这时functional test便行不通了,所以社区引入了integration test


在本地我们仍可运行集成测试,以test_storage_hdfs为例:

cd $prefix/tests/integration
sudo ./runner --binary $prefix/build_clang/programs/clickhouse  --odbc-bridge-binary $prefix/b



相关文章
|
4月前
|
缓存 运维 数据库
【测试人员兼职指南】利用专业技能:如何从测试转向开发赚钱
本文分享了作者作为测试人员如何利用专业技能转向开发来兼职赚钱的经验,包括分析和解决登录页面跳转、避免重复账号注册、用户登录后首页显示用户名以及添加退出功能等问题,并提供了Django项目中使用sqlite3数据库和后台管理的扩展技巧。
133 1
【测试人员兼职指南】利用专业技能:如何从测试转向开发赚钱
|
2月前
|
测试技术 网络安全
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
文章全面介绍了软件测试的基本概念、目的、岗位分类、与开发和调试的区别,并阐述了成为优秀测试人员应具备的素质和技能。
211 1
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
|
16天前
|
安全 测试技术 持续交付
云计算时代的软件开发与测试:高效、灵活、可扩展
云计算时代的软件开发与测试:高效、灵活、可扩展
|
2月前
|
人工智能 监控 测试技术
云应用开发平台测试
云应用开发平台测试
63 2
|
2月前
|
敏捷开发 测试技术
开发模型(瀑布、螺旋、scrum) 和 测试模型(V、W)、增量和迭代、敏捷(思想)及敏捷开发 scrum
文章详细介绍了软件开发过程中的不同开发模型(瀑布、螺旋、Scrum)和测试模型(V模型、W模型),以及增量和迭代的概念,最后阐述了敏捷思想及其在敏捷开发(如Scrum)中的应用。
83 0
开发模型(瀑布、螺旋、scrum) 和 测试模型(V、W)、增量和迭代、敏捷(思想)及敏捷开发 scrum
|
3月前
|
测试技术 持续交付 UED
软件测试的艺术与科学:平衡创新与质量的探索在软件开发的波澜壮阔中,软件测试如同灯塔,指引着产品质量的方向。本文旨在深入探讨软件测试的核心价值,通过分析其在现代软件工程中的应用,揭示其背后的艺术性与科学性,并探讨如何在追求技术创新的同时确保产品的高质量标准。
软件测试不仅仅是技术活动,它融合了创造力和方法论,是软件开发过程中不可或缺的一环。本文首先概述了软件测试的重要性及其在项目生命周期中的角色,随后详细讨论了测试用例设计的创新方法、自动化测试的策略与挑战,以及如何通过持续集成/持续部署(CI/CD)流程优化产品质量。最后,文章强调了团队间沟通在确保测试有效性中的关键作用,并通过案例分析展示了这些原则在实践中的应用。
79 1
|
2月前
|
存储 SQL 分布式计算
大数据-135 - ClickHouse 集群 - 数据类型 实际测试
大数据-135 - ClickHouse 集群 - 数据类型 实际测试
38 0
|
3月前
|
测试技术 UED 开发者
软件测试的艺术:从代码审查到用户反馈的全景探索在软件开发的宇宙中,测试是那颗确保星系正常运转的暗物质。它或许不总是站在聚光灯下,但无疑是支撑整个系统稳定性与可靠性的基石。《软件测试的艺术:从代码审查到用户反馈的全景探索》一文,旨在揭开软件测试这一神秘面纱,通过深入浅出的方式,引领读者穿梭于测试的各个环节,从细微处着眼,至宏观视角俯瞰,全方位解析如何打造无懈可击的软件产品。
本文以“软件测试的艺术”为核心,创新性地将技术深度与通俗易懂的语言风格相结合,绘制了一幅从代码审查到用户反馈全过程的测试蓝图。不同于常规摘要的枯燥概述,这里更像是一段旅程的预告片,承诺带领读者经历一场从微观世界到宏观视野的探索之旅,揭示每一个测试环节背后的哲学与实践智慧,让即便是非专业人士也能领略到软件测试的魅力所在,并从中获取实用的启示。
|
4月前
|
测试技术 C# 开发者
“代码守护者:详解WPF开发中的单元测试策略与实践——从选择测试框架到编写模拟对象,全方位保障你的应用程序质量”
【8月更文挑战第31天】单元测试是确保软件质量的关键实践,尤其在复杂的WPF应用中更为重要。通过为每个小模块编写独立测试用例,可以验证代码的功能正确性并在早期发现错误。本文将介绍如何在WPF项目中引入单元测试,并通过具体示例演示其实施过程。首先选择合适的测试框架如NUnit或xUnit.net,并利用Moq模拟框架隔离外部依赖。接着,通过一个简单的WPF应用程序示例,展示如何模拟`IUserRepository`接口并验证`MainViewModel`加载用户数据的正确性。这有助于确保代码质量和未来的重构与扩展。
98 0
|
4月前
|
前端开发 JavaScript 测试技术
React 与前端自动化测试也太重要啦!各种测试框架助力确保应用质量,快来开启优质开发之旅!
【8月更文挑战第31天】随着前端技术的发展,React 成为了构建用户界面的热门选择。然而,随着应用复杂性的增加,确保应用质量变得至关重要。本文介绍了前端自动化测试的重要性,并详细综述了常用的测试框架如 Jest、Enzyme 和 Cypress,以及如何通过它们进行高效的 React 组件测试。通过遵循最佳实践,如编写可维护的测试用例、覆盖关键场景、集成 CI/CD 流程和进行性能测试,可以显著提高应用的稳定性和可靠性。
74 0