AI公司测开笔试全解析:从机器学习基础到模型接口测试
2026/8/31 7:17:24 网站建设 项目流程

刚看到这个标题的时候,我愣了一下。2019年的第四范式,AI圈子里已经很有名了,但一个做机器学习平台的公司,校招测试开发笔试题能考出什么花来?这是我当时脑子里冒出的第一个问题。

后来真的拿到卷子,发现它跟我之前刷过的所有互联网大厂测开笔试题都很不一样。常规的测试理论、数据库、Linux、网络协议这些是有的,但卷子里还塞了不少机器学习的基础概念、模型评估指标,甚至还有一道让你给一个模型预测接口设计测试用例的题。当时考场上一片叹气声,很多人栽在“看不懂题目在问什么”这一步。现在回过头来看,这套笔试题其实非常典型地反映了一个AI公司对测试开发工程师的真实期待:你不仅要会“测试”,还要能理解被测对象——也就是模型和AI平台本身。

这篇文章我就以这套笔试题为引子,拆一拆AI公司测开岗笔试背后真正想考察的东西,结合我自己的实操经验,把题型、解题思路、踩坑点都梳理一遍。无论你是正在准备AI公司测开面试,还是单纯想看看“AI公司的测试题到底长什么样”,这篇都能给你一些实在的参考。

1. 笔试背后,AI公司到底在找什么样的测开

1.1 测开岗在AI公司的真实定位

大多数人对测试开发的印象还停留在“写写自动化脚本、点点页面、提提bug”的阶段。传统互联网公司里,测开确实更多围绕业务功能、接口、性能去做质量保障。但在AI公司,情况完全不一样。

第四范式这类公司的核心产品是什么?是机器学习平台、自动建模工具、模型服务。这些产品的被测对象,除了传统的前后端功能,还有模型效果、训练流程、特征工程、分布式调度这些偏算法和数据的东西。这时候测试开发要做的,就不只是“点击按钮看结果对不对”,而是要能从数据流、特征流、模型指标的角度去设计测试方案。

我在实际工作中最深的一个体会是:AI公司的测开,本质上是“懂一点算法的测试工程师”。你不需要像算法工程师那样去调模型、写Loss,但你必须看得懂特征怎么处理、模型输入输出是什么、评估指标AUC和PR曲线代表什么含义。因为如果你连被测对象的基本原理都不懂,你设计的用例就是空中楼阁,连bug长什么样都判断不了。

所以2019年这套笔试题里出现机器学习基础,不是凑数,而是在筛人。筛掉那些只会背测试理论、对模型一窍不通的候选人,留下那些具备跨领域理解力的人。

1.2 2019年前后这套题目的考察逻辑

2019年这个时间点很有意思。那会儿AI落地的概念已经从“炫技”转向“工程化”,很多AI公司开始认真思考一个问题:模型上线之后,质量谁来保证?传统的功能测试覆盖不了模型漂移、数据分布变化、特征缺失这些问题。于是测试开发的职责被重新定义了。

这套笔试题的考察逻辑,可以拆成三层:

  • 第一层:基础工程能力,包括数据结构、编程、数据库、Linux命令,这是任何一个测开都绕不过去的硬底子。
  • 第二层:测试专业能力,包括用例设计方法、自动化测试思路、问题排查手段,这是测开区别于普通开发的核心竞争力。
  • 第三层:AI领域认知,包括机器学习基础概念、模型评估方式、对AI产品形态的理解,这是AI公司测开的加分项,也是2019年校招里最有区分度的部分。

我在答题的时候明显感觉到,出题人想找的是那种“基础扎实、思维灵活、对AI产品有感觉”的候选人。单纯刷题刷出来的选手,遇到第三层题目会非常难受,因为那部分不是靠背八股文能解决的,它需要你真的理解“模型是怎么工作的”。

2. 核心题型拆解:算法、机器学习与测试思维的组合拳

2.1 编程题:不考难题,考基本功

2019年的笔试编程题,难度跟互联网大厂的中等题差不多,不会出那种劝退级的hard题。我印象比较深的是有一道跟“LRU缓存”相关的题,要求实现一个固定容量的缓存结构,支持get和put操作,时间复杂度要求O(1)。这道题在LeetCode上有原题,但笔试环境里没有自动补全、没有IDE提示,全靠手写,很考验基本功。

LRU这道题的解题思路其实很固定:哈希表加双向链表。哈希表负责O(1)查找,双向链表负责O(1)的节点移动。核心操作有两个:

  • get的时候,如果key存在,把对应节点移到链表头部,返回value;
  • put的时候,如果key存在,先删掉旧节点再插入新节点到头部;如果容量满了,删掉链表尾部的节点,同时从哈希表里移除对应key。

我当年手写的时候,踩过的一个坑是:很容易忘记处理“更新已有key时,哈希表里的value也要同步更新”。如果只是把节点移到头部,但没更新value,后面get到的还是旧值,这种bug在笔试的短时间里很难用眼睛查出来。所以后来我养成了一个习惯,凡是涉及到“更新已有数据”的操作,第一件事就是先想清楚哈希表里存的值是否需要一起改。

还有一个细节是双向链表的边界处理。很多人写链表题,最怕的就是空指针。我在笔试时习惯用一个哑结点(dummy head)和一个哑尾结点(dummy tail),这样头插、尾删都统一了逻辑,不用单独判断链表为空的情况。这个小技巧能省下大量边界判断的时间,强烈建议手写链表题的时候都用这个套路。

2.2 机器学习基础题:AUC与PR曲线的坑

这部分是这套题目里最有“AI公司特色”的。题目不会让你推导复杂的数学公式,而是考察对核心概念的理解。我记得有一道选择题是关于AUC和PR曲线在正负样本不平衡时的表现差异,选项里设置了好几个容易混淆的表述。

这里我多说一句,AUC和PR曲线这两个概念,很多做测开的人一开始是懵的。它们都是用来评估二分类模型好坏的指标,但侧重点不一样:

  • ROC曲线关注的是真正例率(TPR)和假正例率(FPR),AUC是ROC曲线下方的面积。它的特点是,当正负样本比例变化时,ROC曲线基本保持稳定,所以AUC对样本不平衡不那么敏感。
  • PR曲线关注的是精确率(Precision)和召回率(Recall),当负样本远多于正样本时,PR曲线能更敏感地反映模型性能的变化。

所以题目如果问“在正负样本极不平衡的情况下,哪个指标能更好地区分模型好坏”,答案往往是PR曲线而不是AUC。这个知识点如果你只背定义,不看场景,很容易选错。

我当时复习的时候,用的是“控制变量”的思路来理解:AUC和PR都涉及到样本分布,但AUC同时看了正样本和负样本的排序关系,而PR只聚焦在正样本的预测质量上。当负样本暴增,FPR会变得极其小,ROC看过去一切正常,但模型对正样本的实际召回可能已经崩了。这个时候PR曲线就比AUC更能暴露问题。

对测开来说,理解这个点的价值在于:写测试用例的时候,你要知道在什么场景下该关注哪个指标。比如你测试一个用户流失预警模型,流失用户占比可能只有1%,这时候你用AUC来判断模型效果,很可能会漏掉召回率严重下降的问题。正确的做法是PR曲线和AUC同时看,再结合具体业务阈值去看精确率和召回率的具体数值。

2.3 测试用例设计题:等价类边界值在模型服务上的变种

这套卷子里还有一类题,是给一个场景,让你设计测试用例。但场景不是普通的登录注册,而是模型预测接口。比如给你一个房价预测API,输入是房屋面积、房龄、周边学校数量,输出是预测价格,让你设计测试用例。

很多第一次接触这类题的人会直接套用传统的等价类划分:面积输入一个正常值、一个异常值、一个边界值,就以为完事了。但这只答对了一半,而且是流于形式的一半。

模型服务接口跟普通接口最大的区别是什么?它的逻辑正确性不完全取决于“返回200还是500”,还取决于“返回的数值是否合理”。所以用例设计要分成两个维度:

  • 功能维度:参数缺失、类型错误、范围越界、必填项校验,这些跟普通接口一致。
  • 模型维度:输入特征的组合是否覆盖训练数据的分布;异常的输入值(比如面积为负数、房龄为负)模型会不会产生怪异输出;模型对缺失值的处理是否符合预期。

我当时设计用例的时候,加了一个很关键的点:当一个特征异常时,模型输出的结果应该是什么?是直接报错,还是用默认值填充后正常返回?这个行为在需求文档里往往没有明确写,但恰恰是上线后最容易出事故的地方。一个靠谱的测开,应该把它作为单独的场景拿出来测,并且主动找开发确认预期行为。

3. 一道典型题目的完整实操复盘

3.1 题目还原:给一个房价预测API设计测试

为了把这类题讲透,我以当年那道题的“变体”为例,带着你完整走一遍从读题到落地测试的过程。假设题目是这样:

某AI公司提供了一个房价预测API,接口为 POST /api/house/price,请求体是JSON,包含三个字段:

  • area:房屋面积,float类型,单位平方米,取值范围(0, 500]
  • age:房龄,int类型,单位年,取值范围[0, 200]
  • school_num:周边学校数量,int类型,取值范围[0, 50]

响应体是:{"price": 123.45},表示预测房价(万元)。 请设计测试用例,并说明需要关注的关键风险点。

第一眼看上去,这不就是个普通接口题吗?但如果只盯着参数校验,就掉进出题人的陷阱了。这是一道考察“AI产品测试思维”的题,答题时必须体现出你理解“模型服务的特殊性”。

3.2 需求分析到用例设计的完整路径

我的思路是分四步走:

第一步,先不急着写用例,先确认接口的输入输出契约。请求字段的类型、取值范围、是否可空、响应结构,这些是设计用例的基础。题目里给了范围,但实际工作里范围往往在接口文档里,可空的定义经常含糊,拿到题先把这个列出来。

第二步,用等价类和边界值方法覆盖参数校验。这部分要写得既全面又有条理。

第三步,也是关键的一步,设计“模型行为”维度的用例。比如:合法的边界组合(area=500, age=200, school_num=50)模型能不能正常输出;极端组合(area=0.001, age=199, school_num=0)输出是否在合理范围内;特征缺省(age不传)时走默认值填充还是报错。

第四步,补充安全与性能方面的用例。安全性上要验证SQL注入、超大JSON payload,性能上要关注高并发下的响应时间。

最后把这些整理成一张用例表格,既清晰又专业。

我设计出的用例表格核心部分大概长这样:

用例编号测试维度输入数据预期结果说明
TC01功能-正常area=89.5, age=5, school_num=3返回200,price为合理float正常输入
TC02功能-边界area=500, age=200, school_num=50返回200,price合理所有字段取上边界
TC03功能-下边界area=0.001, age=0, school_num=0返回200或明确报错注意area趋近0的极端情况
TC04参数异常-areaarea=-10返回4xx,错误信息明确负数非法
TC05参数异常-age类型age="五年"返回4xx,类型错误字符串类型非法
TC06参数缺失不传school_num行为符合接口文档约定需与开发确认是否能缺省
TC07模型行为-数据分布外area=500, age=0, school_num=0输出值应在合理业务范围内验证模型对极端特征的处理
TC08模型行为-特征缺失全部字段传null不返回500,必须有约定行为防止NPE或模型崩溃
TC09安全-注入area=1; DROP TABLE house返回4xx,不执行任何危险操作防SQL注入
TC10性能-并发100并发请求P95响应时间在可接受范围视业务要求而定

3.3 自动化测试框架的代码实现

笔试第三问如果让你写一段自动化测试脚本,用Python加requests库就能快速实现。下面是一个可以直接用的最小框架:

import requests import pytest BASE_URL = "http://api.test.house-price.com" def predict_price(area: float, age: int, school_num: int): payload = { "area": area, "age": age, "school_num": school_num } resp = requests.post(f"{BASE_URL}/api/house/price", json=payload, timeout=5) return resp def test_normal_input(): resp = predict_price(area=89.5, age=5, school_num=3) assert resp.status_code == 200 data = resp.json() assert "price" in data assert isinstance(data["price"], float) def test_max_boundary(): resp = predict_price(area=500, age=200, school_num=50) assert resp.status_code == 200 data = resp.json() assert 0 < data["price"] < 100000 @pytest.mark.parametrize("field,value", [ ("area", -10), ("area", 0), ("age", "五年"), ("school_num", 60), ]) def test_invalid_params(field, value): payload = {"area": 89.5, "age": 5, "school_num": 3} payload[field] = value resp = requests.post(f"{BASE_URL}/api/house/price", json=payload, timeout=5) assert resp.status_code == 400 or resp.status_code == 422 def test_missing_param(): payload = {"area": 89.5, "age": 5} resp = requests.post(f"{BASE_URL}/api/house/price", json=payload, timeout=5) assert resp.status_code != 500 # 具体是4xx还是200,取决于接口对缺失字段的约定

这个框架里藏着几个我踩过坑之后才加进去的细节。第一个是timeout参数,很多新手写requests请求时不加timeout,一旦被测服务卡住,测试脚本会无限期挂起,在CI里特别坑。第二个是参数化用例,pytest的parametrize非常适合这种“同一个操作不同入参”的用例,写起来干净,跑起来一目了然。第三个是断言不能只写状态码,还要校验响应的结构字段,因为接口返回200但缺字段的情况,在微服务架构里并不少见。

3.4 边界条件与数据构造的细节

我在真实做AI模型接口测试时,发现最容易被忽视的是“数据分布外”(Out of Distribution,简称OOD)的样本。模型训练时看到的特征值范围是有限的,如果线上请求里出现训练分布之外的输入,模型会给出一个“看似合理但实际上完全不可信”的输出。

举一个具体的例子:训练数据里房屋面积分布在20到200平方米之间,但线上有一个请求的area=500。模型可能会根据学习到的线性趋势外推,给出一个非常离谱的价格,比如两千万。这个数值格式上完全合法,接口返回200,普通的功能测试根本不会发现任何问题,但业务上它就是错的。

所以我在设计用例时,专门加了一条“分布外数据”的用例,并且会在测试报告里单独标注:这个场景的预期结果不能简单写成“数值合法”,而是要结合业务去定义什么叫“合理”。比如跟业务方确认,当面积超过300时,超出训练范围,模型输出的置信度不可保证,需要网关拦截或者降级处理。这些内容不会出现在接口文档里,但却是AI产品测试里最容易出事故的地方。

4. 面试打分点与日常准备的避坑清单

4.1 笔试环节最容易丢分的三个地方

从我自己这些年面试候选人和复盘笔试经历来看,丢分往往不是因为你不会那道题,而是因为你踩了下面这三个坑。

第一个坑是编程题眼高手低。很多人看到LRU缓存觉得自己会,但真要手写的时候,链表指针一乱就废了。我的建议是,准备阶段不要只看题解,一定要动手在纸上或者无IDE的编辑器里写,训练自己在没有补全环境下写代码的能力。当年我能完整写出来,靠的是考前在记事本里把高频链表题的代码敲了不下五遍。

第二个坑是机器学习概念只背定义,不理解场景。比如AUC和PR曲线,出题人稍微换一个问法就懵了。要真正理解一个指标,最好的方法是去构造一个极端数据分布,用手算一遍或者随手画一画,看指标怎么变化。我后来带新人时,都是让他们这样练的,效果比死记硬背好太多。

第三个坑是用例设计只停留在参数校验,忽略模型行为。对于AI公司的测试题,你的用例如果只写了“类型错误、范围越界”这类传统用例,没有体现出对模型输入分布、特征缺失、输出合理性的思考,分数基本就定格在及格线以下了。哪怕你只多写了两条模型行为维度的用例,都会让面试官眼前一亮。

4.2 现场面试追问里藏着的加分点

笔试过了之后,面试官往往会拿你做过的方案继续追问。我当年被追问的一个问题是:你在测试房价预测接口时发现area=500时模型输出异常,你会怎么定位问题?

这个问题的完整回答思路应该是:先确认异常表现是什么,是数值溢出、NaN还是业务上的不合理;然后复现问题,用同一组输入多次请求,排除随机性;接着抓取模型服务的日志,看特征处理前后的值,确认是特征工程环节的问题还是模型推理环节的问题;最后是回归测试,确定这个异常是从哪个版本开始引入的,修复后有覆盖性验证。

面试官问这个问题的目的,不是真让你马上定位到bug,而是看你有没有一套“从现象到根因”的排查方法论。我在回答时还加了一个细节:我会先用小流量灰度,把异常输入镜像到沙箱环境去复现,避免在线上环境反复打脏数据。这个细节一出来,面试官通常都会点头,因为这说明你考虑到了线上安全。

除了排查问题,面试官还可能追问你“测试左移”的理解。在AI公司,测试左移意味着你要在数据准备阶段就介入,检查训练数据和线上数据的分布一致性,而不是等模型上线之后再测。如果能把这一层说出来,你的回答会比单纯讲自动化框架高一个段位。

4.3 给新人的一份可复用的准备路线

如果你现在正在准备AI公司测开岗位,我给你一条实际验证过的准备路线。

基础阶段,先把数据结构与算法中的高频题刷一遍,重点关注数组、链表、哈希表、队列,能自己手写实现。这一阶段的目标是能白板写出无语法错误的代码。测试基础方面,等价类划分、边界值分析、因果图、场景法,这些用例设计方法要能随手举例。

进阶阶段,补充机器学习基础概念。不要求会推导公式,但至少要知道什么是过拟合、什么是交叉验证、什么是精确率和召回率、AUC和PR的区别。推荐去看一些模型评估相关的文章,理解指标背后的业务含义。如果条件允许,自己用sklearn跑一个简单的二分类模型,打印出ROC曲线和PR曲线,对照着看不同数据分布下两条曲线的变化。

专项阶段,针对AI产品的特点,学习如何测试模型服务。可以从一个开源的模型部署项目入手,自己搭一个本地接口,然后用pytest写一套覆盖参数校验、模型行为、性能、安全四个维度的自动化测试。做完这个项目后,你不仅有了实战经验,还能在面试时拿出一个完整的、有自己想法的测试方案来聊。

还有一个小建议,准备面试时不要只看“测试开发八股文”,那些东西能帮你过基础面,但过不了AI公司的专业面。真正拉开差距的,是你对“被测对象”的理解深度。多花点时间搞清楚模型训练和推理的基本流程,比多背二十道接口测试常见题有用得多。

我在实际工作中带过不少新人,发现一个规律:凡是能在笔试和面试中表现出“对模型有基本理解”的候选人,入职后的上手速度会快非常多。因为AI公司的质量保障工作,核心挑战从来不是“会不会用工具”,而是“能不能理解系统的行为逻辑”。工具可以学,但思维方式需要提前培养。

最后再分享一个小技巧:笔试时如果遇到机器学习相关的题目,不要慌,把自己知道的原理、公式、适用场景条理清晰地写出来,哪怕不能完全答对,也能向面试官展示你的思考过程。我在批改面试题时,最欣赏的是那种“虽然没给出最佳答案,但思路完整、关键点都踩到了”的卷子。毕竟测试开发这个岗位,要的就是那种能在不确定中找到问题线索的人。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询