一个补丁只动了一个缓存辅助函数。第一次跑CI,全绿。两天后,主干上有个没人改过的测试红了。
那个测试已经反复横跳了好几周。补丁没有弄坏它,补丁只是恰好落在了硬币幸运的那一面。单次跑一遍测试套件,根本分不清这两种情况。智能体产出补丁的速度足够快,运气成了主要的噪声来源。判定需要比补丁本身更多的样本。
问题出在聚合的退出码上。pytest返回一个0或一个1,这个数字把几百个测试结果压缩成了一个比特。一个补丁弄坏三个测试、又修好另外三个,照样可以退出0。要比较的是逐个测试的结果,而不是那一个比特。
做法是:在父提交和打了补丁的提交上各跑两遍测试套件,一共四次。多出来的这几遍,第一次帮你躲过假绿的时候就回本了。
四次跑完,怎么分类
把父提交的两次结果和补丁提交的两次结果放在一起比对,每个测试会落到一个标签上:
- frozen:补丁之前就不稳定,两次结果不一致
- unchanged:前后完全一样
- repaired:之前失败,之后通过
- broken:之前通过,之后失败
- inconclusive:测试缺失或收集出错
退出码在这里只对broken触发。其余标签都是给评审者读的文字,不是合并信号。
unchanged这个标签值得单独说。一个补丁让400个测试保持绿色,它并没有赢得信任,它只是没有提供任何关于这次改动的证据。只有broken和repaired,才把信息从补丁里搬进了你的决策。
夹具要钉哈希,不是钉名字
属性检查继承夹具递给它的一切。一个悄悄漂移的夹具,会把属性测试变成装饰品。输入要按内容钉死:对每个夹具文件算一个摘要,和预先记录的期望值比对。这个检查一旦失败,整张分类表就该扔掉——夹具变了,比较就失效了,后面的判定表不值得再读。
四次运行放在哪跑?快套件四次跑塞得进一台小机器,慢套件不行。MonkeyCode提供免费模型访问和免费服务器选项,够托管上面这套工具,第一天不用租runner。声明:本文是作为MonkeyCode产品推广的一部分准备的。
产品不改变方法。模型提出补丁,配对运行给它分类,人来读这张表。把这三步分开,工具就始终可替换,不管diff是谁生成的。
代价和该跳过的人
双跑意味着双倍算力。一个20分钟的套件,现在每个补丁要40分钟,在繁忙的仓库里这是实打实的账单。
两次运行也冻不住周期比两次运行更长的抖动。五十次才翻一次的测试照样会溜过去。当判定结果贴近发布门槛时,再加第三次运行。
如果你的套件没有确定性夹具,或者CI没法同时检出两个提交,跳过这套方法。如果光是收集测试就比人工评审还贵,跳过。如果你打算用这张表取代人读diff,也跳过。
从一个仓库、一个抖动文件开始。两边各跑两次,打印表格,数一数unchanged有多少行。这个数字会告诉你,你那些绿色的构建里,到底有多少曾经算得上证据。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.