软件测试面试通关:高频题深度解析与场景化答题思路 面试这件事我做过候选人也做过面试官前后加起来也有十来个年头。每次看到网上流传的软件测试面试题【含答案】这类资料我心情都挺复杂的——收藏的人多真能用上的人少。原因很简单面试题从来就没有标准答案面试官问每一道题背后都有一个隐藏的考察点你背得越熟反而越容易暴露没理解。这篇文章把我这些年面试别人和被别人面试时真正高频出现、真正能筛出水平的题目整理了一遍。答案我会给但更会告诉你面试官为什么问这道题怎么答才算答到点上。适合准备跳槽的测试工程师、刚转行想入测试的朋友以及带新人的测试组长。哪怕你不面试把这些题当自查清单过一遍也能发现不少盲区。1. 面试前先搞明白面试官手里的评分表到底长什么样1.1 两道题背后同一个考察点先说一个我印象很深的例子。有一次面一个工作了三年的候选人简历上写着熟悉测试流程能独立负责项目测试。我问他登录功能你怎么设计测试用例他答得很快正确的用户名密码能登录、错误的不能登录、空值提示、记住密码、验证码……一口气列了七八条听起来挺全。我又问如果登录按钮被连续快速点了十次系统最多只能允许五次失败锁定你用例里会怎么设计他愣住了过了几秒说这个我没考虑过。后来这位候选人被pass了不是因为他不会这道题而是他暴露了一个面试官非常在意的问题只答对了常规但没展示出异常和边界的思维习惯。做测试的日常工作里大量时间就是和异常输入、边界情况、系统容错打交道。你设计的用例决定了线上哪个角落会出事。其实大多数面试题都围绕同一个底层能力你测一个东西能不能主动想到它会在什么情况下出问题。1.2 面试官最反感的三种回答模式我面试过一个候选人问到一个接口状态码他说200是成功404是没有页面500是服务器错误我追问那201呢他答不上来接着补了一句平时我就记住这几个其他用到了再查。这里不是说要求每个人把RFC全部背下来而是他的回答暴露出一个问题测试这个岗位很多结论是要靠查资料、查文档来验证的但面试官想看到的是你知道该在什么时候查、查完之后能不能看懂。面试时直接说用到了再查等于告诉面试官你平时可能没怎么遇到过非典型的情况也没想过做系统化梳理。还有三类回答基本是碰到就减分的背定义型问什么是等价类就背出把输入域划分成若干个等价类问怎么用就背不出案例了。堆工具型我会用JMeter、Postman、Selenium、Appium、Fiddler、Charles……问到你在什么场景下选它、不用它换个工具行不行就语塞。抢答型题目还没听完就开答答到一半发现面试官问的是A和B怎么配合他答的是A怎么用。面试官把你请过来不是为了核对你会不会背诵而是想判断这个人放到我们团队里能不能真正解决线上问题。所以整场面试你的每一句话都应该围绕这个目标。2. 测试理论题把背定义升级成讲场景的答法2.1 等价类与边界值为什么总是搭配着问等价类划分和边界值分析是所有测试理论题里出场率最高的。这两个概念本身不难难的是很多人把它们当成选择题来背忘了它们是方法论。我建议的回答结构是这样的等价类划分是把输入域按是否触发相同处理逻辑来分组每组取一个代表值来测。边界值则是在等价类的边界附近取值因为大量bug都发生在边界上。这两个方法通常是配合使用的等价类管的是测哪些数据边界值管的是重点关照哪些点。说完理论最好顺手举个案例比如一个输入框要求年龄在18到60岁之间。先用等价类划分有效类是18-60无效类是小于18和大于60。取数时有效类取30无效类取10和70。再用边界值补充检查0、17、18、19、59、60、61、100这些点。虽然等价类说30能代表整个有效区间但18和60是业务上最容易处理错的位置。这个答案好在哪它让面试官看到你不光知道概念还知道怎么落地到具体的输入框上。面试官如果接着问为什么要单独测边界你可以补一句开发写判断条件时经常写成age 18或者age 60边界漏掉一个线上就多一个bug。2.2 场景法、判定表、正交实验怎么选才不呆等价类和边界值主要针对单个输入项但实际测试对象往往是多条件组合。面试官考察你对场景法、判定表、正交实验的理解其实是在看你会不会根据业务复杂度选工具。举个例子一个订单支持多种支付方式微信、支付宝、银行卡每种支付方式下有优惠券可用或不可用。用判定表来设计用例就很清晰——支付方式三种取值优惠状态两种取值组合出六种情况再把每种情况的预期结果列出来。判定表的优势是保证组合不遗漏。但是如果支付方式有十种优惠券规则有五种再套判定表用例数量会爆炸。这时候正交实验就有用了从全量组合里挑一批有代表性的组合来覆盖主流场景代价是放弃对全覆盖的追求。回答这类问题记住一个原则就够了项目里不是所有功能都值得全组合覆盖你要能说清楚哪些功能必须用判定表保全覆盖哪些功能可以用正交降低用例量。比如涉及金额、权限、状态流转的功能必须严谨而一些展示类的信息组合用正交法挑重点场景就行。这一点说透了面试官就知道你是有项目判断力的不是只会背流程。2.3 容易说错的两道入行级理论题第一道缺陷的生命周期里有哪些状态谁负责流转到哪个状态参考回答缺陷的常见状态有New新建、Open打开、Fix修复、Verify验证、Reopen重开、Closed关闭。测试人员负责提交New和验证Fix、验证通过后置Closed开发负责把缺陷置Fix测试人员在回归不通过时置Reopen。如果项目有评审环节还有Reject、Delay等状态。这道题基本是送分题但很多人会卡在Reopen是谁提的上或者把状态和操作人记混。建议直接把你们实际项目的状态流转图画一遍面试官一听就知道你真是干过活的。第二道测试计划包含哪些内容测试报告包含哪些内容参考回答测试计划一般包含测试范围、测试目标、资源安排人员、环境、时间、测试策略与方法的选定、风险评估、进度计划、准入准出标准。测试报告包含测试概况、用例执行情况、缺陷统计分析按严重程度、模块分布、剩余风险、测试结论。看答案你会觉得不难但实际面试里至少有三成人会漏掉准出标准和风险。这两个词是测试计划里最体现专业的点——计划不止是排期你还要能回答怎么样才算测完了哪些风险我提前预判到了。3. 接口测试题POST/PUT、幂等性、定位bug答到点子上的关键3.1 POST和PUT只说POST不安全会丢掉大半分问POST和PUT的区别十个人有九个会回答POST不是幂等的PUT是幂等的。这句话本身没错但只回答到这一层说明你只是背了结论。面试官真正想听的是你理解HTTP语义对接口设计的影响。我建议这么答POST和PUT的核心区别在于语义。PUT是幂等的它应该用于完整替换某个资源同一个请求发多少次资源最终状态不变POST是非幂等的它用于创建资源或触发一个操作同一个请求发多次可能创建出多份数据。所以PUT /user/123表示把123这个用户整体更新成请求体里的内容重复调用结果都一样而POST /user表示新增一个用户重复点一次服务端就多一条记录。答完这些可以补一个实际场景我们之前做过一个接口创建订单用的是POST支付回调用的也是POST。为了防止支付回调被重复消费服务端必须做幂等控制比如按订单号加状态锁而更新订单本身用PUT天然幂等。这个补充很重要因为它体现你关注的不只是动词怎么选还关注接口在真实业务里怎么防重复、保安全。面试官追问怎么防重复你可以顺势讲出你们的幂等方案主动权就回到你手上了。3.2 幂等性用一个生活例子讲清楚很多人觉得幂等性抽象讲不生动。我教大家一个最简单的类比电梯楼层按钮就是幂等的你按十次去5楼电梯依然只去一次5楼但一个没有防重复机制的发起转账按钮就是非幂等的点十次可能转出十笔钱。回到技术层面幂等性指的是一次请求和多次请求对服务端资源产生的最终影响是一致的。实现幂等常见的方案有几种唯一标识客户端每次操作生成一个唯一ID服务端记录已处理过的ID重复请求直接返回上一次结果。状态机制比如订单已经从待支付变成已支付再收到支付回调就直接忽略。数据库约束利用唯一索引拦住重复插入。如果面试官问到你呢你要做的不是把所有方案背出来而是挑一种结合你经历讲清楚我当时做的支付回调接口采用的方式是回调里带支付单号服务端先查订单状态如果已经是已支付就返回成功不重复处理同时在订单表上建了支付单号的唯一索引双保险。有场景、有方案、有细节这一题就站住了。3.3 接口测试测不出bug问题出在哪这题几乎是在考察你的工作复盘能力。面试官问你用接口测试没发现什么问题这正常吗你要是回答说明系统很健壮基本就凉了。正常的回答思路是这样的测不出bug不代表没有bug通常要反思的是测试设计本身。可能的原因有几类一是用例覆盖不够比如只测了正常流程没测异常参数、超长字段、非法字符二是没有关注鉴权和越权比如只测了带token的正常请求没测不带token、修改token里用户ID越权访问的情况三是没有并发场景比如同时两个请求更新同一条数据四是断言不够严格只关注状态码200和返回成功没校验逻辑正确性和数据库落库结果。然后再补一句如果再给我一次机会我会从接口文档里的每一个字段、每一个边界、每一种业务规则入手把接口测试做成数据驱动。这题答完面试官基本能确认你是一个会做质量复盘的人。4. 数据库与Linux实操题SQL怎么写、日志怎么查别在基础题上翻车4.1 一条SQL题从基础语法到索引分析数据库题在测试面试里出现频率非常高因为测试工作里查库、验库是日常。面试官出的题难度一般是递进的先出基础语法的再问优化。我举个例子题目有两张表employee员工表字段有id、name、department_iddepartment部门表字段有id、dept_name。查每个部门的员工人数按人数降序排列。参考SQLSELECT d.dept_name, COUNT(e.id) AS emp_count FROM department d LEFT JOIN employee e ON d.id e.department_id GROUP BY d.id, d.dept_name ORDER BY emp_count DESC;这里有两个关键点容易被忽略。第一为什么用LEFT JOIN而不是INNER JOIN因为要包含没有员工的空部门LEFT JOIN能查出部门人数为0的情况。第二GROUP BY后面按什么分组如果只GROUP BY d.dept_name少数数据库会因为ONLY_FULL_GROUP_BY模式报错稳妥做法是GROUP BY d.id, d.dept_name。能把这两点说出来说明你真的写过SQL不是背了模板。如果面试官接着问数据量大了怎么优化你可以答给employee.department_id建索引避免在大表上直接全表扫描然后用EXPLAIN SELECT ...看执行计划确认走的是索引。4.2 explain的结果到底怎么看面试里我经常问你平时怎么定位一条SQL慢的原因很多人只会说加索引。我追问你怎么确认加了索引有用能答上来的人就少很多了。EXPLAIN SELECT * FROM employee WHERE name 张三;执行之后重点看几列type全表扫描是ALL索引扫描常见的是ref、range、index唯一匹配是const。看到ALL就该警觉。key实际用到的索引名如果是NULL说明没走索引。rows估算扫描行数数字越大越慢。Extra如果出现Using filesort或Using temporary表示排序或分组产生了临时文件通常是大查询的性能隐患。有个容易被忽略的坑在索引列上做函数运算会导致索引失效。比如WHERE DATE(create_time) 2025-01-01看起来没什么问题但create_time的索引用不上。正确写法是WHERE create_time 2025-01-01 00:00:00 AND create_time 2025-01-02 00:00:00。这种细节面试官一问一个准你答上来了就直接拉开差距。4.3 线上日志排查三道最常见的Linux命令题测试排查线上问题时绕不开Linux。面试中常问的无非三类看日志、统计文本、定位进程。第一道实时查看应用日志并过滤出错误信息。tail -f app.log | grep ERROR如果还想在出错的同时看到前后几行上下文用grep -C 5 ERROR app.log-C表示上下文行数。我在实际排查中通常会先tail -f看实时输出再另开一个终端用grep -C 10去定位具体出错位置。第二道统计日志里某个关键词出现了多少次。grep -c NullPointerException app.log或者按天统计报错量grep 2025-06-01 app.log | grep -c ERROR第三道找出日志文件里下午两点到三点之间的所有报错。这一步考的是awk能力awk /2025-06-01 14:00:00/,/2025-06-01 15:00:00/ app.log | grep ERROR答完命令本身记得带一句经验线上看日志我一般先看时间范围和关键字再结合上下文不要一上来就cat整个文件文件大了直接把终端卡死。这句话会让面试官相信你真实处理过线上问题。5. 自动化与性能测试题从我会用工具到我懂原理的进阶答题思路5.1 元素定位不到时别把加等待挂嘴边问Selenium相关的问题时最容易被套路的问题就是脚本经常报找不到元素你怎么处理。开口就答加等待的候选人我基本会往下追问一句等待为什么是这个时长你判断依据是什么大半人就答不上来了。我建议的回答思路分三步第一步排除动态和遮挡问题。先看这个元素的id、class是不是动态生成的比如每次刷新接口会生成一串随机数那定位方式就不能写死再看页面上是不是有iframe如果元素在iframe里必须先切进去还要看是不是弹窗遮罩挡住了以及浏览器窗口大小导致元素不可见。第二步确认加载时机问题。如果元素确实存在但还没渲染完再考虑等待策略。优先使用显式等待明确等待某个条件达成这样定位到元素的时间最稳定。代码可以参考from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By element WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, submit-btn)) )第三步兜底方案。如果前面都排查完还是不稳就要反查是不是自己脚本的定位策略本身有问题比如用了过多的层级嵌套定位或者依赖了页面上经常变化的文案。碰到这种情况我会和开发沟通在关键元素上加稳定的测试专用标识这样脚本跑起来更省心。5.2 怎么回答如何设计一套自动化测试框架这题考察的重点有两个一是你有没有真正设计过框架二是你懂不懂分层思想。一个合格的回答结构是这样的我会把框架拆成几层用例层、业务操作层、数据层、公共方法层。用例层只写业务场景和断言不写元素定位业务操作层封装页面或接口的通用操作比如登录、下单数据层管理测试数据通过文件或配置读取配合数据驱动公共方法层处理浏览器驱动、请求封装、报告生成、日志记录。然后补上框架要解决的几个问题第一用例之间要独立可运行单个用例失败不能影响其他用例第二失败能自动截图、记录日志方便定位第三可以批量执行并输出HTML报告第四能集成到CI流程里提交代码之后自动跑冒烟测试。这一段话已经包含了团队合作、持续集成、可维护性三个关键词。面试官再往下问你这个框架为什么要分层你就可以顺势讲不分层的话页面上一个按钮的定位变了可能十几个用例都要跟着改分层之后只需要改业务操作层一个地方。5.3 UI、接口、单元测试的配比为什么说金字塔模型面试里聊到测试分层几乎必提测试金字塔。这个概念本身不复杂但很多人答不出来为什么这个金字塔成立。核心逻辑是单元测试靠近代码运行快、定位问题的成本低一个方法出错直接定位到那个方法接口测试靠近业务逻辑覆盖跨模块的数据交互性价比最高UI测试靠近用户操作最贴近真实使用场景但运行慢、环境依赖多、维护贵。我的观点是测试金字塔不是硬性比例而是一种成本意识的体现。UI自动化跑一次可能要二十分钟接口自动化跑一次可能只要两分钟单元测试几秒钟。同样一轮回归放在越底层跑越省钱。业务团队资源有限优先保障接口和核心流程的UI用例比较务实。如果你能补一个自己的数据会更有说服力比如我上一家项目里接口自动化一共三百多条用例跑一轮大概15分钟UI自动化只有核心链路二十条跑完要一个多小时所以我们坚持把重要断言尽量往下沉。6. 性能测试题从名词到参数再到瓶颈定位6.1 并发、响应时间和TPS的关系不是三个孤立名词性能测试的面试题最容易暴露纸上学来的破绽。很多人张口就是并发用户数、吞吐量、响应时间、错误率但问并发数和TPS之间是什么关系就卡住了。这里有个很重要的概念辨析并发用户数指的是同时在使用系统的用户数量但同一时刻真正在发请求的并发请求数通常远小于在线用户数。用户打开页面后可能要阅读几十秒才点一次按钮这几十秒里他只占着一个连接没有在发请求。衡量系统处理能力的核心指标是TPS每秒事务数。在一个理想模型下存在一个粗略关系并发请求数 ≈ TPS × 平均响应时间举例来说明如果系统平均响应时间是0.2秒那么一个用户大部分时间在等待和思考系统可以同时服务大量用户。如果TPS是500平均响应时间是0.2秒那么系统在任一时刻大约处理的请求数是500 × 0.2 100个。也就是说100个并发请求就能让这个系统打满。把在线用户数当成并发数去压测是新手最常见的错误。面试官听到你不但懂概念还能把三个参数的关系讲成公式马上就会高看一眼。6.2 压测结果怎么分析一个完整的瓶颈定位过程比起性能测试有哪些指标面试官更爱问压测结果不达标你怎么分析。这题必须答出排查链路不能只给结论。我一般这么讲自己处理过的案例曾经压测一个登录接口用JMeter开50个线程响应时间还行TPS大概200。把线程加到100响应时间涨到3秒TPS不升反降。这时候我第一反应不是调参数而是先看压测机本身的资源确认压测机CPU没跑满排除压测机先挂了的情况。然后看服务端监控发现应用服务器的CPU已经到了90%以上说明瓶颈在服务端计算能力上。继续抓线程快照和慢日志发现大量线程阻塞在数据库查询上再到数据库看慢查询日志定位到一条没有走索引的账号查询SQL。最后给这段SQL补上联合索引重新压测TPS回到了400多响应时间也降下来了。这段描述里有几个关键词先排除压测机瓶颈、再看服务端资源、最后定位到应用-数据库链路。面试官想听到的就是这种按层次排除、用数据说话的过程。6.3 性能测试问题串面试官会接着问什么答完上面那些很多面试官会追加几个小问题建议提前准备JMeter的线程组参数怎么设不要只说线程数、循环次数。要能解释Ramp-Up时间的作用让线程在指定时间内逐步启动模拟真实用户逐渐进入的场景而不是一上来1000个请求同时轰服务器。如果系统对瞬时洪峰敏感可以分梯度压测。错误率多少可以接受不能拍脑袋说5%以下。要结合业务支付类接口错误率要求趋近于0资讯类页面的错误容忍度可以适当放宽。回答时要体现先定业务目标再看数据是否达标的思路。基准测试、负载测试、压力测试、稳定性测试的区别一句话版本基准测试是拿一个参照数据摸底盘负载测试是找系统能承受的正常边界压力测试是看系统的极限和崩溃表现稳定性测试是看长时间运行有没有内存泄漏或性能衰减。能各举一个你跑过的场景就是满分。7. 现场测试用例设计电梯、登录、购物车这类题的高分回答结构7.1 面试官问设计电梯的测试用例在考察什么这题几乎是公认的送命题因为范围太大很多人一上来就从按上行按钮、按下行按钮、关门、开门开始列列到后面自己都乱了。面试官出这类题考察的目标其实很明确你在没有需求文档的情况下能否系统性地拆解一个复杂对象。电梯是一个典型的软件硬件人机交互系统它考验的是你的思维广度能从功能测试扩展到异常场景再到安全、性能、兼容、易用性。7.2 高分答案的骨架六层分析法我建议用六层分析法来回答这类开放题它会让你在几分钟里把思路完整地呈现出来。第一层基础功能。电梯在不同楼层的召唤按钮是否响应到达目标楼层是否准确停靠轿厢内楼层按钮、开关门按钮、紧急呼叫按钮、楼层显示是否正常。第二层异常场景。电梯运行中突然停电怎么办被困人员按下紧急呼叫后报警是否传到监控室超载时电梯是否停止关门并报警门夹到人时是否自动弹开电梯卡在两层之间时检修模式如何切换。第三层边界与极限。电梯最高层和最低层按键是否有效在最高层按上行按钮是否无响应在最低层按下行按钮是否无响应连续运行长时间后会不会出现响应迟钝。第四层压力与性能。上下班高峰期大量人员同时使用多部电梯并联调度是否合理满载状态下的启动和制动是否平稳连续多次开关门是否有异常。第五层安全与兼容。紧急情况下是否有备用电源消防模式是否正常触发门锁闭合不严时电梯能否运行电梯内信号是否可能对控制系统造成干扰。第六层易用性与其他。按钮高度是否符合多数人群语音播报是否清晰按键失灵时有没有盲文或替代方案长时间待机状态下的能耗表现。这样回答下来面试官一般会打断你说够了并且心里已经给你打了高分。7.3 被追问还有吗时怎么补出亮点面试官在你答完之后追问还有吗不一定是嫌你答得少很可能是想看看你还能不能更进一步。这时候你不需要再往深处堆用例而是换个角度升华一下。你可以说如果这个项目是我负责我会接着考虑可测试性设计。比如电梯的控制系统有没有留出日志接口能不能把每次开关门、运行楼层记录下来这样出问题时能回放现场。另外我会优先用等价类和边界值来收敛用例规模把最高层、最低层、超载临界值这些边界点挑出来重点测而不是把所有楼层都穷举一遍。这段话的关键是让面试官看到你有全局意识从测试执行者切换到了测试设计者甚至质量负责人的视角。同样的思路也可以套到登录功能怎么测购物车怎么测支付流程怎么测上。拿登录来练手的话核心思路就是功能、异常、安全越权、撞库、验证码、边界密码长度上限、兼容不同浏览器、易用记住账号、自动填充这六层背下来现场题基本可以通吃。8. 面试表达与收尾不会的题怎么答、哪些坑千万别踩8.1 遇到不会的题三个步骤保住印象分面试遇到不会的题太正常了真正拉开差距的是你会怎么反应。我一点都不介意候选人说这个我没排查过但我非常介意候选人不懂装懂或者当场沉默。我建议的应对步骤是第一步复述问题确认理解。您问的是不是这个意思——在一个分布式场景下支付回调重复通知怎么保证不生单这一步看起来没什么用但能帮你争取几秒钟思考时间还能避免答偏。第二步说出你确定知道的部分。哪怕只沾边也要说分布式这块我了解得不算深但我理解核心应该是幂等控制之前我做过单机版的重复提交拦截用的思路是唯一标识加状态机。这等于告诉面试官虽然我没做过这个具体场景但我的知识体系和排查方法是通的。第三步给出一个思考方向。如果让我现在去解决我会先看支付的单据表结构和状态流转确认有没有幂等字段再设计重复请求验证用例去测。面试官要的不是正确答案而是一个测试人员面对未知系统时的处置模式你的思路比答案更值钱。8.2 反问环节问什么显得专业又不冒犯面试结束前面试官一般会问你有什么想问我的。很多人直接说没有白白浪费了展示自己的机会。我每次指导朋友模拟面试都会让他们准备两三个问题但一定不是那种打探隐私或显得斤斤计较的。比较稳妥的几个方向问团队质量体系咱们团队现在的自动化测试覆盖主要在接口层还是UI层未来半年计划往哪个方向投入——这摆明了你在考虑怎么长期干活。问测试流程一个需求从评审到上线测试在哪个环节介入写不写测试计划上线有没有灰度——这体现你对流程规范的在意。问团队技术栈目前主要在用什么语言和框架做自动化和性能测试——这表示你愿意提前做技术对接。尽量避免一上来就问加班多不多几点下班这类问题不是不能问而是留到谈offer阶段再聊更合适。面试现场人的精力有限把时间用在展示专业度上更划算。8.3 我的个人体会测试和面试最后拼的都是场景感我在面试别人的时候最明显的感受是工作三年以上的人面试题本身已经没有多少区分度了真正区分人的是场景感。什么叫场景感就是你描述一个问题的时候能让面试官感觉你不是在背概念而是真的在旁边看着你排查过一遍。举个例子同样是回答怎么处理接口依赖初级候选人说可以用mock高级候选人会说我们当时被测模块依赖一个第三方订单接口测试环境经常超时。我一开始用JMeter的mock服务挡了一层发现返回数据结构跟真实环境的差异导致断言跑出假失败。后来我改成了自建的mock网关按线上真实的返回格式做了几种不同状态的模拟这才把接口用例跑稳。听这两段话谁真干过活一目了然。所以我不太建议你把上面这些题目当成标准答案去背。最好的用法是把每道题当作一个钩子钩出你自己做过的项目细节然后用这些细节去验证这题该怎么答。最后再分享一个小技巧面试前三天把你简历里写到的每一个技能点都硬写出一段我用它解决了什么问题的故事。写不出来就说明这个技能基本不熟。这时候补一下远远比面试当场编要好。面试这场游戏本质上就是把你做过的事清楚且有条理地讲给一个内行听。只要你有真东西再用对方法讲出来offer就是顺水推舟的事了。