测试套件和测试基础设施是 ClickHouse 的主要资产之一。我们拥有大量的功能测试、集成测试、单元测试、性能测试、压力测试和模糊测试。测试按提交进行,结果公开可用。
我们还将所有测试运行的结果保存到 ClickHouse 的数据库中。我们从 2020 年 6 月开始收集结果,到目前为止,我们已经拥有 1 777 608 240 条记录。现在,我们每天运行大约 500 万到 900 万个测试。
测试是好的(总体而言)。一个好的测试套件可以实现快速开发迭代、稳定发布,并接受来自社区的更多贡献。我们喜欢测试。如果 ClickHouse 中存在一些奇怪的地方,我们要怎么做?编写更多测试。
有些测试可能是易出错的。易出错的原因不计其数——大多数只是测试脚本本身的简单计时问题,但有时如果一个测试在一千次运行中失败了一次,它可能会揭示代码中细微的逻辑错误。
问题是如何处理易出错的测试。有些人建议自动静音“烦人”的易出错测试。或者在失败的情况下添加自动重试。我们认为这都是错误的。我们没有试图忽略易出错的测试,而是相反:我们尽最大努力使测试更加易出错!
我们制作易出错测试的方法
— 绝不静音或重启它们;如果测试失败一次,总是要查看并调查原因;
— 针对每次测试运行随机化环境,这样测试就会有更多可能导致失败的原因;
— 如果添加了新测试,则运行 100 次,如果至少有一次失败,则不要合并拉取请求;
— 如果添加了新测试,则将其用作模糊测试的语料库——它将揭示即使作者没有为其编写测试的极端情况;
— 随机化线程调度 并在随机位置以及互斥锁/解锁前后添加随机休眠和在 CPU 内核之间随机切换;
— 在速度慢的机器上并行运行所有内容;
关键点:为了防止易出错的测试,我们使测试尽可能易出错。
有一个名为“功能无状态测试”的测试套件,其中包含 3772 个测试。对于 2020-06-13(561 天)以来的每一天以及每个测试(3772 个测试),我都会绘制一张 561×3772 大小的图片,其中如果所有测试运行在当天(对于所有提交和所有组合:release、debug+assertions、ASan、MSan、TSan、UBSan)的 master 分支中成功完成,则像素为绿色,如果至少有一次运行失败,则像素为红色。如果当天不存在测试,则像素将为透明。
这种可视化工具是我为了娱乐而制作的玩具
它看起来像一棵圣诞树(你需要一点想象力)。如果你有不同类型的想象力,你可以把它看作是一个长满鲜花的绿色田野。
时间从左到右。测试使用非唯一数字编号(新测试通常会获得更大的数字),这些数字位于纵轴上(较新的测试在顶部)。
如果你在水平线上看到红点——这是一个易出错的测试。如果你在垂直线上看到红点——这意味着我们有一天不小心破坏了 master 分支。如果你看到黑色的水平线或树上的切口——这意味着测试是用一些旧的数字添加的,很可能是因为一些长期存在的特性分支被合并了。如果你看到黑色的垂直线——这意味着某些天没有运行测试。
添加新测试的速度由圣诞树的高度和宽度表示。当我们添加大量的测试时,树会以几乎垂直的斜率生长。
该图片是由 HTML 页面 使用一些直接查询 ClickHouse 数据库并写入画布的 JavaScript 准备的。构建这张图片大约需要 10 秒钟。我还准备了一个 交互式版本,其中包含已保存的数据,您可以在其中玩耍并找到您最喜欢的测试。