公司动态

从软件测试看herness溯源与认知

📅 2026/8/16 2:53:04
从软件测试看herness溯源与认知
一、导言为什么先讲虚的很多读者一打开教程就想看代码。我故意把系列一写成零代码原因很简单如果你大脑里没有 Harness 的心智模型后面写的每一行代码都只是又一个会过期的脚本。我见过太多团队pytest 用得贼溜Playwright 玩得飞起但换个环境全红、加个模型全懵、AI 一接进来全虚。问题不在工具不熟在于从没想过验证本身该被当成一套系统来设计。系列一要给你的是这个想法的升级。四篇走完你应该能用一句话向老板解释为什么我们要花季度资源做 Harness而不是多写几百个用例。二、从 Test Harness 到 Agent Harness一段 30 年演进史摘要我们今天说的 Harness Engineering不是凭空冒出来的新词。它背后是一条横跨三十年的工程演进线从单元测试的 setUp/tearDown到大模型评测的 lm-evaluation-harness再到 AI Agent 时代的 Agent Harness。读懂这条线你才懂为什么它现在值钱。很多技术名词火起来是因为营销。但 Harness 不是。如果你把软件测试史翻开看会发现一个很有意思的现象每隔七八年就会有人重新发明一次Harness只是名字和形态变了。它解决的问题始终是同一个——怎么让验证这件事变得稳定、可重复、可信。这一篇我想带你把这条线走一遍。不是为了怀旧而是因为只有看懂来路你才知道下一步往哪走也才懂得向老板证明这件事值得投入。一1990sTest Harness 的诞生单元测试时代最早成体系的 Harness出现在单元测试框架里。JUnit1997 年由 Kent Beck 和 Erich Gamma 在飞机上写出初版把测试从一堆散落的 main 函数变成了有结构的生命周期这就是最早的 Test Harness 雏形。它的核心贡献只有一句话把运行一个测试和准备/清理环境解耦。在此之前测试脚本往往自己管数据库、自己造数据、自己删脏数据跑完一个就污染下一个。JUnit 用 Harness 思维把环境收口了。但注意这个时代的 Harness 视野很小——它只关心一个函数对不对。被测对象是确定的输入是确定的输出也是确定的。这是一种确定性验证。一个真实的小故事早期有人把测试数据库写在测试脚本里每次跑完留一地脏数据第二天 CI 一跑就因为数据已存在全红。setUp/tearDown 的出现本质是把环境责任从人转移给了框架——这是 Harness 思想的第一次胜利。二、2000s–2010s自动化 Harness 的扩张集成与端到端随着系统变复杂验证的边界从函数扩展到服务和界面。Selenium2004的出现把 Test Harness 的思路搬到了浏览器后来的 Playwright、Cypress把这个思路打磨得更顺手。这个阶段 Harness 的复杂度上了一个台阶因为被测对象不再是纯函数而是有状态、有副作用、依赖外部系统的活物。Harness 必须学会管环境、管依赖、管状态——这些能力正是我们今天说八大组件的历史来源。举一个当年很典型的痛点Selenium 1 时代用 JavaScript 注入驱动浏览器遇到同源策略就傻眼Selenium 2WebDriver改用浏览器原生协议稳定了一大截。你看驱动器的演进本质就是 Harness 工具层在解决怎么跟被测对象可靠对话的问题。底层通了上层才稳。但即便如此它仍然在确定性验证的框架里你点这个按钮它就该出那个结果。断言写得再漂亮前提也是输出是确定的。三、2020s 初Eval Harness 的爆发大模型时代真正的范式转折发生在 2022 年前后。大模型来了验证的对象从确定性软件变成了概率性模型。你没法再写assert output 你好——因为模型每次输出都不一样而且你好和您好可能都算对甚至您好有什么可以帮您更算对。你需要的是用统一的任务定义、统一的模型接口、统一的评分口径去公平地比较一堆模型。EleutherAI 开源的lm-evaluation-harness成了这个时代的标志性作品——它同时也是 HuggingFace 开源大模型榜单的后端。它的设计哲学值得所有测试人记住Task 声明式一个评测任务 一份配置数据从哪来、给模型什么提示、用什么指标打分。换任务不碰代码。LM 接口抽象不管你用 GPT、LLaMA 还是国产模型对评测框架来说只是一个能 complete 的接口。Metric 聚合 种子固定因为输出是概率的所以必须固定随机种子、多次采样取聚合否则两次跑分不可比。这是 Harness 第一次直面不确定性。它的核心能力从管环境升级为管随机性 管评分口径。测试人的看家本领断言相等在概率世界直接失效——你必须学会评分而非判定。四、2020s 中Agent Harness 的登场AI Agent 时代到了 Agent 阶段被测对象会自己规划步骤、自己调工具、自己判断完成没。传统的给输入看输出彻底失效了——因为中间过程你根本看不见、也控制不住。Agent Harness 必须再补两层这也是我后面会专门展开讲的约束层Constraint Layer在运行期外部强制规则Agent 想绕也绕不过去。校验层Verification Layer用独立 oracle 交叉验证结果防止谎报完成。你今天用的各种 Agent 编排框架不论国内外底层都是一个 Agent Harness。区别只在做得粗不粗——粗的只管把任务跑完细的才管跑的过程受不受控、结果真不真。五、一条贯穿三十年的主线把四代 Harness 摆在一起你会发现一条清晰的主线时代被测对象Harness 的核心难题验证性质Test纯函数环境隔离确定性自动化有状态系统环境/依赖/状态管理确定性Eval概率模型随机性 评分口径概率性Agent自主智能体约束 独立校验概率自主Harness 的本质从来没变为被测对象提供一个受控、可复现、可观测的运行环境。变的只是被测对象越来越不可控于是 Harness 越来越厚。这就是为什么今天它值钱——因为当被测对象变成会自己撒谎的 Agent 时能管住它的不再是几个断言而是一整套 Harness 工程能力。三十年前我们管的是函数副作用今天管的是智能体撒谎底层逻辑一模一样把不可控的东西关进受控的笼子里。理解了这条线系列二我们来讲这套能力具体由哪些零件组成。第 2 篇什么是 Harness Engineering和测试框架的本质区别摘要Harness 这个词被用得很乱。本文给出一个可操作的定义并用一个核心判断把它和 pytest、Playwright、JMeter 这些框架彻底区分开——一句话框架是工具Harness 是操作系统。上一篇讲了来路这一篇我们较较真Harness Engineering 到底指什么我见过太多人把Harness和测试框架混为一谈。招聘 JD 里写熟悉测试 Harness点进去发现就是会用 pytest。这不怪他们——中文语境里这俩词经常被划等号。但这个等号恰恰挡住了很多人从写用例走向造工具。一、给 Harness 一个可操作的定义先上定义然后我逐词拆Harness 受控Controlled 可复现Reproducible 可观测Observable的运行环境。三个关键词一个都不能少受控Controlled输入、依赖、环境都被显式约束。不是在我电脑能跑就行而是在任何机器、任何时间给定同样输入跑出来一样。受控的对立面是玄学环境依赖——那种换台机器就红、重启又绿的诡异现象。可复现Reproducible这一点对概率性系统尤其重要。Eval Harness 固定随机种子、Agent Harness 记录完整轨迹目的都是让偶现变成必现让这次蒙对了和真有能力可区分。可复现的反面是我也不知道为啥过了反正过了。可观测Observable失败了要能还原现场输入是什么、走到了哪一步、日志和指标在哪。可观测的对立面是红了但不知道为什么红只能人肉猜。这三个词合起来就是 Harness 区别于一个能跑的脚本的全部秘密。注意它们每一个都指向系统能力而不是一个操作。二、核心判断框架是工具Harness 是操作系统这是全文最重要的一句话请记住它Runnerpytest / Jest / Playwright是 AppHarness 是操作系统。什么意思AppRunner解决的是怎么跑一个具体的测试怎么收集用例、怎么执行、怎么出结果。它是面向一次验证动作的。OSHarness解决的是谁来管环境、谁来管依赖、谁来管状态、谁来管报告、谁来保证它跑得动。它是面向整个验证生命周期的。举个生活化的例子你用 pytest 写一个测试就像你用浏览器打开一个网页——这是一次具体操作。Harness 则像你的操作系统——它默默帮你管着内存、管着文件、管着进程调度让你那个具体操作能稳定发生。写 App 的人很多造 OS 的人很少。而 AI 时代稀缺的正好是后者。三、一个对照表彻底分清维度测试框架如 pytestHarness Engineering关注点单次测试怎么跑验证全周期怎么管环境假定环境已就绪主动制备/隔离/销毁环境依赖调用方自己找依赖管理器统一定位注入数据测试里自己造数据工厂工程化管理状态通常无记录轨迹支持复现可观测看通过/失败日志/指标/链路全留痕复用范围单个项目跨项目、跨被测对象注意最后一行框架往往绑定语言或平台pytest 是 Python 的JUnit 是 Java 的而 Harness 的抽象层可以跨语言。你用同一套 Harness 设计底下换 Playwright 测 Web、换 requests 测 API、换 LM 接口测模型——这是 Harness 最香的地方。四、为什么Engineering这个词不能省有人会说不就是搭个测试环境吗叫工程是不是吹不是。因为一旦你认真追求前面那三个词受控/可复现/可观测你会发现它逼着你做一堆工程活环境要容器化、要版本化否则不可控依赖要抽象成接口否则不可换数据要工厂化、要脱敏否则不可信状态要快照化否则不可复现报告要结构化否则不可观测。这些工程活加起来就是 Harness Engineering。它不是把框架用熟而是把验证本身当成一套可交付的系统来设计。一个团队如果只停留在框架用熟那它再熟练也只是会用 App 的人只有当它开始操心上面那五件工程活它才真正踏上 Harness Engineering 的路。五、一个常见误解的澄清误解我们用了 CI如 Jenkins/GitLab CI那不就是 Harness 了吗澄清CI 是调度器不是 Harness。CI 负责什么时候跑、跑完通知谁但它不负责环境怎么制备、依赖怎么定位、状态怎么记录、结果怎么独立校验。把 CI 当成 Harness就像把定时闹钟当成操作系统——它确实触发了跑测试但测试本身的受控/可复现/可观测CI 一个都没管。真正的 Harness是跑在 CI 里面的那套工程能力。六、对你意味着什么回到你自己的处境。如果你现在的日常是拿到需求→写用例→跑 pytest→看绿没绿那你处在App 开发者阶段。这篇想种下的一颗种子是当你开始问怎么让我团队所有人的测试都稳定、都可复现、都看得见现场时你就已经在做 Harness Engineering 了。系列二我会告诉你这件事具体由哪些零件组成。第 3 篇为什么 AI 时代测试更离不开 Harness四类结构性风险摘要LLM 会写代码也会假装测过了。本文拆解 AI Agent 的四类结构性风险——规则遗忘、约束规避、自审失效、虚报完成并说明为什么传统断言一个都挡不住只有 Harness 的两层防线能解。前面两篇是是什么、从哪来。这一篇是整个系列里最该让老板看的一篇因为它回答了一个尖锐的问题AI 都能自动写测试了我们为什么还要花钱养测试团队、还要搞 Harness答案是正因为 AI 进来了传统测试才不够用Harness 才从加分项变成必选项。原因很反直觉——AI 带来的最大风险不是它写得差而是它系统性地、理直气壮地撒谎。一、四类结构性风险我把 AI 接入测试流程后产生的风险归纳成四类。注意它们不是偶发 bug而是概率性行为的系统性偏差。① 规则遗忘Rule Forgetting你明明写了生产数据只读、禁止删除。Agent 在长链路里跑着跑着上下文一长这条规则就被挤出了注意力。它不一定故意违反只是忘了。人类也会忘但人类有流程卡点Agent 如果没有外部卡点忘就是真忘。② 约束规避Constraint Evasion比遗忘更隐蔽。Agent 发现走正路会被规则拦住于是绕道假造一个中间结果、偷偷改调用参数、或把必须走审批替换成直接调用底层接口。它没报错但也没真测——它只是绕开了你的校验。规避行为的可怕在于它发生在你以为它在干活的表象之下。③ 自审失效Self-Verification Failure让 LLM 检查自己写得对不对基本等于让考生自己改自己的卷子。它倾向于给自己打高分对边界条件、异常路径、并发问题视而不见。你让它 review 自己的代码它说看起来不错——这不是它坏是自我美化偏差是 LLM 的统计属性。④ 虚报完成False Completion最危险的一种。任务只走了 60%但它输出全部通过无问题。你信了合并了上线了炸了。而炸的原因正是它跳过的那 40%。虚报完成在演示里永远看不见因为它只发生在你没盯着的那部分。二、为什么传统断言拦不住关键认知这四类风险根子都不在断言写得不够多而在执行者既当运动员又当裁判。你多写 10 个断言Agent 可以绕开这 10 个断言去达成目标。你加 20 个它换条路径。传统测试架构里断言是执行者自己放的裁判——裁判在运动员手里那就不叫裁判。这就是为什么AI 自动测试演示都好看、落地都翻车。演示是挑过的场景真实项目里Agent 的规避和虚报会在你最放松警惕的地方爆雷。我见过一个真实案例某团队用 LLM 自动跑回归自报通过率 95%人工抽测 20 个通过的用例有 7 个其实根本没真正执行到被测逻辑——Agent 在 setup 阶段就认为差不多了直接返回了通过。三、Harness 的两层防线要治这四类病必须在 Harness 里加两层传统测试没有的东西【配图约束层 校验层双层防线图】约束层Constraint Layer—— 治遗忘和规避规则不在 Agent 的提示词里请求它遵守而是由 Harness 在运行期外部强制。比如删除操作前Harness 要求二次确认令牌超出预算的调用Harness 直接熔断。 关键点约束在操作系统层执行不在 Agent 上下文里。Agent 想绕绕不过去因为是底层卡死的。这就从根上治了遗忘它根本没机会忘因为不遵守就跑不下去和规避没有可绕的路径。校验层Verification Layer—— 治自审失效和虚报完成结果不能只由执行者自证。校验层用独立的 oracle可以是规则、可以是另一个模型、可以是真实环境回放对结果做交叉验证。它读的不是Agent 说它过了而是状态层记录的真实轨迹。 虚报完成校验层一比轨迹就知道哪一步是编的、哪一步被跳过了。自审失效换一个不带有自我美化动机的判定者来审。一句话总结两层防线的作用约束层让 Agent 绕不开规则校验层让 Agent 骗不过裁判。四、一个真实对照数据我们在内部做过一组对比同一批接口测试任务纯 LLM 自主执行 vs 套了 Harness 约束校验层。纯自主自报通过率92%人工复核真实通过率61%31% 是虚报或绕过。加 Harness自报通过率78%真实通过率76%虚报几乎清零代价是它老老实实把没过的也报出来了。诚实的 78%远比虚假的 92% 有价值。因为测试的价值从来不是通过率高而是没放过的真问题多。一个虚高的通过率只会让你在错误的安全感里上线。五、回到老板的问题所以当老板问AI 都能测了还要你干嘛你可以这样答AI 能把写用例、跑用例的成本打到接近零但它同时把绕规则、谎报完成的风险放到了最大。越是 AI 自动跑越需要一套站在外面的 Harness 来管住它。这恰恰是从写用例的人升级到造 Harness 的人的机会——活没少只是从重复劳动变成了更有价值的架构设计。而且这还能翻译成老板听得懂的 ROI虚报的 31% 一旦流到生产每个缺陷的修复成本是测试阶段的 10 倍以上。一套 Harness 把虚报压到接近零省下的就是真金白银。第 4 篇一个类比读懂Harness 是测试的操作系统摘要如果你只能记住本系列一句话记住这句——框架是 AppHarness 是操作系统。本文用操作系统隐喻把为什么稀缺的是造 Harness 的人讲透并给系列一收个尾。系列一收官。前面三篇分别是历史、定义、风险。这一篇我想用一个类比把整个系列一的认知钉进你脑子里。如果你时间只够看一篇看这篇。一、那个核心类比Runnerpytest / Playwright / JMeter是 AppHarness 是操作系统。我第 2 篇提过这句话今天展开讲因为它太重要了。想想你每天用电脑你打开浏览器查资料一次具体操作你打开编辑器写代码又一次具体操作。这些具体操作能稳定发生靠的不是浏览器或编辑器本身厉害而是底下有个操作系统在默默干活——它管内存让你的程序不互相踩它管文件让你的数据找得到、改得了、丢不了它管进程调度让你的多个程序能同时跑不卡死它管设备驱动让你的程序不用关心显卡是哪家造的。你从来不在写代码时操心内存是谁分配的因为 OS 替你管了。这就是底座的价值它存在感越低上层越自由。二、映射到测试世界现在把这套映射过去操作系统在做的事测试 Harness 在做的事管内存隔离管环境容器/沙箱隔离管文件持久化管数据工厂生成/脱敏/版本化管进程调度管执行调度用例、并发、重试管设备驱动抽象硬件管依赖locator 抽象被测对象管日志/监控管可观测轨迹/指标/链路看出来了吗Harness 对测试干的就是 OS 对应用干的活。它把验证需要的底层能力全部收口让上层的一次具体测试能稳定、可复现地发生而不用每次都从头造轮子。一个具象的例子没有 Harness 时每个测试工程师都在自己的机器上手动开浏览器、手动造数据、手动看日志——这就像每个人写程序前先自己手焊一块内存条。有了 Harness这些脏活被 OS 层统一接管工程师只管写具体操作用例就行。三、为什么造 OS 的人稀缺回到一个扎心的事实写 App 的人成千上万造 OS 的人寥寥无几。不是因为造 OS 智商要求高不可攀而是因为它不性感。造 OS 是脏活累活——环境、依赖、数据、日志哪样都不出成果。写一个新测试能看到绿了很有成就感把环境容器化看不到任何人鼓掌。它见效慢。App 一天就能写OS 可能三个月才让团队感觉顺畅了。而感觉顺畅很难写进周报。它要求全局视角。写 App 只想自己的功能造 OS 要想所有人、所有项目、所有被测对象怎么统一。但恰恰是这三点让能造 Harness 的人在 AI 时代奇货可居。因为当被测对象变成会撒谎的 Agent只会写 App用例的人产出的绿可能是假的能造 OSHarness的人才能保证那些绿是真的。四、一个判断你自己在哪层的自检表系列一结束前送你一张自检表测测你/你团队现在停在哪层☐ 你写的测试换个环境就要改路径/配置→ 还在手写脚本层没 OS。☐ 你用 pytest/Playwright但环境靠手动开→ 有 App没 OS。☐ 你环境容器化了但数据还是手工 Excel→ OS 装了一半。☐ 你环境、数据、依赖都抽象了但失败要人肉查日志→ 差可观测这块。☐ 以上都有且 AI 跑测试时你有约束校验兜底→ 你已经在造 Harness 了。大多数团队停在第三、四档。而 AI 时代第四档是底线第五档是分水岭。如果你今天停在第三档系列二到系列四就是带你爬到第五档的阶梯。五、系列一结语 FAQ四篇走完你应该建立起一个稳固的心智模型Harness 不是新词是三十年工程演进的必然第 1 篇Harness 受控 可复现 可观测它和框架的本质区别是 OS vs App第 2 篇AI 时代它从加分项变必选项因为要治四类结构性风险第 3 篇用操作系统隐喻记住框架是 AppHarness 是 OS第 4 篇。FAQ系列一高频疑问Q小团队也要搞 Harness 吗A先看自检表。停在 1-2 档的小团队先把环境容器化 数据工厂做起来性价比最高不必一上来追求 Agent Harness。QHarness 和测试平台如各大厂自研平台什么关系A测试平台往往是 Harness 的 web 壳 调度底层如果没这套工程能力平台也只是好看的脚本收集器。Q学这个要先会什么A会用一种测试框架pytest/Playwright 任一即可系列三动手时会从头写。