资讯动态

UI自动化批量运行从单条通过到稳定回归的完整指南

发布时间:2026/10/16 4:59:32 来源:尧图企业网站定制
三条用例分开跑绿得发亮合在一起批量跑红得刺眼。这种经历做过UI自动化测试的人多少都遇过。然后不少人就陷入一种循环批量跑挂了就单独把那条拿出来跑又过了于是归因于“环境问题”“偶发问题”接着继续全量跑继续挂。实际上从“单条用例能通过”到“批量运行测试用例稳定通过”中间隔着很厚的一层东西这一层才是标题里那个“重点”真正要说的内容。这套某商城电商项目的UI自动化完整的回归集可能有几十条用例。单条调试的时候每条用例都是自己起一个干净环境自己操作自己的页面自己造自己的数据浏览器也是新开的所以失败率很低。真正批量跑的时候同一个测试进程里几十条用例共享了很多东西——登录态、浏览器实例、测试数据甚至共享同一份报告目录。处理不好批量跑就是一场灾难。本文就围绕“把单条用例变成可以稳定批跑的测试集合”这件事展开内容包括用例体质的改造、依赖解耦、数据清理、批跑方案的选型与配置、并发取舍、失败重跑与定位以及从本地批跑到持续集成批跑之间的差距。适合刚学会写UI自动化用例、正在搭建回归测试集的人也适合那些被“单条能过、批量就挂”折磨到怀疑人生的测试工程师。1. 单条通过不代表批量能过核心矛盾在哪先说一个反直觉的事实批量运行测试用例不是为了“省时间”而是为了暴露问题。省时间只是副产品。如果批量跑和单条跑的结果完全一样那所有自动化用例都永远单条跑就行了根本不需要去设计执行批次。正因为批量跑会引入单条跑时不存在的变化它才有资格成为回归验证的基准手段。1.1 单条用例的成功里藏着多少“环境红利”单条跑的时候你天然享受了几种隐形的“优待”。第一是浏览器实例是全新的缓存、Cookie、localStorage都是空的不存在上一个用例留下的痕迹。第二是测试数据是新的比如你新增一个收货地址跑完就删掉了下一次再跑不会遇到重复地址的校验。第三是执行顺序不会影响你你这条用例永远是第一个跑不需要担心前面哪条用例把系统状态改掉了。但批量跑把这些红利全部收走了。浏览器可能被前面用例用了几十分钟中间弹过通知、切过窗口、出现过遮罩层数据库里可能已经有上一次批量跑留下的几十条订单、十几个地址、一堆重复账号前面某条用例可能把公共配置改了或者把某个开关关掉了。于是你那条单条跑永远通过的用例在批量场景下开始随机失败。这时候你再单独跑一次又是绿的你会误以为它是偶发问题其实它只是吃到了“环境红利”。我在实际项目里见过最多的批量失败原因根本不是被测系统出了新Bug而是用例之间互相干扰。尤其是登录状态。第一条用例登录了账号A第二条用例登录了账号B第三条用例上来没做登录操作默认还是账号B的会话但它断言的是账号A的昵称。这种用例被拆开单独跑每一步都自己登录永远没事一旦批量跑顺序一变就挂。所以看待批量运行第一步要有的心态是批量失败不是测试框架的错而是用例设计得不够独立。1.2 批量运行真正考验的是用例的独立性一条合格的UI自动化用例应当具备“随时被批量调度”的体质。这句话的意思是把它放在任何一批用例里、任何顺序下、重复跑任意次结果都应该是确定的。要做到这一点用例本身必须自带前置条件、自带数据准备、自带环境清理而不是依赖其他用例帮它开路。这种独立性和“全班一起考试”的道理很像。单人做练习的时候什么时候喝水、什么时候翻书、桌面怎么摆都不影响结果。但全班统一考试时座位、光线、前后左右的人都会影响你。批量跑测试用例就是把所有用例放到同一个考场里互相之间必须不能递纸条、不能看同桌的答案。谁依赖了别人的状态谁就会在批量模式下露出狐狸尾巴。所以批量运行测试用例在技术上做的事情是“收集用例并依次执行”但它真正的复杂度在于你需要先把每一条用例改造成孤立的、可重复执行的、自带数据和清理的单元。这个改造工作是UI自动化从“能跑”走向“能回归”的分水岭。后面几节讲的目录设计、fixture分层、数据清理、失败重跑其实都是在服务同一件事让用例在批量环境下依然保持独立、可控、可解释。2. 让用例具备“随时被批跑”的体质目录、命名与Fixture设计在很多早期的自动化脚本里所有用例都堆在一个文件里文件名从test_001.py排到test_050.py每个用例函数里都有一段重复的登录代码。这种写法在单条调试时完全没问题但一旦进入批量运行你就会发现文件多了没人知道哪些是测试文件、哪些是公共模块用例执行顺序完全不可控浏览器实例创建和销毁的逻辑散落在各个脚本里根本没有统一管理。批量跑之前先把用例工程的结构理顺效果远好过事后追着问题修。2.1 目录和命名规则决定批量发现的边界我先给出一套经过验证的目录结构适用于中型的电商类UI自动化项目。这套结构不是死规定但它能把“用例”“公共方法”“数据”“配置”“报告”这几类东西隔离清楚不会在批量跑的时候互相踩踏。project_root/ ├── pytest.ini ├── conftest.py ├── testcases/ │ ├── test_login.py │ ├── test_cart.py │ └── test_order.py ├── common/ │ ├── base_page.py │ └── driver_factory.py ├── data/ │ └── accounts.json ├── utils/ │ ├── log.py │ └── screenshot.py └── reports/关键点有三个。第一测试用例统一放在testcases目录下文件名以test_开头这样批量运行时才能被自动发现。第二公共方法放进common目录比如页面操作的基类、浏览器实例的工厂函数这些文件不能以test_开头否则会被当成测试用例去执行。第三data目录放测试数据文件reports目录放每次批量跑的报告和截图这两个目录在批跑开始前最好自动清理或按时间戳生成新目录否则上一次的失败截图会和新报告混在一起排查时容易看错证据。pytest的自动发现机制是看文件的命名模式的我一般在pytest.ini里写清楚[pytest] testpaths testcases python_files test_*.py python_classes Test* python_functions test_* addopts -v -s --tbshort --htmlreports/report.html --self-contained-html这里的testpaths指定了批量跑的搜索目录python_files指定了哪些文件算测试文件。这样每次执行pytest框架只会收集testcases下符合命名规则的文件不会把common里的工具模块也拉进来执行。命名规则看似小事实际决定了批量跑的第一道边界。2.2 conftest与fixture的分层设计统一管理浏览器实例批量跑的时候浏览器实例的开和关是最容易出乱子的环节。常见的错误做法是每个测试模块里自己写setUp和tearDown各开各的浏览器。这样如果第一个用例挂了浏览器没关掉第二个用例起来时系统资源已经耗尽直接就启动失败。更麻烦的是有的用例设计成复用同一个浏览器实例但复用逻辑写得很随意前一个用例开到一半的页面状态残留给后一个用例后一个用例怎么等都等不到想要的元素。正确做法是用conftest.py和fixture来统一管理浏览器实例。conftest.py是pytest的固定文件pytest会自动加载它不需要手动import。放在项目根目录的conftest.py影响所有子目录下的测试用例所以很适合放全局的浏览器驱动管理。fixture的作用域有四档session、module、class、function。对于UI自动化来说最常纠结的就是“整个测试阶段只开一个浏览器”还是“每条用例都新开浏览器”。我的建议很简单初期老老实实每条用例独立浏览器也就是function作用域。这样做虽然慢一点但每条用例的起点都是干净的不存在上一个页面的残留。等用例稳定了如果跑批时间太长再考虑按module或者session复用。一个典型的浏览器fixture长这样import pytest from common.driver_factory import create_driver pytest.fixture() def driver(): drv create_driver() yield drv drv.quit()用yield而不是return是为了保证用例跑完之后无论断言成功还是失败后面的drv.quit()都会执行。这一点很重要。很多真实的批量失败案例都是因为某个用例异常退出浏览器进程没有关掉最后把整个CI环境的内存吃满。fixture加上yield之后清理逻辑放在yield之后pytest会保证teardown阶段一定执行相当于给用例加了兜底。3. 用例依赖与数据污染批量执行最容易翻车的地方如果你已经把目录和fixture理顺了批量跑仍然会挂那么十有八九是栽在依赖和数据这两个坑里。这两个坑有一个共同特点单条跑完全不显现批量跑必定暴露而且暴露的方式很难看。先说结论批量跑之前要把所有用例之间的隐式依赖全部斩断批量跑之后要让所有测试数据都能被重复生成、重复使用、可清理。3.1 用例之间的隐式依赖是批量翻车的第一源头最常见的隐式依赖就是登录态。很多人写自动化用例的时候会先写一条test_login用例接下来的test_add_cart、test_add_address、test_checkout都假设“test_login已经跑过了所以我已经登录了”。这个假设在单条跑的时候不成立因为你单独跑test_add_cart时压根没有登录在批量跑的时候也不可靠因为执行顺序是按文件名和函数名的字母序来的test_login未必排在最前面而且就算排在最前面前面还有别的用例可能把登录态冲掉。真正可靠的方案是把登录当成前置条件而不是一条用例。如果你用的是pytest就把登录动作写进fixture里让那些需要登录态的用例把它们拉进来。比如pytest.fixture() def logged_in(driver): driver.get(https://.../login) driver.find_element(...).send_keys(user01) driver.find_element(...).send_keys(123456) driver.find_element(...).click() return driver然后test_add_cart的入参是logged_in而不是直接操作浏览器。这样无论这条用例排在批量任务的第几个位置、前面跑过什么用例它都能自行完成登录不依赖其他用例的“接力”。这个改造做完登录用例本身当然还可以留着但它的定位从“被依赖的前置用例”变成了“验证登录功能的独立用例”两条线互不干扰批量跑的稳定性立刻上一个台阶。除了登录态还有一类隐式依赖是公共数据被修改。比如某个用例把系统里的商品价格写死了断言“商品单价是100元”前面某条用例通过后台接口改了价格变成120元这条用例就挂了。这种依赖很难靠执行顺序规避最根本的做法是用例只依赖自己创建的测试数据不依赖公共库里的存量数据。3.2 数据污染重复跑一次就挂十有八九是它电商项目的用例最喜欢造数据比如注册账号、新建订单、添加收货地址。这类用例第一次跑的时候一切正常第二次跑就开始失败错误往往是“该用户名已存在”“地址数量已达上限”“订单编号重复”。这就是数据污染。我整理过三种清理思路按成本从低到高排列。第一种是运行时数据唯一化这是最简单也最推荐的方式。在创建数据时加上时间戳或者随机数比如用户名用user_20250321_001、手机号用1380000加随机四位这样每次跑批都在创建新数据永远不会冲突。缺点是会产生大量累积数据需要定期清理。第二种是用接口清理测试结束后调用删除接口把刚创建的数据删掉。这种方法最干净但前提是被测项目提供删除接口很多电商项目并不开放前端删除入口只能走数据库。第三种是用数据库直清批量跑之前直接执行SQL把所有以test_开头的账号、以auto_开头的订单删掉。这方法效率高但DBA权限、测试环境隔离这些前置条件不是每个团队都具备。在实践中最实用的组合是“唯一化为主数据库清理为辅”。每次批量跑之前先用SQL清一遍上次残留的测试数据跑批过程中用例自身创建的数据全部带上随机标识。这样既不会因为残留数据导致二次执行失败也不会因为清理逻辑太复杂把用例拖垮。3.3 用例失败时也必须保证环境可复位批量跑和单条跑还有一个很大的区别单条跑失败了你可以当场看到页面状态、手动介入批量跑不会停下来等你几十条用例不管前面挂没挂都会继续往后执行。这时候最怕出现一种情况前面的用例挂到一半把系统状态改乱了后面的用例全部跟着遭殃。解决思路是在用例设计时就把“失败路径”考虑进去。不要在用例里写死“如果第一个断言失败就return”而是要让fixture的清理逻辑无论用例是否成功都能执行。前面提到yield之后写清理逻辑就是干这件事的。如果某些用例涉及多步操作最好在finally块里做状态复原比如删除临时创建的测试商品、把开关拨回原值、退出当前账号等。另外要养成一个习惯批量跑不要求每条用例的断言数量越多越好而是要求“一条用例只验证一件事”。如果一条用例同时断言了价格、库存、优惠券、运费计算它一旦在前半段挂了后半段的断言永远执行不到你无法知道后半段的逻辑是否是好的。把用例拆分得更细批量跑失败后定位问题的成本会低很多。4. pytest批跑实操参数化、并发与报告输出前面的章节都在讲“用例体质”这一节回到纯粹的执行层面。批量运行测试用例可以用unittest跑但我在这个商城项目里用的是pytest方案主要原因有两条一是pytest对断言的处理更友好直接用Python原生assert就能给出清晰的失败信息二是pytest有丰富的生态参数化、失败重跑、HTML报告、并发执行都有成熟插件不需要自己造轮子。下面这些内容都是我实际踩过一遍之后留下的精简配置照着用基本不会走弯路。4.1 一条命令把批跑用起来参数与配置pytest的命令行参数不需要全记我最常用的就几个参数作用使用场景-v显示详细用例名想看每条用例是否执行-s允许print输出调试时看页面日志--tbshort缩短异常堆栈批量失败时避免刷屏--maxfail5挂到第5条就停止快速验证阶段-k cart or order按名称筛选执行只跑购物车和订单相关模块-m smoke按标记筛选执行只跑冒烟用例--htmlreport.html输出HTML报告批跑结果归档分享我一般会在pytest.ini里把默认参数写进addopts这样本地跑和CI跑用同一个入口行为一致。上面给的pytest.ini配置里已经带了-v -s和HTML报告参数跑批时直接输入pytest即可。如果你的用例比较多希望把输出信息控制得干净一点可以关掉浏览器里无用的日志。浏览器驱动默认会输出很多底层日志混在pytest结果里很容易把真正的失败原因淹没。我的做法是把浏览器日志级别调高只输出错误级别的日志这样批量跑的输出里只保留每一条用例的结果和失败时的关键信息。批跑过程中报告文件名最好带上时间戳比如report_20250321_1530.html这样可以保留每次运行的历史记录。做法很简单在pytest.ini里写死文件名的话每次都会被覆盖我通常会在执行命令前用脚本生成带时间戳的文件名再通过--html参数传进去。如果是纯手动运行直接在命令行里写pytest --htmlreports/report_$(date %Y%m%d_%H%M%S).html --self-contained-html4.2 参数化同一个流程在多个数据下批量验证UI自动化的批量运行除了把不同用例集合起来跑还有一个常见需求是“同一条用例多组数据批量验证”。比如登录功能你想分别验证正确账号、错误密码、不存在账号、空密码这四种情况。如果不做参数化就得复制四份几乎一样的用例做了参数化一份用例函数挂多组数据pytest会把它当成多条独立用例来收集和统计。pytest.mark.parametrize(username,password,expected_msg, [ (user01, 123456, 登录成功), (user01, wrong, 用户名或密码错误), (no_such_user, 123456, 用户不存在), ]) def test_login(driver, username, password, expected_msg): login_page LoginPage(driver) login_page.open() login_page.login(username, password) assert expected_msg in login_page.get_result_text()批量跑的时候pytest会把这个函数展开成三条独立用例每条失败互不影响。报告里可以看到具体是哪一组数据出了问题不需要额外写循环。这种做法对数据驱动的好处很明显但我有一个提醒参数化用例的失败重跑会放大执行时间。如果一个用例挂了重跑时是把整组参数化的数据都重跑一遍而不是只重跑失败的那一组。所以在并发和重跑配置里要考虑到这个放大效应。4.3 并发执行UI自动化的并发门槛比接口高得多很多人看到批量跑几十条用例太慢第一反应就是上pytest-xdist开多进程并发执行。这个方向本身没错但UI自动化并发和接口测试并发是完全两回事。接口测试的并发只需要考虑请求资源和数据隔离UI自动化的并发意味着同时开多个浏览器实例每一实例都要吃CPU和内存。如果机器配置不够并发开起来之后出现最多的不是测试失败而是浏览器启动超时、页面加载卡死、驱动连接报错。我的建议是分两步走。第一步先老老实实串行跑把用例本身的稳定性和执行时间调到一个合理水平第二步如果确实需要压缩时间再开并发但并发数从2起步不要直接上8或16。并发时还要特别注意浏览器的profile目录隔离多个浏览器实例如果共用同一个用户数据目录会出现串登录态的诡异现象。我曾见过一个并发跑批两个用例同时操作购物车结果互相覆盖了对方的数据最后断言的时候一个成功一个失败问题完全随机复现。后来把每个并发进程的浏览器profile目录变成独立临时目录问题才消失。并发跑批的报告也会出现另一个问题默认的HTML报告在并发模式下会丢失一部分用例的截图和错误信息。这是pytest-xdist和pytest-html配合时的老问题因为多个进程各自生成报告片段最后合并时经常对不齐。如果你对报告的完整性要求很高建议在并发模式下用allure这样的报告方案或者干脆让每个进程生成独立报告再用脚本合并。这部分属于进阶操作等串行跑稳定了再研究不迟。5. 批量失败不是白失败重跑机制与日志定位批量跑引入了随机性就必然带来“偶发失败”。一条用例这次跑过了下次跑挂了第三次又过了这种用例最磨人。很多人的第一反应是给它加重跑让它挂的时候自动再来一遍第二反应是怀疑代码写错了改来改去把稳定用例改成更不稳定的。这一节我想聊的是怎么客观地处理偶发失败以及如何让一次批量运行的失败信息尽可能完整便于定位。5.1 用例偶发失败先别急着改代码重跑只是观察手段pytest-rerunfailures插件提供失败重跑能力用法是在命令行加--reruns 2 --reruns-delay 1表示失败后等待1秒再重跑最多重跑2次。加入重跑之后很多偶发失败会自动被消化掉报告最终显示通过。这个机制在验证环境和网络抖动比较多的场景下是很有用的但我必须说清楚重跑不是解决问题的办法它只是帮你把“真失败”和“假失败”分开的手段。如果一个用例加入重跑后依然偶尔失败或者重跑之后明明过了但下一次批量跑又失败那就不能再用“环境抖动”来解释了。我判断一条用例是否属于真实不稳定有三个标准第一失败时的断言信息不稳定有时报元素找不到有时报文本不匹配有时报超时没有一个固定的失败点第二手动按用例步骤操作完全正常第三失败用例在批量跑中的分布是随机的不固定出现在某条用例之后。如果三条都中那这条用例不是被测系统的问题而是用例自身的等待策略或元素定位方式不够健壮。常见的假失败根源是隐式等待用多了。很多初学者在启动浏览器时加一句“设置全局隐式等待10秒”以为这样就能解决加载慢的问题。但对隐藏元素的判断、对页面渲染完成的等待隐式等待根本帮不上忙反而会让用例在“元素存在但不可点击”的时候快速返回异常。正确做法是显式等待配合Expected Conditions比如等待某个按钮变得可点击、等待某个文本出现。批量跑的时候网络负载和页面加载时间波动更大显式等待的容错能力比隐式等待强很多。5.2 失败证据链日志、截图、报告要能对上批量跑几十条用例如果只是控制台里输出FAILED没有日志、没有截图、没有当时的页面状态定位问题的成本会非常高。你只能凭记忆复现当时的操作步骤还得祈祷它不是偶现问题。所以我在项目里一定要做两件事统一日志和失败自动截图。统一日志用Python的logging模块在conftest.py里配置一个RotatingFileHandler把所有用例的关键步骤写入文件。每条用例开始和结束时打印用例名和结果中间的关键操作打印“点击了XX按钮”“跳转到XX页面”“当前URL是XX”。别小看这些看似啰嗦的日志批量跑完之后它们是你还原现场的主要依据。截图更简单但要做到“失败自动截”而不是每条用例手动写截图代码。pytest提供了一个钩子pytest_runtest_makereport可以在用例执行结束后拿到结果我借助它自动截图pytest.hookimpl(hookwrapperTrue) def pytest_runtest_makereport(item, call): outcome yield report outcome.get_result() if report.when call and report.failed: driver item.funcargs.get(driver) if driver: driver.save_screenshot(freports/{item.name}_{time.time()}.png)这段代码的核心逻辑是只有当用例执行阶段失败时才截图截图的文件名包含用例名和时间戳这样就能和报告里的失败用例一一对应。截图保存路径最好和HTML报告在同一个目录下方便一起打包归档。实测下来这个钩子对一条用例里有多步操作的情况也能用因为report.whencall对应的是函数执行阶段不是setup和teardown阶段不会误截到环境准备时的页面。5.3 从批量结果里快速锁定问题模块批量跑完面对几十条失败用例不要一条一条去翻而是先做分类统计。我一般按两个维度看第一个维度是按模块分看是登录、购物车、订单、支付哪个模块失败最多。如果一个模块的失败率明显高于其他模块优先怀疑这个模块自身出了问题比如页面改版、元素重命名、接口字段变化。第二个维度是按错误类型分看失败原因是元素定位失败、超时、还是断言文本不一致。元素定位失败和超时大概率是等待问题或页面结构变化断言文本不一致则更可能是功能逻辑真的变了。按错误类型聚合之后还有一个优先级排序凡是和登录态、公共配置、全局数据相关的失败不管失败数量多少都要最先处理。因为这类失败往往会导致后续一大片用例跟着挂是“真凶”和“受害者”的关系。先把真凶找出来修掉受害者通常不需要改动自然就会恢复。如果你的用例已经加了标记比如pytest.mark.smoke、pytest.mark.order那么批量跑的结果还可以直接用marker做分组统计。这样在报告里可以快速区分冒烟用例和全量用例的通过率给别人看结果的时候也更直观。标记的名字要控制在常用的几个不要造太多语义重叠的标记否则维护成本很高。6. 从本地批跑到CI批跑稳定性门槛再次提高本地批量跑通之后很多人会想把它接到持续集成平台里定时执行。这个方向非常值得做但UI自动化在CI环境里的表现和本地会有明显差异。如果不提前处理好你会看到一个奇怪的结论本地跑总是绿的CI里总是红的而且CI里的报错截图看起来页面样式也是正常的。6.1 无头模式与显示环境差异CI环境通常没有物理显示器浏览器只能以无头方式运行。无头模式下页面渲染行为大多数情况下与有头模式一致但仍有几类问题需要特别注意。第一是分辨率无头浏览器的默认窗口尺寸往往与本地显示器不同一些依赖1024或1080宽度布局的页面元素位置会发生变化导致用坐标点击或者按位置断言的用例失败。第二是缩放比例如果CI环境的系统缩放设置与本地不一致CSS像素的实际渲染大小会不同元素出现遮挡的概率变大。第三是字体本地可能装了特殊字体CI环境没有页面上某些文案的换行位置不同如果你的断言依赖精确的文本内容就会偶发失败。解决办法是在启动浏览器时显式设置窗口大小并且固定为一个接近主流分辨率的数值比如1920x1080。同时在页面操作中优先使用元素的稳定定位方式而不是依赖坐标或位置关系。如果页面上有使用rem或vw单位的布局在无头模式下最好把窗口大小固定死避免因窗口尺寸不同导致布局漂移。6.2 定时调度和失败通知让批量跑的结果真正被看到接进CI之后批量跑的结果如果没有被及时看到那自动化就退化成了一种“每天都在跑但又没人看”的自嗨。我见过的做法是持续集成平台里配置定时任务每天凌晨跑一次全量回归结果通过与否都推送一条通知到工作群通知内容包含HTML报告链接、失败用例列表、以及和上一次运行的通过率对比。失败率一旦出现明显波动测试人员就需要立刻介入。推送消息不要只写“构建失败”四个字那等于什么都没说。更好的模板是这次跑了多少条、通过多少、失败多少、失败用例前五条的名字和失败断言原文。有了这几位信息目标人员不需要打开报告就能大致判断问题方向。报告链接也很有必要但要注意报告的保存策略建议只保留最近七天的报告避免磁盘空间被历史报告慢慢占满。从本地批跑到CI批跑之间还有一个可以简化但未必被注意到的点命令行入口要保持一致。不要在本地跑时用一套参数在CI里又用另一套参数。把公共参数固化到pytest.ini里只在命令行里追加与运行环境相关的参数比如无头模式开关、报告文件名、并发数。这样无论是谁、在哪个环境执行同一批用例的差别都可以被控制到最小定位问题的时候也不会出现“本地能过所以代码没问题”的扯皮。我在实际使用中还有一个体会如果你刚把用例接入CI建议先不要设置失败重跑让所有偶发问题都暴露出来连续观察一周把出现频率高的不稳定用例全部修掉再加重跑。否则重跑会把某些问题的真实频率掩盖掉你可能连续几周都以为系统很稳实际上某些用例每两天就失败一次。先修一轮稳定性的底子再加豁免机制这个顺序很重要。批量运行测试用例这件事走到CI定时跑这一步基本上就完成了一个闭环。从单条用例的调试到几十条用例的批量执行再到无人值守的定时回归每一步的复杂度都在上升但对用例设计的要求也越来越明确独立、稳定、可观测。如果你也刚把这套商城项目的用例批量跑起来建议先别急着追求并发和报告花活把依赖、数据、等待这三件事做扎实全量回归自然会从“玄学变绿”变成“稳定变绿”。

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

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

免费获取报价 →
↑