ARTICLE DETAIL

资讯详情

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

自动化测试落地指南:框架搭建与许可证排障实战

自动化测试落地指南:框架搭建与许可证排障实战 前阵子我们组做回归测试自动化改造眼看要交付了结果一打开测试执行机屏幕上弹出一行熟悉的字automation license manager service has not been started! please start。老测试人看到这行字都懂许可证服务又掉了连工具都打不开更别说跑用例。排完这个坑接着又是一堆环境问题那几天我几乎把自动化测试从框架到工具到许可证管理全过了一遍。今天这篇就把我这几年做自动化测试的积累整理出来聊聊自动化测试到底怎么落地、框架怎么搭才不翻车、商业工具许可证那点破事怎么排以及那些常规文档里不会写的经验教训。适合正在做自动化选型、或者已经上手但总被环境和稳定性问题困扰的测试开发同学看完能少走不少弯路。1. 自动化测试的价值在哪里为什么大家都往这个方向卷1.1 手工回归的效率账怎么算先算一笔账。我们项目每到发版节点核心回归用例差不多400多条手工跑一遍要两个测试同学忙活整整两天而且每次发版都要重跑一遍。2019年我统计过一次光回归测试一年就烧掉了将近40个人天这还不算反复执行时漏测导致的线上问题返工成本。后来我们做了自动化改造同样这400多条用例接口层自动化大约25分钟跑完UI自动化配上并行执行大概40分钟出结果。从两天缩到40分钟是什么概念就是每天下班前都能全量回归一遍第二天早上看报告就行。这个效率提升不是优化两个字能概括的是把测试从发版前的瓶颈变成了日常开发的一部分。当然自动化也不是银弹。如果你的项目还处于原型阶段页面一周改三遍或者测试对象是一个没有稳定环境的临时活动页这时候强上自动化纯属给自己找麻烦。自动化的前提是业务逻辑相对稳定、迭代节奏固定否则你维护脚本的成本会远超手工测试的成本这是很多人踩的第一个坑。1.2 自动化适合什么场景分清层级再动手我见过不少团队一上来就怼UI自动化把全部希望押在GUI层结果脆弱得一塌糊涂。其实自动化测试的正确姿势是分层做从底到顶依次是单元测试、接口测试、UI测试。单元测试由开发同学在代码层面覆盖跑得最快能抓到底层逻辑问题接口测试是我们测试同学的主战场覆盖业务逻辑的百分之七八十都不夸张稳定性也高UI自动化最适合的是核心主流程的冒烟回归数量不用多精就行。用个生活化类比单元测试相当于检查发动机每个零件接口测试相当于点火试车UI自动化相当于整车路试。你不会每天把整车拆了做全面路试但每天点火跑一圈是应该的。我见过一个比较极端的案例某团队非要把60个UI用例全跑在CI里每次构建完跑两小时天天报红后来逐步梳理成15个高价值用例加55个接口用例总时长砍半稳定性反而上去了。这就是选对战场的意义。1.3 自动化落地后的长期收益从长期看自动化带来的收益不只是省人力更重要的是改变了团队的开发节奏。有了自动化回归兜底开发同学改代码的心理负担小很多不用天天跑来问这个改动会不会影响支付流程。质量门禁也变成了实实在在的卡点——核心用例没跑过就不允许合入这个规则比任何口头约定都有效。还有一个容易被忽略的收益是测试资产的沉淀。手工测试的经验在人员离职后基本就带走了但自动化用例是留在代码仓库里的资产。新同学接手项目看一遍自动化用例基本就知道核心业务长什么样、有哪些边界场景入职上手速度会快很多。2. 框架怎么选怎么搭从零到一的设计思路2.1 选型先想清楚技术栈和团队能力框架选型这事很多团队第一个动作就是看哪个工具火、哪个社区活跃然后上了再说。我的建议是反过来先看团队里谁在维护、大家熟什么语言、被测系统的技术栈是什么。如果被测系统是Web应用团队Java背景多那我建议直接考虑Selenium WebDriver加TestNG/JUnit或者走Playwright也行Python背景就Pytest配Selenium/Playwright都很稳。移动端则绕不开Appium生态成熟坑也相对可控。接口自动化是我个人最推荐的切入点Java用Rest AssuredPython用Requests加Pytest上手成本低价值立竿见影。这里有个优化选项值得说明如果你所在的企业已经买了商业自动化工具比如某知名UI测试工具那就不必自己从Selenium裸写直接用它的对象库和录制回放能力起步后续再逐步过渡到脚本化编写。商业工具和开源框架不是非此即彼可以混着用关键看投入产出比。2.2 分层设计Page Object是底线别把代码焊死在用例里我们早期犯过一个严重的错误每个测试用例里直接写元素定位和操作细节。比如登录用例里写着driver.findElement(By.id(username)).sendKeys(test)。刚写的时候很爽三个月后页面改版username改成account好家伙全项目300多个用例里100多处引用改到怀疑人生。后来老老实实引入Page Object模式把每个页面封装成一个类元素定位和页面操作都收拢在那里用例层只描述业务动作public class LoginPage { private WebDriver driver; private By usernameInput By.id(username); private By passwordInput By.id(password); private By loginButton By.id(loginBtn); public LoginPage(WebDriver driver) { this.driver driver; } public void login(String username, String password) { driver.findElement(usernameInput).sendKeys(username); driver.findElement(passwordInput).sendKeys(password); driver.findElement(loginButton).click(); } }页面改版时只需要改这个类里的定位器用例层一行不用动。这个原则对于任何自动化框架都适用不管你是用Selenium、Playwright还是商业工具把页面细节和业务操作解耦都是底线。2.3 数据驱动与关键字驱动别把框架做复杂我见过不少团队把框架设计得像微服务架构一样复杂又是配置文件又是Excel用例又是关键字引擎结果真正用起来的时候写一条用例要配三个地方维护成本直接爆炸。我的经验是数据驱动做轻量级就够了。核心思路是把测试数据从用例代码里剥出来通过参数化传入。Pytest里用装饰器TestNG里用DataProvider本质都一样。现在很多新框架把数据驱动和内建参数化机制都做得很好用了真没必要自己造轮子。对于业务人员参与自动化的情况关键字驱动才有意义——让不懂代码的人通过填表格维护用例。但如果团队都是全职测试开发关键字驱动就是给自己加戏。记住一句话框架的复杂度应该由团队的平均水平决定而不是由某个架构师的偏好决定。2.4 稳定性工程等待策略、重试机制和日志体系UI自动化最大的敌人不是功能bug而是测试本身的不稳定。定位不到元素、弹窗乱入、网络抖动任何一个都能让用例变成小红旗。这里我分享几个经过实战验证的做法。等待策略一定要用显式等待不要上来就Thread.sleep(3000)。显式等待是按条件轮询比如等待某个元素可点击、等待某个文本出现。Thread.sleep是死等环境好的时候浪费3秒环境差的时候3秒不够照样失败。用显式等待的代码大概是这样的from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait WebDriverWait(driver, 20) login_button wait.until( EC.element_to_be_clickable((By.ID, loginBtn)) ) login_button.click()重试机制也建议在框架层面内置。有些用例偶发失败重跑一次就过了这类flaky test不能直接忽略但也别每次都让构建爆红。我们的实践是框架内置两级重试失败后自动截图保存现场然后重试1次重试仍失败才判定失败并保留第一次失败原因和第二次失败原因的对比日志。这样既避免了偶发因素干扰又不会放过真实问题。日志体系同样重要。每次执行都要保留完整的时间线什么时间点执行了哪一步、页面标题是什么、URL是什么、截图是什么。排查问题的时候没有日志全靠猜有了日志五分钟定位。3. 商业工具选型与许可证管理别让license卡住进度3.1 为什么还需要商业工具开源时代很多人觉得商业自动化工具是智商税我一度也这么想。后来在大型企业项目里待过才发现商业工具在某些场景下确实有不可替代的价值最典型的就是技术栈复杂的老系统——比如基于桌面客户端或者混合架构的应用开源工具支持得很痛苦商业工具直接给你封装好了。商业工具的另一个优势是技术支持。遇到诡异的问题提个工单官方响应比你在开源社区发帖等回复快得多。还有一个点是合规和审计金融、政企项目对测试工具的License和资产管理有严格要求商业工具在这块比开源工具清晰得多。3.2 License Manager Service到底是什么这里就不得不聊到开头那个报错automation license manager service has not been started! please start。这几乎是所有商业自动化工具用户的噩梦尤其是企业版浮动许可证模式。它的原理你可以理解成图书馆的借书系统。工具厂商并不是把许可证绑定到某台电脑而是架设一个统一的借书台——License Server所有测试执行机启动工具时都来借书用完再还回去。这样做的好处是许可证可以动态分配团队不需要给每台电脑买一个永久许可证成本低很多。而这个借书台的前台接待员就是License Manager Service。测试执行机上的自动化工具要想获取许可证必须先保证这个服务在运行。它没启动工具就报错表现就是你点开工具闪退或者弹窗提示。我们团队实际遇到过一个问题License Server返回合理执行机报错却一致指向service未启动。折腾一下午才明白是执行机的杀毒软件把许可服务的进程拦了服务根本没起来。这个排查路径比较典型值得专门说一下。3.3 完整排查报错出现后我做了什么先说最常见的场景工具装在独立测试执行机上报错信息是automation license manager service has not been started! please start。我按这个步骤来第一步确认服务状态。按WinR打开运行框输入services.msc在服务列表里找到对应的许可证服务名称关键词一般带License或者Manager查看状态是否为正在运行。如果没有运行右键启动然后重新打开自动化工具。第二步确认服务账号权限。服务可能显示正在运行但工具还是连不上这时候要检查服务的登录身份。如果服务用的账号没有网络权限或者密码过期了服务能起来但无法正常通信。右键服务属性登录选项卡改成本地系统账户或者一个权限足够的域账户重启服务。第三步确认License Server地址可达。执行机需要能通过网络访问到License Server的端口。在命令行里执行telnet your-license-server-ip 27000端口能通就没问题通不了就要查防火墙、路由器或者服务器配置。这一步看着简单但不少人卡在这里。曾经有个同事排了一天最后发现是服务器换了IP执行机上配置的地址还是旧的。第四步确认许可证没有超卖。服务端可能显示服务正常运行但团队许可证总数只有10个现在有10台机器同时占着第11台机器怎么都连不上。这种问题在服务端日志里会有明确记录看日志找all licenses are in use之类的提示就行。把这个排查思路整理成一个表格贴在团队Wiki里后来新同学遇到同类问题基本都能自己解决。症状可能原因排查动作报错service has not been started服务未启动services.msc里找到服务并启动服务已启动但工具仍连不上服务账号权限不足检查服务登录身份改为本地系统账号服务正常但网络超时License Server地址不可达telnet测试端口检查防火墙能连接但拿不到license许可数量已被占满查看服务端日志确认是否有超卖昨天好用今天突然报错机器重启后服务未自启服务设为自动启动或设置开机启动脚本3.4 License规划的两个实操建议经历过几次许可证事故之后我总结出两条建议配置License服务时直接抄作业就行。第一条是服务必须设为自启动而且建议做进程守护。很多License服务默认是手动启动机器一重启就罢工。你在计划任务里加一个开机脚本检测到服务没起来就自动启动或者在服务属性里把启动类型改为自动。别小看这一步我见过太多周一早上大家同时发现工具打不开的场面就是因为服务器周末重启过。第二条是许可证使用情况要定期监控。License服务端的日志文件别让它无限增长配置好日志轮转同时挂一个简单的监控脚本定期检查可用许可证数低于阈值就告警。这样不会等大家都被卡住了才反应过来。4. 自动化测试落地中的常见问题与排查技巧实录4.1 元素定位失败率高先看是不是动态渲染UI自动化用例中最常见的失败原因就是元素定位不到。排查的时候第一件事不是看定位器写没写对而是看页面是怎么渲染的——是同步渲染还是异步渲染。现代前端框架大概率是异步渲染。页面打开时先加载HTML骨架数据从接口返回后再动态填充。如果你定位的瞬间元素还没渲染出来那不管定位器写得多精确都找不到。这种场景的解决办法就是显式等待等待目标元素出现再操作之前已经讲过了。还有一种坑是动态ID。有些前端框架每次刷新页面都会重新生成随机ID比如btn-8f3a2c下次刷新变成btn-4d7e11。这种定位器写在代码里跑一次过跑第二次就挂。解决思路是优先用稳定的属性定位比如name、data-testid或者用相对XPath通过层级关系定位。强调一下给测试元素加上稳定的>
返回列表