博客 / 工程

通过不稳定的测试来装饰圣诞树

author avatar
Alexey Milovidov
2021 年 12 月 27 日 - 分钟阅读

测试套件和测试基础设施是 ClickHouse 的主要资产之一。我们有大量的函数测试、集成测试、单元测试、性能测试、压力测试和模糊测试。测试在每次提交时运行,结果公开可用。

我们还将所有测试运行的结果保存到 ClickHouse 的数据库中。我们从 2020 年 6 月开始收集结果,到目前为止已经有 1,777,608,240 条记录。现在我们每天运行大约 500 万到 900 万次测试。

测试是好的(总的来说)。一个好的测试套件可以实现快速的开发迭代、稳定的发布,并接受来自社区的更多贡献。我们热爱测试。如果 ClickHouse 中有什么奇怪的地方,我们该怎么办?编写更多测试。

有些测试可能是不稳定的。造成不稳定的原因数不胜数——其中大多数是测试脚本本身中简单的时序问题,但有时如果一个测试在千分之一的情况下失败,它可能会揭示代码中细微的逻辑错误。

问题是如何处理不稳定的测试。有些人建议自动屏蔽“恼人”的不稳定测试。或者在失败的情况下添加自动重试。我们认为这一切都是错误的。我们没有试图忽略不稳定的测试,而是反其道而行之:我们尽最大努力使测试更加不稳定!

我们不稳定测试的秘诀

— 永远不要屏蔽或重启它们;如果测试失败一次,始终查找并调查原因;

— 为每次测试运行随机化环境,以便测试有更多可能失败的原因;

— 如果添加了新测试,则运行 100 次,如果至少有一个失败,则不要合并拉取请求;

— 如果添加了新测试,请将它们用作模糊测试的语料库——即使作者没有为它们编写测试,它也会发现边缘情况;

随机化线程调度,并在随机位置以及在互斥锁/解锁之前和之后添加随机睡眠和 CPU 核心之间的切换;

— 在慢速机器上并行运行所有内容;

关键点:为了防止不稳定的测试,我们使我们的测试尽可能不稳定。

可视化不稳定测试的好方法

有一个名为“functional stateless tests”的测试套件,其中包含 3772 个测试。对于自 2020-06-13 以来的每一天(561 天)和每个测试(3772 个测试),我绘制了一张 561×3772 大小的图片,其中如果所有测试运行在主分支中当天成功完成(对于所有提交和所有组合:release、debug+assertions、ASan、MSan、TSan、UBSan),则像素为绿色;如果至少一次运行失败,则像素为红色。如果测试当天不存在,则像素将是透明的。

这个可视化是我为了好玩而制作的一个玩具

tree_half.webp

它看起来像一棵圣诞树(你需要一点想象力)。如果你有不同的想象力,你可以把它看作是一片开满鲜花的绿地。

时间是从左到右。测试用非唯一数字编号(新测试通常获得更大的数字),这些数字在垂直轴上(较新的测试在顶部)。

如果你看到水平线上的红点——这是一个不稳定的测试。如果你看到垂直线上的红点——这意味着有一天我们不小心破坏了主分支。如果你看到黑色的水平线或树上的切口——这意味着测试是用一些旧的数字添加的,很可能是因为合并了一些长期存在的功能分支。如果你看到黑色的垂直线——这意味着有些天测试没有运行。

添加新测试的速度由圣诞树的高度和宽度表示。当我们添加大量测试时,树会以几乎垂直的斜率增长。

该图像由 HTML 页面和一些 JavaScript 准备,这些 JavaScript 直接查询 ClickHouse 数据库并写入画布。构建这张图片大约需要十秒钟。我还准备了一个交互式版本,其中包含已保存的数据,您可以在其中玩耍并找到您最喜欢的测试。

分享这篇文章

订阅我们的新闻通讯

随时了解功能发布、产品路线图、支持和云产品!
正在加载表单...
关注我们
X imageSlack imageGitHub image
Telegram imageMeetup imageRss image