资讯动态

用序列图设计测试用例:从时序图到完整用例清单

发布时间:2026/9/9 9:36:05 来源:尧图企业网站定制
接触过几年软件测试的人应该都有这种感觉拿到需求文档第一反应是找用例设计方法等价类、边界值、判定表背得滚瓜烂熟可真到写测试用例的时候还是觉得心里没底。尤其是涉及多个模块交互、多个接口串联的场景你根本说不清先调谁后调谁调用之后系统应该处于什么状态某个中间步骤失败了到底该回滚还是继续往下走。这种模糊感恰恰是序列图能解决的核心问题。序列图Sequence Diagram是UML里动态建模的一张图核心价值就是把谁在什么时间、按什么顺序、调用谁的什么方法画出来。对测试来说它天然就是一份覆盖面很广的用例设计素材。我这些年做过的支付、电商、物联网项目凡是接口交互复杂、有回调有异步消息的几乎都靠序列图来兜底设计测试用例。这篇文章就把我从序列图里挖用例的完整方法和踩过的坑整理出来适合做功能测试、接口测试、测试开发以及准备软件测试面试的朋友参考。文章后面会用一个订单超时自动取消的实战案例把从时序图到最终用例清单的每一步都拆开讲保证你看完能直接抄作业。1. 序列图测试设计的价值为什么选它而不是等价类/边界值1.1 序列图在测试里到底承担什么角色很多人对序列图的印象停留在大学UML课程里觉得它就是个画给开发看的交互图跟测试关系不大。这个认知其实是错的。序列图描述的是系统内部各对象或者外部用户、外部系统之间在时间维度上的消息交换过程它回答的问题恰恰是测试最关心的三件事输入是什么消息参数、步骤是什么消息顺序、输出是什么返回消息和状态变化。举个例子一个最简单的登录功能你画一条序列图出来就能看到用户→登录Controller→用户服务→数据库这一条完整链路。等价类划分只能告诉你用户名该填什么格式的合法数据、什么是不合法的数据但序列图能告诉你用户服务查完数据库之后是直接把结果返回给Controller还是先写日志再返回数据库查不到用户时是抛异常还是返回空对象这些信息直接决定了测试用例的预期结果写得准不准。所以在测试领域序列图的角色应该被定义为预期行为契约。需求文档是给所有人看的业务描述而序列图是技术层面的行为描述它把系统应该怎么做这种抽象描述变成了一条条具体的消息调用链。测试人员拿着这份契约才能设计出真正贴合系统真实行为的用例而不是靠猜。1.2 对比其他测试设计方法序列图的独特优势做测试设计的人都知道方法论那一套说起来头头是道等价类划分管输入数据边界值分析管临界点判定表管条件组合状态迁移管状态流转场景法管业务流程。那序列图法跟这些比优势到底在哪我做了个对比表方便你理解它们的适用边界测试设计方法核心关注点擅长场景不擅长场景等价类划分单个输入数据的取值表单校验、参数合法性多模块交互、消息顺序边界值分析数据临界点数值范围、时间边界分支组合、并发逻辑判定表多个条件的逻辑组合业务规则复杂、条件多时间顺序、回调链路状态迁移状态与事件驱动订单状态机、流程引擎跨系统交互、接口时序场景法业务主流程与扩展流端到端业务路径详细消息级验证、并发竞态序列图法参与者之间的消息与顺序多系统交互、回调、异步、并发单点输入数据的穷举从表里能看出来序列图法最独特的地方在于它天然覆盖了时序和交互这两个维度。等价类、边界值回答的是给什么数据判定表回答的是什么条件下走哪条分支而序列图回答的是消息按什么顺序在参与者之间流动中间有哪些分支、循环、并行、异常返回。一个支付系统最怕的恰恰不是某一个字段测错了而是支付网关回调、库存锁定、超时取消这几个事件撞在一起时的顺序问题这种问题不用序列图根本说不清楚。所以我的观点很明确序列图法不是用来替代等价类、边界值的它是跟这些方法配合使用的。用等价类把每条消息的参数取值搞定用判定表把alt片段里的条件组合搞定再用序列图把所有交互路径完整串起来这样的测试设计才立体。1.3 什么项目最值得用序列图做测试不是所有项目都需要在序列图上投入大量精力。一个纯CRUD的管理后台接口就是简单的增删改查画序列图的意义不大用等价类和流程用例就够了。但下面这几类项目我强烈建议测试人员主动要求开发提供序列图或者自己根据接口文档补画多微服务协作的系统。订单、支付、库存、积分分属不同服务一个请求要跨三四个服务才走完没有序列图你根本判断不了每个服务该在什么时候被调用失败时该补偿还是回滚。有大量异步消息和回调的系统。比如支付回调、短信回调、消息队列消费、定时任务触发这类事件没有明确的同步返回测试用例的预期结果往往依赖状态变化或者消费日志序列图能把异步事件的触发时机和后续影响画清楚。涉及硬件与软件交互的嵌入式系统。现在汽车HMI、工控设备这类项目越来越热车载中控屏跟底层控制器之间的软硬件接口测试本质就是验证指令消息的顺序和响应时间序列图几乎是标配。高并发、强顺序要求的核心链路。像秒杀、订票这种系统多个请求同时到达时的顺序处理逻辑极其关键序列图加上并发的测试方法能挖出很多隐蔽的竞态问题。一句话总结只要系统里存在多个参与者在时间上有先后依赖关系序列图就是测试设计最好的抓手。2. 从序列图提取测试场景标准流程与核心技巧2.1 先读懂序列图的五个关键元素想把序列图变成测试用例第一步是读懂图里每一个元素在表达什么。很多测试新手拿到序列图就懵本质上是没搞清楚图里那几条线和方框的语义。这里我把最核心的五个元素过一遍每个都结合测试的角度说。生命线Lifeline。就是图顶部那个矩形加一条竖直虚线代表一个参与者。这个参与者可以是用户、外部系统、服务、类、数据库甚至是消息队列。从测试角度看每一条生命线就是一个被测对象或者至少是测试必须关注的一个环节。两条生命线之间的交互就是接口测试、集成测试要覆盖的边界。消息Message。用箭头表示是从一条生命线指向另一条生命线的调用或信号传递。实心箭头代表同步调用发出去要等对方返回开放箭头代表异步消息发出去就不等结果虚线箭头代表返回消息。测试里最核心的工作就是把每一条消息当成一个测试步骤把消息的参数当成输入把消息的返回当成预期结果。这里有个特别容易忽略的点返回消息也是消息它的值直接影响后续流程所以预期返回值要逐一验证不能只关心最终结果。激活条Activation Bar。就是生命线上那个细长矩形表示该参与者正在执行的时间段。激活条越长说明这个处理越耗时也暗示着这个环节是性能测试要关注的点。如果某个激活条跨越了很长一段消息交互说明它是外部依赖方稳定性测试要重点照顾。组合片段Combined Fragment。这是序列图里最复杂也最值钱的部分是各种带标签的方框。最常见的有几种片段类型含义测试关注点alt互斥分支类似if/else每个分支都要设计用例条件边界要测opt可选片段条件满足才执行满足条件和不满足条件各测一遍loop循环执行0次、1次、n次、n1次都要验证par并行执行并发顺序、竞态问题、死锁break中断流程中断条件触发后后续消息是否被跳过critical原子操作中断操作时是否保证完整性从测试角度来看组合片段就是分支条件的集合。alt里的每个条件分支是一条独立路径opt是走或不走两条路径loop是循环次数的边界par则直接指向并发测试场景。读图时把这些片段全部标出来用例的骨架就有了。状态约束与时间约束State/Time Constraint。有些序列图会在生命线上用花括号标注前置状态或时间要求比如{state CREATED}表示执行到这个节点时对象必须处于已创建状态或者{t 30s}表示某条消息必须在30秒内发出。这些约束直接就是测试用例的前置条件和预期时间指标看到了必须单独摘出来。2.2 四步法把时序图变成测试用例读懂了元素接下来就是标准化的转换流程。我总结了一套四步法团队里的新人照着走基本不会漏场景。第一步盘点参与者与消息清单。把图里所有的生命线列出来确定哪些是测试能直接操控的比如用户、前端哪些是依赖的比如支付网关、数据库然后把所有消息按顺序编号形成一张消息清单。清单里要包含消息名、发送方、接收方、参数、返回类型。这一步做完你就拥有了这副时序图的完整接口目录。第二步识别分支、可选、循环和并行。把所有的alt、opt、loop、par片段挑出来标出每个片段的条件和分支数。这一步的关键是计算理论路径数如果有两个alt片段各有2个分支理论上就是4条路径如果其中一个还有嵌套路径数会翻倍增长。但注意理论路径数不等于实际用例数很多分支条件之间是互斥的或者受业务限制的要先用业务逻辑做裁剪。第三步从入口到出口遍历全部场景路径。这是整个流程里最需要功底的环节。从序列图的第一条消息开始沿着箭头走到最后一条消息每遇到一个分支就分叉出一条新的路径最终你能得到一个场景路径树。遍历时我习惯用主路径优先的原则先把最正常的成功路径走完再逐条插入异常和分支路径。这样做的好处是每一条异常路径都能明确地挂靠在某条主路径上用例的层次感特别清晰。第四步把场景路径转成测试用例。每条路径对应一条或者多条测试用例转换时要注意三个要素。前置条件要覆盖路径起始时的状态约束比如订单必须处于创建状态操作步骤就是路径上所有消息的序列但要转成测试可执行的描述比如调用创建订单接口而不是用户调用订单服务createOrder方法预期结果要同时验证返回值、系统状态变化、以及后续消息是否被正确触发。到了这一步序列图设计的基本盘就出来了。2.3 覆盖度怎么算消息覆盖、分支覆盖、路径覆盖序列图用得好不好得有个量化标准。我平时做用例评审会问团队成员三个覆盖度指标这里也分享给你。消息覆盖度。公式是被测试用例覆盖到的消息数除以序列图里的总消息数。每条消息都至少有一条用例覆盖到这是最低要求。比如图里有10条消息你的用例只覆盖了7条那剩下3条消息对应的交互行为就没被测到风险就藏在那里。分支覆盖度。所有alt、opt片段里的每个分支至少要有一条用例走到。注意分支覆盖不是说条件满足这一侧走到就行条件不满足走另一侧也必须覆盖。很多人在实际测试里只测了业务最关心的成功分支把异常分支和else分支漏了分支覆盖度往往只有50%这是大忌。路径覆盖度。理论上有多少条完整路径被实际设计了多少条用例。做路径覆盖时要记住一个原则完全穷举不现实组合爆炸是真实存在的。两个alt四个条件理论路径就有16条全测不划算也没必要。实际做法是先保证主路径和关键异常路径全部覆盖再用业务优先级做裁剪对高频路径做全组合覆盖对低频路径做至少一次覆盖。举一个真实例子我之前测过一个转账功能时序图里有两条alt一条管余额是否充足一条管账户状态是否正常理论上4条路径。但业务上余额不足且账户冻结这种组合根本不可能出现因为账户冻结时根本走不到余额检查。这类路径在裁剪阶段就可以划掉剩下3条路径每条再配合等价类数据用例就既完整又不冗余。3. 实战案例订单超时自动取消的完整测试用例设计3.1 业务背景与时序图解析理论讲再多都不如一个完整案例来得直观。这个案例我选了一个几乎所有电商项目都有的场景订单创建后如果用户在一定时间内没有支付系统要自动取消订单、释放库存。这个场景涉及用户、订单服务、支付网关、库存服务、消息队列、定时任务等多个参与者而且包含同步调用、异步回调、定时触发、并发竞态非常适合演示序列图驱动测试设计。我们假设业务规则是这样的用户在商城下单订单初始状态为待支付用户发起支付后由支付网关处理处理结果通过异步回调通知订单服务如果订单创建后30分钟内仍未支付超时任务调度器会自动取消订单并释放库存如果支付回调和超时取消同时发生系统要保证最终状态一致。对应的序列图我用非正式的文本形式画在下面方便你看清参与者之间的消息顺序用户 订单服务 支付网关 库存服务 调度器 | | | | | |--1.创建订单--| | | | |---2.orderId--| | | | |--3.发起支付--| | | | | |--4.调用收银合并--| | | |---5.支付二维码--| | | | | | | | | |(用户等待支付) | | | | | | |--6.异步回调---| | | |--7.校验签名--| | | | | | | | | |branch(支付成功) | | | |--8.锁定库存----| | | | |--9.锁定结果----| | | | |--10.更新状态-| | | | | | | | | |branch(支付失败) | | | |--11.更新状态-| | | | | | | | | | | |--12.查询超时订单-| | | | |--13.超时订单列表-| | |--14.取消订单---| | | | |--15.释放库存----| | | | |--16.释放结果----| | | | |--17.更新状态-| | |图里中间有两条判断逻辑第7条消息收到回调后走支付成功还是支付失败分支第14条消息是调度器触发取消订单。这两个分支再加上支付回调与超时取消并发的情况就是我们设计用例的主战场。细化一下消息清单方便后面设计用例时引用消息编号消息内容发送方接收方关键信息1创建订单用户订单服务用户ID、商品ID、数量、金额2返回订单号订单服务用户orderId、订单状态待支付3发起支付用户订单服务orderId、支付方式4生成收银数据订单服务支付网关订单号、金额、回调地址5返回支付二维码支付网关用户二维码链接6异步回调支付结果支付网关订单服务订单号、支付结果、签名7校验签名并解析结果订单服务支付网关回调数据合法校验8锁定库存订单服务库存服务商品ID、数量9返回锁定结果库存服务订单服务成功/失败10更新订单为已支付订单服务内部状态变更11更新订单为支付失败订单服务内部状态变更12查询超时订单调度器数据库状态待支付且创建时间当前时间-30分钟13返回超时订单列表数据库调度器符合条件的订单集合14调用取消订单调度器订单服务orderId、取消原因超时15释放库存订单服务库存服务商品ID、数量16返回释放结果库存服务订单服务成功/失败17更新订单为已取消订单服务内部状态变更3.2 场景拆分与用例明细有了消息清单接下来就是按四步法拆场景。先画出理论路径消息1-5是一条主路径之后第6条回调进来走两条分支成功/失败加上调度器的取消路径理论路径就有四条正常支付成功、支付失败、超时取消、支付成功但库存锁定失败。再考虑支付回调与超时取消并发这条特殊路径最终整理出下面这些核心场景。用例编号场景路径前置条件操作步骤要点预期结果重点SC-01正常支付成功消息1-10商品库存充足创建订单→发起支付→支付网关回调成功订单状态变为已支付、库存被正确锁定、返回成功SC-02超时自动取消消息12-17订单创建后30分钟未支付查询超时订单→触发取消→释放库存订单状态变为已取消、库存释放、用户可看到取消原因SC-03支付失败回调消息11支付网关返回失败创建订单→支付→回调支付失败订单状态变为支付失败、不锁定库存、无资损SC-04支付成功但库存锁定失败消息8-9异常库存不足或库存服务异常支付回调成功→锁定库存返回失败订单状态不能是已支付需有明确失败处理库存不能扣减SC-05支付回调与超时取消并发订单已超时但用户恰好完成支付同时触发支付回调和取消任务最终状态只能有一个不能出现已支付又已取消的矛盾SC-06支付超时边界29分59秒订单创建后29分59秒未支付在临界点检查订单订单仍未取消用户可继续支付SC-07支付超时边界30分00秒订单创建后30分00秒未支付触发调度器查询订单进入可取消范围取消成功SC-08支付成功回调重复通知订单已支付成功支付网关重复发送相同回调系统幂等处理状态不重复变更不重复扣库存SC-09取消订单时释放库存失败库存服务异常触发取消→释放库存返回失败订单取消不受影响或触发补偿库存记录需可追踪你注意看SC-01到SC-04这两组它们就是alt分支产生的场景每个分支都有一条用例。SC-05是为了验证并发问题单独加的SC-06和SC-07是边界时间用例SC-08是回调幂等用例SC-09是释放库存失败时的补偿逻辑。这些用例组合在一起序列图里所有消息和分支就全覆盖了。3.3 这个案例里最容易测漏的三个点我拿这个案例带过好几个测试新人几乎每次都会漏掉下面三个点这里特别拎出来强调一下。第一时间边界比你想的复杂。30分钟超时不是一个瞬间中间涉及订单创建时间的存储、调度器扫描时间的精度、时区问题。最常见的问题是用例只在明显超时比如过了40分钟的场景下测而忽略了29分59秒和30分00秒之间的边界。这个边界恰好是业务最容易出bug的地方很多系统的调度器扫描频率是每30秒一次那29分59秒未支付和30分00秒未支付在数据库里可能同时被扫到处理逻辑一旦没考虑时间精度就会出现提前取消或者超时未取消的线上事故。第二回调幂等性必须单独验证。支付网关的回调机制是至少一次投递也就是说同一笔支付结果可能被回调好几遍加上网络抖动导致的重试一个订单收到两三次相同的成功回调是非常正常的事。如果系统没做幂等处理第二次回调进来就会重复锁定库存或者重复发状态变更通知。序列图上只画了一次异步回调但测试里必须在正常场景之外再造一个重复回调场景验证消息处理是幂等的。这就是图上看不到但必须测的典型场景。第三并发竞态是隐藏的重灾区。SC-05这种场景很多人觉得不可能发生用户早不支付晚不支付为什么非得在超时那一瞬间支付但真实系统里完全可能因为调度器扫描有延迟支付网关回调也有延迟两个事件可能撞在一起。这种并发情况下如果订单服务在取消订单前没有做状态校验或者状态更新不是原子性的就会闹出库存已释放但订单被标记为已支付的笑话。我在真实项目里见过不止一次这种事故解决方案无非是状态机校验加分布式锁但测试必须先把场景造出来逼系统显形。4. 常见坑位与排查实录真实项目中踩过的雷4.1 序列图画得不准确测试跟着错第一个要说的坑是序列图本身的准确性问题。我给你交个底开发给的序列图很多时候赶不上代码演进的速度。今天画的图明天需求一改图没更新代码已经改了。你要是拿着旧图设计用例轻则用例步骤对不上实际接口重则整个测试方向都跑偏。我踩过一次很深的坑。之前测一个运费计算功能开发给的序列图里画的是订单服务→运费服务→规则引擎这条链路。我照着设计了几十条用例执行的时候发现运费服务根本没被调用是订单服务直接本地算的。后来查代码才知道项目优化时把运费计算改成了本地实现远程调用早就下线了图还是老样子。那次之后我学乖了拿到序列图的第一件事不是直接设计用例而是先在测试环境里跑一遍真实链路确认图里的参与者和消息顺序跟现状一致。对不上的地方要么让开发更新图要么自己改图并备注原因。这里给一个可落地的建议序列图一定要跟着代码走。如果你是测试人员最好的习惯是让开发在需求设计阶段就把序列图画好随代码评审一起维护如果已经落后了你至少要会用Arthas、链路追踪这类工具在测试环境把真实调用链拉出来跟序列图做一次比对。图不准的时候把它当参考把真实链路当标准。4.2 异步消息和回调怎么设计用例异步消息是序列图测试里最让人头疼的部分。同步调用你发个请求等返回就能断言异步消息发出去了响应不会马上回来预期结果往往要等一段时间才能验证。你设计用例的时候必须想清楚异步消息之后怎么收口。以订单支付回调为例同步设计里的断言返回结果不适用了你得换一套思路。我的做法是把一条异步用例拆成三段来写触发段、等待段、验证段。触发段负责把异步事件发出去等待段明确写清楚等待条件比如等待消息队列消费完成轮询订单状态直到变为已支付超时60秒验证段再检查最终状态和关联系统的数据。这里还有个细节异步测试环境里的消息队列一定要可控最好能用mock把外部消息源替换成测试自己能触发的不然你就在那里干等真实支付网关回调测试根本跑不稳定。回调接口和消息消费的稳定性也必须纳入用例设计。支付网关回调可能延迟、可能重复、可能丢失消息队列消费可能失败重试。我在设计用例时通常会加两类场景一类是回调延迟到达验证延迟后的处理结果是否符合预期另一类是消费失败后重试成功和消费失败超过最大重试次数进入死信队列验证重试机制和补偿机制是否正常。这些在序列图里通常只画了一个箭头但测试展开之后往往是一串用例。4.3 竞态条件并发场景的测试思路序列图上出现par片段或者你发现两条消息可能在时间上重叠时并发测试就躲不掉了。但并发测试有个难点你需要稳定地复现竞态而不是指望运气。靠手动操作去同时点两个按钮成功率极低必须有方法。我的经验是分三步。第一步从序列图找出可能并发的消息对分析它们是否操作了同一个资源比如订单状态、库存数量。第二步利用工具在关键节点上人为制造阻塞把竞态窗口拉大。具体做法有几种在测试代码里对某个接口加延迟、用mock服务把某个外部调用暂停几秒、或者用并发压测工具让大量线程同时触发。第三步在有阻塞的情况下同时触发两条消息验证最终一致性。针对订单超时取消这个案例最直接的复现方式是用mock把支付回调接口的处理时间人为拉长到10秒让回调处理还没结束再触发调度器去取消同一个订单。这时候就能看到系统到底是先判断订单状态还是直接取消会不会出现状态互相覆盖的矛盾。这种测试不用自动化工具也能做但做的时候要记录清楚每一步的时间线否则不好定位问题。4.4 面试里碰到的序列图题目怎么答面试这一块跟咱们的主题也相关。软件测试面试题里经常出现如何根据序列图设计测试用例什么是时序图这类问题我以面试官的身份给你透个底面试官不是在考你UML语法是想看你的测试设计思路。一个能拿高分的回答套路我建议分四层。第一层说清楚序列图是什么核心关注消息、生命线、组合片段强调它是动态交互图。第二层说清楚测试步骤就是前面讲的四步法整理参与者和消息、识别分支和循环、遍历场景路径、转换成用例。第三层举一个简单的例子比如登录或下单现场口述几条从序列图推出的用例展示你的实操能力。第四层点出序列图法的优势特别是对异步、回调、并发场景的覆盖能力顺便提一句覆盖度指标比如消息覆盖、分支覆盖、路径覆盖这会比那些只会背八股文的候选人明显高出一截。这里提醒一下准备面试的时候不要只停留在概念层面一定自己找一张真实项目的序列图练习转换用例。我面试的时候最常问的一个问题是这张图里有几个alt片段你会设计哪几条用例能把这个问题答得具体、有层次的人基本就是真正用序列图做过测试的。5. 工具链与自动化扩展把序列图用出效率5.1 画图与建模工具怎么选序列图驱动的测试设计要落地工具先得选对。这里我把常见的工具按使用场景分了三类你根据团队情况挑。文本化工具首选PlantUML。说实话现在我自己写序列图基本都用PlantUML因为它用纯文本描述图形可以放到Git里做版本管理和代码一起走评审。改动序列图跟改代码一样能看见diff测试团队和开发团队维护起来都方便。比如订单超时取消的序列图用PlantUML写出来就几十行文本后续需求变更直接改文本重新渲染比在画图工具里拖线条高效太多。PlantUML还支持导出PNG、SVG放到测试用例文档里做附件很省事。在线协作类工具用draw.io。如果需要跟产品和业务一起评审draw.io这种在线协作工具更合适可以多人同时编辑方便快速画个草图然后把焦点放在业务逻辑讨论上。它同样支持导出XML简单场景下够用了。重型建模工具是Enterprise Architect或StarUML。这类工具适合大型项目模型库、代码生成、XMI导出一应俱全。如果你的公司已经用EA做架构管理测试人员最好也接入进去直接从模型库里提取序列图元素自动生成部分测试文档。但要注意这类工具学习成本高、许可证也不便宜团队规模小的话性价比不高。我的建议是优先选能进版本管理的文本化方案。测试用例设计这件事追踪历史变更比画得好看重要得多。我用PlantUML画图后会在设计文档里贴一张渲染出来的图同时把源文件路径写在用例管理平台上这样图的历史版本和用例的对应关系永远有据可查。5.2 序列图驱动的自动化测试思路把序列图转换成手工测试用例只是第一步再往前走一步序列图还能驱动自动化测试。这里分享几个我在实际项目里用过的思路从简单到复杂。最简单的一种是直接用API测试工具承载序列图消息。序列图里的每条消息基本都能对应一个HTTP接口或者RPC调用你可以把消息清单导入Postman或者JMeter按顺序组合成测试集。比较成熟的团队还会把消息清单导出成OpenAPI或者Postman Collection然后在持续集成流水线里定时跑这就是最轻量的接口自动化。进阶一点是读取序列图模型文件做半自动用例生成。像EA或者PlantUML导出的XMI格式文件里实际上已经包含了生命线、消息、组合片段的结构化信息。你可以写一个小程序解析XMI把消息顺序提取出来再根据alt片段的分支自动展开成多组路径。虽然最终生成的用例还是要人工核对条件和预期值但至少最繁琐的路径遍历工作被自动化了。我之前用Python写过一个很简单的解析器从XMI里提取出消息序列之后配合模板生成Excel用例框架测试人员只需要填参数和预期结果效率提升非常明显。再往深了走序列图可以和契约测试、链路追踪结合起来。微服务架构下消息顺序本身就构成了一份隐形的契约服务间接口的调用顺序变了链路就可能断开。用Pact这类契约测试工具把序列图里服务间的交互关系固化成契约任何一方改了接口都能在测试阶段被及时发现。链路追踪系统比如SkyWalking也能帮上忙它把真实请求的调用链记录下来你可以拿真实调用链和序列图做自动比对发现不一致的调用顺序就自动告警这个思路在大型分布式项目里非常实用。5.3 在团队里落地的推进建议方法再好落不了地也是空的。如果你想把序列图驱动测试设计在团队里推起来我建议按下面这个节奏来别一上来就全面铺开。第一先挑一个核心链路做试点。找一个业务重要性最高、交互最复杂的流程比如支付、下单、退款这类让开发补画序列图然后测试按四步法设计一轮用例。试点的好处是风险可控而且这类流程往往已经存在测试盲区做了之后效果立竿见影更容易说服团队继续推广。第二把序列图设计嵌入现有的测试流程。可以安排在测试用例评审之前加一道序列图走查环节测试人员对照序列图逐条确认用例是否覆盖了所有消息、分支和循环边界。开发人员参与走查能纠正图与代码不一致的问题产品和测试也能提前对齐业务预期。这个环节在需求评审阶段做效果最好越早发现交互逻辑问题修复成本越低。第三别过度建模。序列图管交互、管顺序、管时序但不管每个输入框怎么校验那部分交给等价类边界值。一个系统画四五张核心序列图就够用了别想着把每个功能都画一遍那样维护成本会高到团队直接放弃。我见过有的团队把序列图当摆设画完就扔进文档库吃灰这种形式主义的做法还不如不画。最后再提醒一句关于软件测试项目实战和新人培训的事。如果你在带新人或者自己正在转行学测试我强烈建议把序列图测试设计作为练习项目的一个必做环节。很多新人写用例只盯着功能表面不会从交互层面思考一旦他学会从序列图出发设计用例测试设计的思维层级会有一个明显的跃升。现在不少软件测试课程里也把序列图作为重要的测试设计内容来讲这个趋势是对的。写在最后的一些经验序列图驱动测试设计这条路我自己走了好几年从最初只会照着图抄消息到现在能依据时序图预判风险点中间确实踩了不少坑。印象最深的是第一次在支付项目里用序列图排查线上问题当时一笔重复支付的客诉怎么都查不出原因后来把支付回调、对账任务、超时取消三张序列图叠在一起看才发现是回调重试和定时任务补单撞了车本质上就是两个异步消息在同一时间窗内操作了同一笔订单。那次之后我对序列图的信任度就彻底拉满了。如果你想快速上手我建议今天就在手头最熟悉的系统里挑一条核心业务链路让开发提供序列图或者自己根据接口文档补画一张然后走一遍消息盘点、分支识别、路径遍历、用例转换的完整流程。做完一轮你会对系统是怎么协作的这件事产生跟以前完全不同的理解。这个内容后续还可以往两个方向扩展一是配合状态机图做状态和交互的双重验证二是把序列图消息清单接入自动化测试平台彻底解决手工维护接口自动化用例成本高的问题。我个人的体会是测试设计方法千千万但能把一张图画成一套高质量测试用例这门本事走到哪里都不过时。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价