自动化测试用例设计全流程:从筛选、断言到维护的实战指南

自动化测试用例设计全流程:从筛选、断言到维护的实战指南 前阵子帮一个团队做测试方案评审发现团队里有两个“自动化测试用例库”一个在Excel里一个在代码仓库里。Excel里的用例模板工工整整代码仓库里的test_脚本也能跑可这两份东西互相之间基本对不上——Excel里的用例没有对应脚本仓库里的脚本也没对应Excel里任何一条用例。这不是个例我翻过不少项目的自动化测试用例发现有很多人根本没有在“写用例”只是在“翻译用例”把手工测试步骤照搬成代码罢了。网上流传的各种“最全”指南也大多成为名词合集真到落地上不了手。所以这篇我不堆概念按照一条自动化测试用例从筛选、设计、编码到维护的完整生命周期讲清楚每一步到底该怎么做尤其是那些文档里查不到、只有真正做过才会知道的坑。1. 先想清楚一个问题你写的到底是“测试脚本”还是“测试用例”1.1 手工用例翻译成代码为什么会“越翻越废”我在很多项目里都见过同一个错误把手工测试用例的“测试步骤”一条一条转成自动化代码步骤走完就算用例执行通过。看完这种脚本你容易上当——步骤全对断言几乎没有。比如手工用例会写“检查页面显示正常”、“确认数据被正确保存”这里的“显示正常”和“正确保存”到底怎么判定人肉眼能看出来脚本看不出来。你说页面元素存在就算正常可很多时候元素在、内容错脚本照样执行“通过”。手工用例天然允许模糊断言因为执行者是人类。自动化测试用例不允许——机器没有“我觉得”。所以写自动化测试用例的第一步不是写代码而是把每条用例的通过标准翻译成机器可判定的逻辑表达式。这个动作做不好后面代码写得再漂亮跑出来的结果也只是一个自我安慰。脚本会认为“我走完了流程”但流程走完和业务正确之间隔着一整条断言设计这也是大多数自动化测试项目“有产出但没价值”的根源。1.2 可判定性才是一条自动化测试用例的命门一条完整的自动化测试用例由三部分组成前置条件、执行步骤、预期结果的判定。前两部分大部分人都能做到命门在第三部分——预期结果必须精确到“程序能自动判定”的程度。举个例子。登录失败的用例手工测试写“提示错误信息”就够了。自动化要拆的是登录失败后页面是否出现某个文案文案是精确等于“账号或密码错误”还是包含几个关键词就行当前是停留在登录页还是跳转到了首页如果跳转了首页是URL不对还是用户信息没显示这些都要在写用例的时候明确下来。这里分享一个我自己常用的判断技巧写完预期结果后问自己一句“如果把这句预期结果交给一个实习生他能据此判断通过还是不通过吗”如果实习生还得反问“什么算通过”那机器更不可能判断。这一步判断不解决所谓自动化测试用例就是自动化操作记录充其量叫“流程可达性脚本”跟测试用例不沾边。1.3 脚本与用例的差别差在“意图”再区分两个概念。一段只有操作步骤的脚本比如“打开页面、输入用户名、输入密码、点击登录”它是脚本不是用例。用例必须包含为什么要测这条对应什么需求、判定的标准是什么、数据怎么来的、失败之后从什么方向排查。一份合格的自动化测试用例读代码就像读需求文档——你能从用例名和断言里还原出业务规则。你闭着眼睛想一下自己的代码仓库有多少test函数是这种画风如果大多数函数你只能看到操作看不到意图那就要停下来重新审视了。自动化测试用例不是给机器准备的“动作清单”而是给团队准备的“业务规则的机器验证器”。这个定位想清楚后面所有的设计动作才有依据。2. 用例筛选不是所有用例都值得自动化2.1 自动化测试用例的“候选人画像”手工用例几百上千条不可能全部自动化也不应该全部自动化。我判断一条用例适不适合自动化只看四个维度执行频率、业务重要程度、结果可判定性、稳定性。维度适合自动化的特征不适合自动化的特征执行频率每个版本都要回归上线前手点一次就够业务重要性核心链路、出Bug代价高边缘功能、对用户无感结果可判定性有明显页面状态、数据变化依赖主观审美、模糊感知稳定性功能稳定、需求变动少还在频繁迭代、界面天天改你可以把已有的手工用例按这个表过一遍筛出来的就是自动化用例的候选集。我见过一些团队一上来就追求“自动化覆盖率80%”结果80%的精力都花在应对界面改版和维护上核心链路反而没人保护。覆盖率是结果不是目标。先保证把最重要的20%用例做扎实让自动化先成为可信赖的回归工具再考虑扩大范围这才是一条稳的路。2.2 千万别碰这几类“自动化毒药”有几类用例看着能写写了必后悔。第一类是依赖大量手工准备数据的比如要真实微信支付、要短信验证码的要么找开发开后门、要么等超时跑一次各种奇怪失败最后你分不清是产品有Bug还是环境没配合。第二类是一次性的探索性测试本来就没有既定路径自动化脚本反而限制了探索价值为零还浪费时间。第三类是强主观的视觉类检查图片是否美观、配色是否有质感、交互是否顺畅这类用例让自动化去判结果通常是“执行通过”你还要人肉复核等于多写了一段没意义的代码。第四类是需求还在频繁变动的功能今天这个按钮叫A明天改叫B用例代码跟着改来改去写代码的时间比手工测试还长团队信心也容易崩。写自动化测试用例之前先用这条原则过滤一遍这条用例自动化之后是让我更省心还是更操心更操心的用例别写。2.3 算一笔账自动化用例不是免费的一条自动化用例的成本远比大多数人想得贵。编写成本、调试成本、运行成本、维护成本全部加起来才算数。我做项目时习惯用一个粗略公式自动化收益 执行次数 ×手工单次执行时间 - 自动化单次执行时间- 编写调试成本 - 维护成本举个例子手工跑一条回归用例需要10分钟自动化跑是1分钟。如果这条用例每周回归跑5次一年约250次省下2250分钟。而编写调试这条用例大概要4小时按每月微调一次、每次半小时算年维护6小时。收益2250分钟成本约600分钟这买卖划算。但如果这条用例一个月才跑一次手工3分钟自动化30秒那收益只有12次×2.5分钟30分钟成本却差不多纯亏。所以在动手写用例之前先用这笔账估算一下。这个思考过程不仅帮你做筛选面试的时候也非常加分——能主动谈成本收益的测试工程师通常都是真在项目里做过权衡的不是单纯堆执行。3. 设计基本功等价类、边界值、场景法在自动化里的正确落地3.1 等价类划分先做减法再做断言设计等价类划分法是黑盒用例设计最基础的方法分有效等价类和无效等价类。在自动化测试用例设计阶段它最大的价值不是选几个代表值而是帮你规划“一条用例验证一个断言点”。举个例子测试注册功能的手机号字段按页面规则可能有合法手机号、非法手机号位数不对、非法手机号含特殊字符、空值。手工测试可以一条用例连续输入几次验证多种情况中途失败也无所谓体验一下接着来。自动化用例如果也这么干一遇到中间某步失败后面的校验全部跳过连“哪些等价类失败”都说不清楚。所以自动化设计里我习惯把等价类拆开一条用例测一个输入、一个校验点等价类用例输入预期结果断言点有效等价类13800138000校验通过进入下一步表单状态/跳转无效-格式错误12345提示“请输入正确的手机号”文案精确定位无效-特殊字符abcdefg提示“请输入正确的手机号”文案精确匹配无效-空值空提示“手机号不能为空”文案精确匹配这样每条自动化用例失败的时候你不需要去查日志光看用例名就知道哪个输入、哪个校验点挂了。等价类的核心价值不在分类本身而在分类之后每个类都有独立、可判定的断言。自动化用例设计的所有经典方法最终都要落到一个字上准。3.2 边界值分析自动化最容易出价值的区域边界值分析和等价类通常一起用。页面一涉及输入长度1、最大值、最大值1、空值这些边界就是Bug密度最高的区域。手工测试时边界值耗时还容易被遗漏自动化反而擅长这个——把边界值做成测试数据参数化跑一轮一分钟全覆盖。设计边界值用例有一个我踩过多次的坑边界值要和业务含义挂钩不要只卡在技术边界上。比如密码字段要求“6-20位”技术边界是6和20但业务边界可能还包括“全是数字”、“全是字母”、“包含特殊字符”这些组合。如果只测6/20/21最容易漏掉的是“6位全是数字被判定为弱密码”这种业务规则的边界。真正有价值的边界值往往是技术边界和业务规则交汇的地方。拿到需求先想清楚这个输入在业务上还有哪些“隐藏边界”再写数据远比套公式管用。3.3 场景法与状态迁移用例要有“链路感”除了单字段的等价类、边界值自动化测试用例里最缺的是场景法。很多测试同学用例设计得很“碎”每个功能点独立一条但用户根本不是这样用产品的。用户的行为是链路登录→搜索→加购→下单→支付→查订单。链路中一个环节出问题单独测每个功能都发现不了只有把它们串成一条用例才能暴露。场景法要求你在写自动化测试用例之前先把用户最核心的几条业务路径梳理出来然后让用例去覆盖这些路径。这里的“路径”不是随便点的要按用户使用频率和业务损失程度排序。状态迁移法则适合有明确状态流转的功能比如订单状态待支付→已支付→已发货→已完成→已取消。自动化用例要验证状态流转的每个箭头是否符合规则尤其是不合法的迁移——比如“已取消”的订单是否还能被改成“已支付”。这种非法迁移的用例是最容易暴露真实Bug的也最值得写进自动化回归集里长期跑。3.4 设计阶段就要为数据驱动铺路用例设计阶段顺手做的一件事是把数据与代码分离。输入数据、预期结果从一开始就不要写死在代码里放在表、JSON或者pytest的参数化里。好处有两个一是后续新增数据不需要改代码测试人员也能独立扩充用例二是不同环境的数据差异可以通过配置文件切换。比如上面手机号校验的4条用例用pytest参数化之后就是同一段测试逻辑跑4组数据每条用例独立命名、独立断言、独立报告。这个习惯看起来不起眼但对维护的影响很大。数据驱动做得好产品更新迭代时你改的是数据不是逻辑做得不好一个字段校验变化你要在十几个test函数里找魔法值。数据驱动不是框架特性而是用例设计的基本功从第一条用例开始就得有这种意识。4. 标准自动化用例的代码解剖骨架、命名、断言与独立性4.1 用例骨架准备、执行、断言、清理一段合格的自动化测试用例无论UI自动化还是接口自动化骨架都一样准备数据、执行操作、校验结果、清理环境。用登录接口的用例来示意def test_login_with_invalid_password_shows_error_message(): # 准备创建一个独立的测试账号先清理历史痕迹 user create_test_account(test_user_001) # 执行用错误密码发起登录 response api_client.login(user.username, wrong_password) # 断言校验返回结果是否符合预期 assert response.status_code 200 assert response.json()[code] 10001 assert response.json()[message] 账号或密码错误 # 清理删除测试账号避免污染后续用例 user.delete()注释按行为来组织而不是“步骤一、步骤二”。这样用例读起来像一段业务描述而不是流水账。骨架的意义在于强制你思考数据从哪来、操作是什么、结果怎么看、垃圾怎么收。任何一环缺失用例都不完整。4.2 用例命名让用例名帮你说话测试用例的命名直接决定自动化用例的可读性。我最常看到的反例是test_login_01、test_case_001这种名字。用例跑挂了你得点进代码才知道在测什么。稍微好一点的是test_login_success但也不够明确。比较理想的命名方式是test_功能模块_场景_预期结果。比如test_login_with_empty_password_displays_required_errortest_order_cancel_after_payment_returns_refund这样的命名有几个好处失败报告出来团队扫一眼就知道哪个业务挂掉了用例评审时不点开代码就能判断用例是否重复、是否有缺失后续维护时找用例也是秒定位。命名是成本最低、收益最高的测试用例优化手段。不要觉得长测试用例名不是变量名不需要省字符它本质是给人看的。4.3 断言设计程序没报错不等于用例通过断言是自动化测试用例的灵魂但也是重灾区。我见过太多脚本整个用例执行完没有一个assert全靠“这行代码没抛异常”来判定通过。这种用例只能叫“流程可达性检查”基本发现不了业务逻辑错误。断言有几个层次从弱到强页面/接口是否正常响应最弱页面关键元素或接口关键字段是否符合预期跳转URL、返回体中的业务字段是否准确数据库中的持久化数据是否被正确修改最强实际项目的经验是断言尽量向下沉。UI自动化里断言到页面文案还不够最好再断言一次接口返回如果场景涉及数据更新数据库状态值得一查。接口自动化同理不能只看返回的code字段还要断言返回体里的业务字段和持久化数据。断言越贴近数据用例发现Bug的能力越强。但注意这个度要根据业务价值权衡——有些低价值场景断言到页面层就够别把所有用例都做成数据库级校验否则成本会失控。4.4 用例独立性切断用例之间的隐形依赖自动化测试用例最忌讳的就是用例之间有依赖用例B依赖用例A执行成功后的状态一旦A挂了B跟着挂还会连锁挂掉C、D。排查结果的时候你根本不知道是A的问题还是B、C、D的问题只能全部重跑一遍。处理依赖的正确思路是每条用例自己准备自己的数据跑完自己清理自己的数据。比如创建订单的用例不要依赖“之前用例创建的订单”而是自己调接口创建一条新的清理时把这条数据删掉不留历史残留。这看似多写了几行准备和清理代码但换来的是用例的独立性和稳定性——你可以单独跑任何一条也可以乱序跑结果都不受影响。用例之间没有牵连才是自动化测试能并行、能分片的底气。4.5 UI自动化的稳定性等元素不要等时间UI自动化里稳定性最大的敌人是元素还没加载出来就去点。正确做法是显式等待明确等待某个元素出现、可点、文本变化而不是一上来就time.sleep(3)。强制等待的问题在于等长了浪费执行时间等短了依然不稳定时间一改就要改代码。显式等待是把判定条件交给测试框架框架轮询元素状态既稳又高效。接口自动化里“避”更重要避开动态数据对断言的干扰。比如接口返回里有一个order_time字段你要是断言它等于固定值100%会挂正确做法是断言它符合某种格式或者断言它的范围比如在用例开始时间之后。这些都是刚入行的同学最容易踩的坑写用例的时候多留个心眼稳定性会好很多。自动化测试跑100次稳定通过99次比跑50次全过更有价值稳定性是自动化测试的生命线。5. 完整案例一个登录手工用例如何演进成自动化用例5.1 原始手工用例只有步骤没有判定我用最常见的登录功能来演示。假设需求文档里有一条手工用例用例编号TC-LOGIN-001 用例标题使用已注册账号和正确密码登录 前置条件账号test001已注册 测试步骤打开登录页面输入正确账号test001输入正确密码123456点击登录按钮检查登录成功手工场景下这条用例没问题。但直接翻译成自动化代码就会变成“打开页面→输入账号→输入密码→点击→没报错→通过”。登录成功到底体现在哪页面上出现了哪个标志URL变成了什么接口返回了什么数据库登录取了吗这些不写清楚用例就是废的。5.2 把模糊预期拆成可判定断言落地之前我先把预期结果精化登录成功后URL应该跳转到/home。页面右上角出现用户头像和用户名用户名等于test001。接口返回字段userInfo.name等于test001。用户的last_login_time字段被更新。再考虑测试数据新增一条独立的测试账号执行前清理、执行后清理密码采用符合需求方要求的合法密码。这样一来这条“登录成功”用例就可以拆成两层接口层做协议和字段校验UI层做用户视角的关键路径验证。实际项目里如果接口层已经覆盖了登录协议校验UI层就不必重复太多跑一条主链路即可。这也是自动化测试分层思想的具体落地接口层追求覆盖面UI层追求真实用户视角两边各司其职。5.3 接口层自动化用例代码实战用pytest requests实现登录接口的测试用例核心是参数化import pytest import requests BASE_URL https://api.example.com pytest.mark.parametrize(username,password,expected_code,expected_message, [ (test001, 123456, 0, 登录成功), (test001, wrong_password, 10001, 账号或密码错误), (test001, , 10002, 密码不能为空), ]) def test_login_api(username, password, expected_code, expected_message): resp requests.post(f{BASE_URL}/login, json{ username: username, password: password, }) body resp.json() assert resp.status_code 200 assert body[code] expected_code assert body[message] expected_message这里有几个设计点值得说。第一用参数化把三条用例合并成一段逻辑失败报告会自动拆分每一条数据都独立显示结果第二预期结果直接写在参数里后续测试人员要扩充用例只需要在参数列表里加一行不需要改动代码逻辑第三纯接口请求不依赖浏览器环境执行速度按毫秒算适合进CI流程做高频回归。接口层用例的价值在于快、准、稳是自动化回归的真正主力。5.4 UI层自动化的补充价值接口层验证不等于用户能正常使用所以核心链路还是需要UI层兜底。UI层的登录用例重点是验证真实页面的跳转和关键元素展示from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_login_success_redirects_to_home(driver, test_account): driver.get(https://app.example.com/login) wait WebDriverWait(driver, 10) driver.find_element(By.NAME, username).send_keys(test_account.username) driver.find_element(By.NAME, password).send_keys(test_account.password) driver.find_element(By.CSS_SELECTOR, button[typesubmit]).click() wait.until(EC.url_contains(/home)) assert driver.current_url.endswith(/home) assert driver.find_element(By.CSS_SELECTOR, .user-name).text test_account.username注意我用了显式等待等待URL变成/home再断言。脚本先把“点击登录”后的页面状态变化作为等待条件然后才做断言。这样处理比点击后立刻断言要稳得多因为页面跳转和元素渲染都需要时间。UI自动化里大部分不稳定都源于“没等就断言”显式等待是成本最低的解决方案。5.5 真实环境的三次翻车与解决方案这个案例在真实环境落地基本会踩这三个坑。第一验证码。真实登录环境一般挂了验证码自动化用例跑不通。常规解法是测试环境关闭验证码开关或者预留一个万能验证码这个要和开发提前约定好属于测试环境基础设施不属于用例本身的问题。第二测试账号被锁定。密码试错次数多了账号被锁直接导致后续一轮用例全部失败。解决办法是每条用例跑之前先调一个解锁接口或者准备多个账号轮换。我在项目里习惯把账号的解锁逻辑放在用例的fixture里跑每条用例前自动执行从根上解决连锁失败。第三数据污染。如果test001每次跑完不清数据多次执行后可能出现“账号已注册”之类的错误。我的习惯是用例前置阶段先删除干净再创建后置阶段再删一次。宁可多做一次清理动作也不要让一条用例的残留数据拖垮下一轮。这三个坑文档里永远查不到全是执行过程中长出来的教训。6. 让用例池越跑越值钱入库评审、失败分析与分层运行6.1 用例入库前先过四道关AI生成的也一样自动化用例一旦入了库就没人管慢慢变成“技术债”。我的经验是新增一条自动化用例要从四个角度评审是否重复——已经覆盖同样断言点的用例不应该再进池子是否依赖顺序——这条用例单独跑能不能通过不能就整改断言是否明确——每条预期结果是否都转成了机器可判定的断言成本是否合理——运行和维护成本和它带来的回归价值是否匹配。四道关过后用例才能进仓库。最近也有很多团队开始用AI生成测试用例工具确实能帮你快速铺数据、覆盖场景但AI生成的用例同样要过这四道关。而且AI生成的用例更容易出现“看起来很完整、实际上断言泛泛”的问题评审的时候要特别盯断言质量。这个评审动作看起来繁琐但能挡住超过一半的“脚本凑数”保住用例池的整体质量。6.2 失败用例的“三分法”先分类再动手自动化用例跑挂了很多人第一反应是找开发第二反应是重跑一遍看是不是环境问题。正确的处理顺序是先分类。失败原因无外乎三类失败类型常见原因处理方式用例本身的问题断言太严格、等待时间不够、数据冲突改用例不是改产品脚本和环境问题测试环境挂了、网络超时、元素定位失效修复环境或定位器产品Bug业务行为不符合预期提Bug给开发排查顺序是先看是不是产品Bug再看是不是环境问题最后才考虑用例本身。一个简单的判断方法同一条用例连续跑三次结果一致且和预期不符那就拿手工去操作一次。手工正常说明是用例或环境的问题手工也不正常那就是产品Bug。这个举证思路在团队里最有说服力不会出现扯皮。我见过太多团队一看到自动化失败就重跑重跑过了就当没发生过结果把真实Bug也一起“重跑”没了。失败分析做扎实自动化测试的质量报告才有说服力。6.3 分层执行冒烟、回归、全量各自的分工用例一多不能每次全量跑。我习惯按测试金字塔的思路把自动化用例分三层冒烟用例集核心链路、耗时最短每次构建后跑几分钟出结果适合放在CI流程里随时触发。回归用例集覆盖主流程和关键功能版本提测时跑一遍发现问题的主要来源。全量用例集包含所有自动化用例上线前或周期性跑做完整回归兜底。分层之后用例池从“一堆代码”变成“不同精度的检查网”。冒烟用例快进快出坏了立即报警回归用例发现主链路问题全量用例保证没有漏网之鱼。每一层的用例数量和维护策略不同越往上越追求速度越往下越追求覆盖率。不用追求每一层都大而全重点是让每一层各司其职形成完整的质量防护网。6.4 测试数据的生命周期决定了用例池的长期健康刚才提到数据清理在长期维护里更要坚持。很多用例池越跑越慢、越跑越不稳定根因往往是测试数据堆积。每轮执行的用例都在数据库里留下账号、订单、日志下一轮运行时就撞上上一次的残留测试数据互相污染用例一个接一个地挂维护的人改东墙补西墙越改越乱。我的建议是把数据生命周期当成用例设计的一部分。每条用例都要回答我的数据是谁创建的用完由谁在什么时候清理没有明确答案的用例不算完整。项目里可以在fixture的teardown阶段统一回收也可以在测试任务结束后统一清理。清理原则没有唯一答案但一定要有人负责以及有机制兜底。好的数据策略能直接决定自动化测试是越跑越顺还是越跑越累。7. 面试官问“测试用例怎么设计”到底想听到什么7.1 杀分答案长什么样面试自动化测试岗位时基本必问“测试用例怎么设计”或者“自动化测试用例怎么编写”。很多人张口就是用等价类、边界值、因果图、判定表、场景法……背完一堆名词面试官再问一句“那你现在要为登录功能设计自动化用例怎么处理”就卡壳了。问题在哪里面试官不想听你背课本定义他想确认的是你有没有真正设计过、执行过、维护过一套自动化测试用例。另一个减分答案是把手工用例翻译成自动化步骤一口气念完“打开页面、输入用户名、输入密码、点击登录、断言成功”。没有断言设计、没有测试数据策略、没有异常场景覆盖这套思维放到项目里就是纯脚本。面试官表面点头内心已经在打分了。7.2 一个可持续复用的回答框架我自己面试别人时最喜欢的回答结构是这样第一先说筛选。先讲清楚需求想覆盖的核心业务是什么自动化的重点是稳定、频繁、核心的功能不是所有功能都自动化这个观点一出来就有区分度。第二按业务梳理场景。先列用户的核心路径再补边界场景和异常场景对应到等价类、边界值、场景法这些方法上。重点是说出“为什么用这个方法”而不是罗列方法名。第三落到用例设计细节。明确前置条件、测试数据、执行步骤、预期结果和断言点强调每条用例独立、数据可控、断言可判定。这一层能证明你真的落地过。第四说维护机制。用例评审、失败三分法、数据清理、分层执行。这部分最加分因为它证明你经历过长期维护而不是只写过几个Demo就跑。7.3 可以直接背下来的演示回答现场演示一条登录用例从需求到断言的完整设计过程基本就能稳住。你可以这么说“登录功能是高频、核心、回归必备的模块适合自动化。拿到需求后我先列出场景正确账号密码登录成功常见异常——密码错误、账号不存在、密码为空、账号为空边界——密码刚好6位、20位、21位、密码前后带空格状态场景——连续多次密码错误触发锁定锁定后重试。以‘密码错误’这条为例前置条件是准备一个已注册的测试账号test001执行步骤是打开登录页、输入test001、输入错误密码、点击登录预期结果是登录页面提示‘账号或密码错误’并且URL未跳转、未生成登录态。断言点就是这三个。测试数据独立准备、独立清理。这样一条用例就完成了一次从需求到断言的落地。然后我会补充这条用例我用接口测试和UI测试各写一遍接口层覆盖参数和返回协议UI层跑用户视角的主链路整体用参数化把异常场景铺开一条逻辑代码覆盖多条输入数据。”这个回答既展示了设计方法又展示了自动化落地意识还带出了分层和数据驱动经验面试官没有理由不满意。最后补一句实在话我见过太多团队买工具、搭框架、学技术最后死在用例质量上。自动化测试用例不是越多越好是越准越好、越稳越好、越容易修越好。写用例的时候多问自己几个为什么——这条用例对应什么需求断言能不能再下沉一层数据会不会污染下一轮你的用例池就能从装饰品变成团队真正的安全网。这套思维也是从初级测试往资深测试走的必经之路。