如何将测试查询添加到 ClickHouse CI

    核心功能经过了很多的测试,但是ClickHouse CI可以发现一些极端情况和不同的功能组合。

    我们看到的大多数错误/回归都发生在测试覆盖率较差的中。

    我们非常有兴趣通过测试涵盖实现生活中使用的大多数可能的场景和功能组合。

    为什么/何时应将测试用例添加到ClickHouse代码中:
    1) 您使用了一些复杂的场景/功能组合/您有一些可能未被广泛使用的情况
    2) 您会看到更改日志中没有通知的版本之间的某些行为发生了变化
    3) 您只是想帮助提高ClickHouse的质量并确保您使用的功能在未来的版本中不会被破坏
    4) 一旦测试被添加/接受,您可以确保您检查的角落案例永远不会被意外损坏。
    5) 你将成为伟大的开源社区的一份子
    6) 您的名字将出现在system.contributors表中!
    7) 你会让世界变得更好。

    先决条件

    我假设你运行一些Linux机器(你可以在其他操作系统上使用 docker/虚拟机)和任何现代浏览器/互联网连接,并且你有一些基本的Linux和SQL技能。

    不需要任何高度专业化的知识(因此您不需要了解 C++ 或了解ClickHouse CI的工作原理)。

    准备

    3) fork ClickHouse project - 打开 and press fork button in the top right corner:

    4) 例如,将代码fork克隆到PC上的某个文件夹, ~/workspace/ClickHouse

    1. mkdir ~/workspace && cd ~/workspace
    2. git clone https://github.com/< your GitHub username>/ClickHouse
    3. cd ClickHouse

    测试的新分支

    1) 从最新的clickhouse master创建一个新分支

    1. cd ~/workspace/ClickHouse
    2. git fetch upstream
    3. git checkout -b name_for_a_branch_with_my_test upstream/master

    安装并运行 clickhouse

    1) 安装 (参考离线文档)
    2) 安装测试配置(它将使用Zookeeper模拟实现并调整一些设置)

    3) 运行clickhouse-server

    1. sudo systemctl restart clickhouse-server

    创建测试文件

    1) 找到测试的编号 - 在tests/queries/0_stateless/中找到编号最大的文件

    1. $ cd ~/workspace/ClickHouse
    2. $ ls tests/queries/0_stateless/[0-9]*.reference | tail -n 1
    3. tests/queries/0_stateless/01520_client_print_query_id.reference

    2) 使用您测试的功能的下一个编号和名称创建一个SQL文件

    3) 使用您最喜欢的编辑器编辑SQL文件(请参阅下面的创建测试提示)

    1. vim tests/queries/0_stateless/01521_dummy_test.sql

    4) 运行测试,并将其结果放入参考文件中:

    1. clickhouse-client -nmT < tests/queries/0_stateless/01521_dummy_test.sql | tee tests/queries/0_stateless/01521_dummy_test.reference

    5) 确保一切正确,如果测试输出不正确(例如由于某些错误),请使用文本编辑器调整参考文件。

    如何创建一个好的测试

    • 测试应该是
      • 最小 - 仅创建与测试功能相关的表,删除不相关的列和部分查询
      • 快速 - 不应超过几秒钟(更好的亚秒)
      • 正确 - 失败则功能不起作用
      • 隔离/无状态
        • 不要依赖一些环境的东西
        • 尽可能不要依赖时间
    • 尝试覆盖极端情况(zeros / Nulls / empty sets / throwing exceptions)
    • 要测试该查询返回错误,您可以在查询后添加特殊注释:或-- { clientError 20 }
    • 不要切换数据库(除非必要)
    • 如果需要,您可以在同一节点上创建多个表副本
    • 您可以在需要时使用测试集群定义之一(请参阅 system.clusters)
    • 使用 number / numbers_mt / zeros / zeros_mt和类似的查询要在适用时初始化数据
    • 在测试之后和测试之前清理创建的对象(DROP IF EXISTS) - 在有一些脏状态的情况下
    • 优先选择同步操作模式 (mutations, merges)
    • 0_stateless文件夹中的其他SQL文件为例
    • 确保您想要测试的特性/特性组合尚未被现有测试覆盖

    测试命名规则

    正确地命名测试非常重要,因此可以在clickhouse-test调用中关闭一些测试子集。

    Commit / push / 创建PR.

    1) commit & push您的修改