ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从Hello World到完整测试用例:零基础测试用例设计全解析

从Hello World到完整测试用例:零基础测试用例设计全解析 每次接手新一批转行测试的小伙伴我第一节课都喜欢让他们干一件听起来特别简单的事给一个只会输出 Hello World 的程序写一份从零到一完整的测试用例。这事儿乍一看像是开玩笑——程序一共就一行输出有什么好测的但真动手写起来十个人里有九个会写出一堆没法执行的废话用例还有一个能把简单需求分析出花来。这堂课之后大家才明白一个道理测试用例写的不是代码是思维。这篇就把这个过程完整拆给你看——零基础怎么做需求分析、怎么设计测试点、怎么写字段、怎么执行评审、怎么把用例变成自动化脚本一条龙讲透。1. 先说清楚什么叫Hello World 级别的测试用例1.1 被测对象简单不代表用例可以粗糙很多新人听到写 Hello World 测试用例的第一个反应是这有什么可写的打开程序看到输出结束。但我要强调一个概念Hello World 级别指的是被测对象足够简单简单到任何零基础的人都能理解业务逻辑但测试用例本身必须是完整、规范、可执行的成品。恰恰因为被测对象简单你才有精力把注意力放在用例本身的字段、流程、表达方式上而不是被复杂的业务逻辑带跑。就好比学炒菜第一道菜一定是番茄炒蛋。菜是简单但洗菜、切菜、热锅、放油、下料、调味、出锅、装盘这一整套工序一样都不能少。Hello World 测试用例就是测试领域的番茄炒蛋——用来练手、练流程、练思维不是用来糊弄的。1.2 零基础学测试第一个要补的不是工具而是思维我见过太多新人一上来就学 Selenium、学 Playwright、学各种测试平台结果写出来的用例千篇一律打开页面输入数据点击按钮断言成功。这种用例看似没毛病但一旦需求变了一点、环境出了一点问题就完全不知道怎么排查。问题出在哪工具是术思维是道。测试用例的底层思维跟开发思维有本质区别开发思维是怎么把它做出来关心的是功能能不能跑通。测试思维是怎么把它弄坏关心的是它在什么情况下会出错、出错时表现是否可接受、错误信息是否清晰。一个只会写正路径用例的人那不叫测试叫功能演示员。真正的测试用例必须包含正路径、反路径、异常路径、边界条件甚至要主动去想用户会不会这么干系统在这个环境下会不会挂。就拿 Hello World 这个需求来说开发想的是print(Hello World)测试想的是输出一次还是多次换行了吗退出码对吗没装 Python 环境怎么办重复运行十次还稳定吗输出被重定向到文件里还能不能正常写这些念头就是测试用例的种子。1.3 谁能从这篇里拿到什么这篇内容适合三类人刚入行的测试新人需要一份完整的、可照着做的用例编写方法论。转岗的开发和运维想搞明白测试用例和代码调试到底有什么不同。带新人的测试 Lead 或培训讲师可以直接把这里面的案例拿去做培训素材或者当作业布置下去。不管你是哪一类看完之后都应该能回答三个问题一条测试用例到底该包含哪些字段每个字段写到什么程度才算合格从需求到用例中间到底经历了哪些思考过程2. 开写之前把输出 Hello World拆成你能测的东西2.1 从一句话需求里拆出显性测试点先给一个具体需求原文。假设被测对象是一个命令行程序hello.py需求只有一句话运行python hello.py后程序在终端输出一行Hello World并退出。这句话看着简单但显性测试点至少包含以下这些维度测试点说明输出内容输出的字符串必须是Hello World大小写、空格、引号都不能错输出位置输出到标准输出stdout而不是输出到错误流 stderr输出次数只输出一次不能输出两遍、三遍输出格式每次输出占一行输出结束后要有换行不能和命令提示符粘在一起运行结果程序正常退出退出码为 0而不是报错退出这五条就是显性需求直接翻译出来的。注意这里还没用到任何测试工具纯粹靠读需求→列可以验证的点就能做出来。实操心得新手最容易犯的错是只写一条用例验证程序能输出 Hello World。这句话没法执行因为能输出不是一个可判定的验收标准。正确的做法是把输出 Hello World拆成你可以去核对的具体行为——输出的内容是什么、输出的位置在哪、输出的次数和格式如何、程序最终的状态是什么。2.2 比显性需求更值钱的是隐性需求很多人写用例的第二个误区是需求没写的东西就不测。这是大错特错。需求没写不代表用户可以接受。我们继续拿hello.py举例下面这些隐性需求如果不测上线之后一定会被用户或运维骂隐性场景为什么值得测预期结果重复运行 10 次程序不能有累积性副作用每次都输出一行 Hello World表现一致在非项目目录下运行用户可能从任意路径执行只要正常安装就应该能运行而不是依赖相对路径断网环境下运行程序不能偷偷联网程序应正常输出不需要任何网络系统没有配置 Python 环境小白用户常见情况错误提示要友好不能直接崩溃或抛乱码输出重定向到文件用户可能把结果存日志python hello.py out.txt后out.txt 里应恰好有Hello World\n与命令行其他工具组合使用比如用管道接到greppython hello.py这些测试点需求文档里一个字都没提但哪个漏了都会出事故。我见过一个真实案例某内部工具程序开发自测一直是能出结果结果运维部署时发现程序依赖当前目录下的一个配置文件换目录跑就报错。就是因为用例里没有覆盖从任意目录运行这个隐性需求。方法论提炼拆隐性需求有三条思路可以套在任何简单需求上。环境变化法换机器、换目录、换用户、换系统、断网、没装依赖各跑一遍。重复操作法同一个操作连续做 N 次看结果是否每次都正确且一致。组合使用法把被测程序和其他常规指令配合使用看是否能正常协作。2.3 换一个角度程序、网页、接口三种形态的 Hello World 差在哪这里想强调一个特别重要的观念同样叫Hello World被测对象形态不同测试用例的重点完全不同。零基础的人最容易忽略的就是这一点以为能输出就行了。被测形态例子核心测试关注点命令行程序python hello.py标准输出、退出码、参数解析、环境依赖、管道与重定向网页应用页面上有个按钮点击后显示 Hello World页面加载、按钮可点击、文本出现的位置、不同浏览器表现后端接口GET /hello返回字符串状态码、响应体格式、Content-Type、请求方法限制、鉴权要求同一个需求描述输出 Hello World在网页形态下你要关心的是按钮在不在、能不能点、文字有没有被遮挡、浏览器兼容性在接口形态下你要关心的是 200 状态码、application/json还是纯文本、是否只允许 GET、请求参数多余会怎样。这就是为什么我一直说不要背测试用例模板要理解被测对象。模板能告诉你字段怎么填但只有理解形态差异你才知道该填什么内容。3. 核心字段逐个拆一份标准测试用例的八要素3.1 前置条件和测试数据最容易写废的两个字段一份能被正确执行的测试用例必须包含完整字段。不同公司模板略有差异但核心八要素是通用的用例编号、用例名称、前置条件、测试数据、测试步骤、预期结果、优先级、备注。下面逐个讲容易写废的地方。前置条件写的是执行这条用例之前环境必须处于什么状态。典型错误是写环境正常系统可用这种废话。正确示范是已安装 Python 3.8 及以上版本且python命令已加入系统 PATH当前目录下存在hello.py文件。前置条件的核心要求是可复现。任何人拿到这条用例按前置条件准备环境应该能做到和你完全一致。否则执行结果就没法比较。测试数据很多人觉得 Hello World 程序没有数据。其实有——命令行参数、环境变量、输入文件都属于测试数据。比如无参数运行正常情况。传入多余参数如python hello.py extra_arg异常输入。传入--help如果程序不支持预期结果应该是什么数据写不写得清楚直接决定用例能否被执行。宁可写无也不要空着不填。3.2 测试步骤粒度控制在两步之间不超过 5 秒测试步骤的粒度是个经典难题。写太粗没法复现写太细像操作手册没人愿意读。我常用的判断标准是每一步都应该是一个独立动作执行完这一步你能明确说出我做了什么。拿上面的用例举例打开终端进入hello.py所在目录。输入命令python hello.py并回车。观察终端输出内容及命令行提示符位置。执行命令echo $?记录输出值Linux/macOS。每步之间间隔不超过 5 秒这样执行者不容易迷失。如果你写的是验证程序运行情况这种步骤就没法执行因为验证是个思考过程不是操作动作。另外步骤里每一步都要对应一个可观察的结果。第 3 步观察输出第 4 步检查退出码这些观察结果最终会在预期结果里逐条映射。3.3 预期结果唯一能验证用例是否通过的标准预期结果是一条用例的灵魂。写得不具体执行者只能靠猜。我说几个常见反面教材程序运行正常 → 什么叫正常谁也说不清。页面显示正确内容 → 正确内容具体是什么系统无异常 → 无异常怎么观察正确的预期结果写法应该是一组可判定、可观察、可核对的描述。比如终端输出一行文本内容为Hello World不含引号、不含额外空格。输出结束后自动换行命令行提示符出现在下一行行首。echo $?命令返回0。注意这里每一项都能通过肉眼或命令直接验证不依赖任何主观判断。这也是为什么很多测试团队强调预期结果必须能被断言assert——你如果用自动化脚本跑这条用例assert 的就是这些内容。3.4 优先级、编号与关联性优先级的作用是告诉执行者用例挂了后果有多严重。我建议零基础先用三级划分别整太复杂优先级含义出现频率挂了的影响P0核心功能必须通过每次发布必跑功能不可用直接阻断发布P1重要功能尽量通过每次迭代回归部分用户受影响可延后修复P2边界、异常、体验类版本里程碑回归一般用户感知不明显可长期跟踪在 Hello World 例子里正常输出 Hello World 且退出码为 0是 P0重复运行 10 次结果一致是 P1断网环境下运行正常可以算 P1 或 P2看产品定位。编号规则也要提前定不然用例一多就乱套。推荐格式项目缩写-模块-级别-序号例如HW-CMD-P0-001。这种规则在测试管理平台里搜索、过滤、排序都很方便。优先级和编号看似是格式问题实则是管理问题等项目用例超过一千条的时候你会感谢当初定的这套规则。4. 实操演示从零写出第一份完整用例集4.1 搭建最小环境本地命令行加文本编辑器就够接下来我们完整跑一遍流程。先说环境零基础不需要装什么重型工具本地只需要三样东西一个终端Windows 用 CMD 或 PowerShellmacOS/Linux 用自带的 Terminal。一个文本编辑器记事本都行推荐 VS Code。Python 运行环境如果没有装个最新稳定版即可。建一个目录hello_world_demo在里面放一个文件hello.py内容就是经典的print(Hello World)这就是被测对象。注意被测对象越简单你反而越容易看清楚测试用例本身的质量。如果被测程序有一堆逻辑用例写不好你分不清是程序 bug 还是用例 bug。4.2 从需求到用例集一次完整的逐步生成过程现在我按第二节课讲的方法现场生成一组用例。过程分三步先列所有测试点再给每个测试点定优先级最后写成完整字段。第一步列出测试点。把第二节拆出来的所有显性、隐性测试点汇总大概有这些正常执行输出 Hello World。输出内容大小写精确。输出只出现一次。输出结束后有换行。程序退出码为 0。重复运行 10 次结果一致。在非当前目录下运行绝对路径方式结果正确。断网情况下运行结果正确。输出重定向到文件文件内容正确。传入多余参数程序仍然输出正确内容或给出友好提示。命令不存在如把文件名写错系统报错提示清晰。在未安装 Python 的机器上运行错误提示友好。这 12 个点就已经是 12 条用例的雏形了。第二步定优先级。1、2、3、4、5 是 P06、7、8、9 是 P110、11、12 是 P2。为什么把未安装 Python放 P2因为那是环境问题不是程序问题如果你希望程序有更友好的引导体验可以提为 P1看产品预期。第三步写成标准字段。我拿编号HW-CMD-P0-001这条用例做示范完整内容如下字段内容用例编号HW-CMD-P0-001用例名称正常执行程序应输出 Hello World 且退出码为 0前置条件Python 3.8 已安装python命令可用当前目录存在hello.py测试数据无测试步骤1. 打开终端进入hello.py所在目录。2. 执行命令python hello.py。3. 观察终端输出。4. 执行命令echo $?检查退出码预期结果1. 终端输出一行Hello World无引号、无多余空格。2. 输出结束后光标移到下一行行首。3.echo $?输出0优先级P0备注这是本模块最核心的冒烟用例任何改动后必须执行其他 11 条按同样的字段格式填充。注意第 10 条传入多余参数预期结果需要先确认产品预期如果程序设计为忽略多余参数预期就是仍然输出 Hello World如果设计为报错提示预期就是输出参数错误提示。这块没法自己拍脑袋要看需求文档或者和开发确认。这也引出一个重要的测试素养用例不是一个人闭门造车而是需要跟开发、产品对齐预期。4.3 用例的执行与第一次回归用例写完之后你自己就是第一个执行者。现在拿第 4.2 节生成的用例集一条一条在终端里跑。执行过程中要做两件事第一在每条用例后面如实记录实际结果。注意实际结果和预期结果不符时先别急着改预期结果先确认是程序 bug 还是用例写得不对。比如第 7 条非当前目录运行你发现在别的目录用绝对路径执行python /path/to/hello.py没问题但用相对路径python ../hello_world_demo/hello.py也能运行这就说明预期结果不够精确需要补充。第二执行完一轮之后做一次回归演练。改一下hello.py比如故意把print(Hello World)改成print(Hello World!)然后重新跑 P0 用例集看哪几条会挂。这一步非常关键它能让你直观理解用例的敏感性直接决定它能不能在代码改动后第一时间发现问题。如果改了代码你的用例集一条都没挂那不是程序没问题是你的用例写得太弱。5. 把手工用例变成自动化脚本一个 Playwright 的快速入门实例5.1 为什么建议从自动化脚本反推用例质量聊完手工用例必须聊自动化。现在测试行业里Playwright 是前端自动化绕不开的工具热搜词里也反复出现playwright测试用例。但我要先纠正一个误区自动化脚本不是用例用例是设计脚本是实现。很多新人一上来就写脚本页面点击一顿操作断言一个成功结果页面样式变了、文案调整了脚本挂了但用例本身想验证的业务逻辑到底是什么没人说得清。正确的姿势是先有完整的手工用例再把它翻译成脚本。翻译的过程中你会发现手工用例里那些模糊的表述根本没法断言于是不得不再回去把用例写精确。所以我说写自动化脚本是对用例质量的一次反向检验。5.2 一条 Hello World 用例到 Playwright 脚本的映射全过程我们把被测对象换成一个简单网页页面上有一个按钮点击后下方显示 Hello World。手工用例可以先写一条 P0前置条件本地已启动 Web 服务访问http://localhost:8080可打开页面。 步骤1. 打开页面。2. 点击页面上的显示按钮。3. 观察按钮下方文本。 预期按钮下方出现一行文本Hello World。接下来用 Playwright 实现这个用例。先安装pip install playwright playwright install chromium然后写脚本from playwright.sync_api import sync_playwright def test_click_button_shows_hello_world(): with sync_playwright() as p: browser p.chromium.launch() page browser.new_page() page.goto(http://localhost:8080) page.click(button#show-btn) text page.locator(#output).inner_text() assert text Hello World browser.close()这个脚本和手工用例的五步操作一一对应goto对应打开页面click对应点击按钮inner_text对应观察文本assert对应预期结果校验。关键细节有三个一是page.click之前一定要确保元素可见可点如果页面加载慢需要加page.wait_for_selector(button#show-btn)。二是inner_text拿到的是纯文本不含隐藏元素的干扰用它做断言比用text_content更干净。三是assert text Hello World是精确匹配如果页面上输出的是Hello World!这里立刻就会挂好的断言就该这么敏感。5.3 自动化脚本不是用例的替代我见过最头疼的团队就是测试人员拿着脚本当用例文档脚本里写了什么测试范围就是什么。这完全搞反了。手工用例是测试设计资产它记录了为什么测这些点的思考过程自动化脚本只是把其中一部分用例执行自动化了。维护自动化脚本的成本很高所以自动化通常会挑 P0、P1 用例来做P2 的探索性测试、体验类测试反而适合手工执行。那么什么样的用例适合自动化三个条件稳定不会被频繁改动、可重复每次执行结果一致、可断言预期能用代码表达。Hello World 级别的用例完全满足所以拿它练手自动化再好不过。6. 常见问题与排查技巧实录6.1 新手写用例最容易踩的 7 个坑前面讲了很多理论这一节直接上实战排雷。这些年我带新人发现大家写用例翻车的地方翻来覆去就这几个预期结果写成感觉。页面显示正确程序正常无异常这类词全是主观描述执行者没法判断。步骤太粗。运行程序检查页面这种步骤换个环境、换个人根本没法复现。只写正路径。能跑通就行从没想过参数传错、网络断了、文件不存在这些情况。用例之间相互依赖。前一条用例通过后一条才能执行。这种设计一旦前一条挂了后面全阻塞排障成本极高。一个用例里塞了太多验证点。执行到第 3 步挂了你都不知道是第 1 步影响还是第 2 步影响。尽量一个用例只验证一个核心行为辅助验证点可以放备注。前置条件写得比环境准备还长。写前置条件是为了可复现不是为了凑字数。如果你发现前置条件里有一堆机器配置要达到 XXX 标准就要考虑是不是用例粒度太大了。用例写完之后从不回归更新。开发改了行为用例还停留在旧版本执行的时候永远在失败最后大家就不看用例了。用例是活文档不是一次性的作业。6.2 执行用例时执行结果和预期不符的排查思路执行用例时遇到结果对不上是第一万次正常的。关键是排查思路要对别一上来就改预期结果。我总结了一个五步排查法确认执行步骤是否完全按用例执行。跳步、少步、多做了操作都可能导致结果偏差。特别常见的是前置条件里要求清空缓存实际执行时没清结果就是脏数据影响。确认测试环境是否干净。程序版本、配置文件、依赖包、系统时间、网络状态任何一项发生变化都可能影响结果。确认预期结果是否基于当前版本。如果需求在迭代中发生了变化用例没同步更新预期结果本身就过期了。这时候不是执行失败而是用例失效。复现一次记录原始信息。重新执行一遍把终端报错、页面截图、响应报文都留下来。没有信息排查无从谈起。区分程序 bug 和用例缺陷。如果是程序 bug按 bug 流程提交如果是用例本身写得不精确提用例修改。很多新人一看到结果对不上就慌了其实这就是测试工作的日常。我个人的一条铁律是一次修改只动一个变量。比如你怀疑是环境问题就换个干净环境重跑这条怀疑是数据问题就换一组测试数据重跑。不要同时改环境和数据那样跑出来的结果你根本说不清是哪个变量导致的。6.3 一张常用问题速查表现象可能原因优先排查方向用例无法执行前置条件不完整或已变化按前置条件重新准备环境步骤执行后无可观察结果步骤描述太粗缺少中间检查点细化步骤增加观察动作预期结果与实测不符程序 bug、数据污染、用例过期先复现再提交 bug 或改用例用例之间互相影响存在执行顺序依赖设计用例时保证独立必要时用独立测试数据自动化脚本执行不稳定页面加载慢、网络波动、断言写法粗糙加等待、精确选择器、幂等断言用例数量越来越多难以维护缺乏分类和优先级按模块、优先级、标签组织管理这张表建议收藏实际工作中排查问题时对照着用至少能少走一半弯路。7. 从 Hello World 到真实项目用例的复用、维护与 AI 辅助7.1 当用例数量从 12 条变成 12000 条时前面我们写了 12 条用例覆盖一个 Hello World 程序感觉已经不少了。但你到真实项目里一个稍微像样的系统用例随随便便就上百条大点的项目上万条也不稀奇。这时候问题就从怎么写用例变成了怎么管用例。我的建议是提前建立分层意识。把用例分成三层管理冒烟层P0 用例主路径覆盖每次构建后必跑执行时间控制在 10 分钟内。回归层P0 加 P1 用例覆盖核心功能和主要异常路径每次迭代发布前跑一遍。全量层所有用例包含 P2 边界和体验类版本里程碑时执行。Hello World 例子里前 5 条 P0 用例就是冒烟层加上 6~9 条是回归层再把 10~12 条加进来才是全量。这个分层逻辑无论项目多大都成立。7.2 多项目组复杂迭代下的复用和维护策略热点词里有测试用例在不同项目组的复杂迭代需求中的管理复用和维护这个坑我踩过说点实在的。多项目组协作时最忌讳的是每个项目组都维护一套自己的用例模板和编号规则结果 A 组的用例拿到 B 组完全看不懂。我建议从一开始就做三件事统一模板与编号规则。模板字段别搞特殊化编号规则全局唯一。哪怕每个项目有自己的业务模块前缀但编号-名称-前置-数据-步骤-预期-优先级-备注这些核心字段要完全对齐。建立用例标签体系。用标签标记用例的所属模块、关联需求、对应平台、验证层级冒烟/回归/全量。这样跨项目组检索用例时不需要翻文档按标签过滤就行。用例与需求双向追踪。每一条用例都能追溯到需求编号每个需求变更时能反向找出受影响的用例列表。这事在初期觉得繁琐但迭代三个月后你就知道它的价值——需求一变你不再需要人肉去翻哪些用例要改。另外复杂迭代里用例维护最大的敌人是静默失效。开发默默地改了一个交互细节用例没跟上回归的时候用例挂了大家第一反应是这用例早就不准了然后跳过它。跳过三次之后这条用例就废了。避免静默失效的唯一办法是每次迭代的用例评审会上过一遍受影响用例而不是等执行失败了再亡羊补牢。7.3 AI 生成测试用例能替代人工吗最后聊一个热门话题AI 生成测试用例。蚂蚁的那位讲师提到过基于 AIGC 的测试用例自动生成技术社区里也有人在折腾用 LangChain 搭一个能读测试用例文档、自动生成 UI 自动化脚本的 Agent。这个方向确实有意思但我想给你一个清醒的认知AI 是放大器不是替代者。我试用过不少 AI 辅助生成用例的工具它们的能力集中在三块一是根据需求文本快速生成候选测试点二是把已有手工用例翻译成自动化脚本三是帮你在代码变更后识别可能受影响的用例。这些能力确实能大幅提升效率但有个前提——你得先能判断 AI 生成的东西靠不靠谱。如果你自己连 Hello World 用例都不会拆AI 给你生成 50 条看似专业实则空洞的用例你连筛选的能力都没有。所以我的建议是先用人工把基本功练扎实再用 AI 放大你的效率。具体可以这么用把需求文档丢给 AI让它生成初始测试点列表然后你逐条审查去除无效的、补充缺失的确认后的测试点再转成标准用例。这个流程里AI 做初稿你做评审和决策质量才有保障。另外提醒一句AI 生成用例最大的风险是幻觉——它会一本正经地生成被测系统根本不存在的功能。所以永远不要在没验证的情况下把 AI 生成的用例直接执行或直接交给团队。这两年我带过的每个新人我都会让他们从这一件事开始给一个只有一行输出的小程序先拆测试点再写满十二条用例然后自己当执行者一条一条跑通。凡是自己都跑不下去的用例就是将来坑整个团队的用例。这个作业做完再谈工具再谈框架再谈自动化。因为测试这个行业工具每年都在变框架三年就换一轮需求永远在动但把一句简单的话拆成一百种可能的场景这个能力你练成了就永远不会过时。
返回列表