ARTICLE DETAIL

资讯详情

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

软件测试自动化学习路线与实战:从接口到UI测试一站式掌握

软件测试自动化学习路线与实战:从接口到UI测试一站式掌握 做软件测试这行谁没被从入门到就业到底要学什么、学到什么程度这个问题卡过呢。网上教程一大堆但要么是零散的知识点要么是纯理论看不到落地场景学完还是不会写用例、不懂怎么提Bug、更不知道怎么把一个接口或者UI自动化跑起来。我整理这份教程时想的不是给你堆一堆名词而是把我自己从功能测试转到自动化测试这条路上踩过的坑、验证过的路径、实际工作中真正用得上的一套东西梳理出来。里面有学习路线、核心工具、实战项目和面试要点希望能帮你省下自己瞎摸索的那半年时间。1. 先想清楚自动化测试到底在解决什么问题很多人一上来就学Selenium、学Postman、学Appium问他想做什么回答是大家都在学。但如果你不清楚自动化测试在整个软件研发流程里的位置学再多工具面试和工作中也会露馅。1.1 软件测试的职能边界软件测试不是点点点那么简单它是在给定的时间、成本和质量约束下尽可能发现产品缺陷、评估产品质量、推动缺陷修复的工程活动。测试人员的核心产出不是测了多少个功能点而是对产品质量是否有足够信心。自动化测试则是把原本需要人工反复执行的验证步骤通过代码和工具固化下来让机器替人跑重复劳动。它的价值主要体现在三个方面回归测试发版前把核心功能快速跑一遍防止新代码改坏老功能。大数据量测试比如准备上千条订单数据人工点一天也点不完脚本几分钟搞定。持续集成/持续交付代码提交后自动触发测试保证合入分支的代码基本可用。所以你会看到凡是自动化测试做得好的团队测试人员的能力模型一定包含三块业务理解能力、代码能力和测试设计能力。只懂工具不懂业务写出的脚本就是空中楼阁只懂业务不会代码自动化就落不了地。1.2 自动化测试常见的四个分类分类典型工具/框架主要验证目标学习难度单元测试Pytest、Unittest函数、方法、模块级逻辑正确性中接口测试Pytest Requests、Postman系统间/前后端数据交互低-中UI自动化Selenium、Playwright、Appium用户界面操作流程、回归中-高性能测试JMeter、Locust系统承载能力、稳定性高从实际的招聘需求看接口自动化是性价比最高的切入点。原因很简单接口层比UI层稳定得多改动频率低测试脚本维护成本低而且业务几乎都压在接口上。学完Python语法和Requests库基本就能上手。1.3 什么样的团队/项目适合做自动化记住一句话不是所有项目都适合自动化。判断标准有三个需求相对稳定不会每周推倒重来。产品生命周期长值得付出脚本开发和维护成本。回归频次高人工重复劳动量大。如果一个项目三周后就下线需求还在不停改强行上自动化只会让自己沦为脚本维护工。面试时候问项目适不适合做自动化能说出这一层思考绝对加分。2. 学习路线循序渐进还是学完就忘关键在阶段划分我见过太多人死磕Python语法看了两周还停在变量、循环原因不是笨而是没有项目驱动。学习路线的本质是目标倒推你想做接口自动化就从requestsunittest入手想做UI自动化就从Selenium入手。一切语法学习为实战服务。2.1 自学阶段的核心里程碑第一阶段2-3周Python基础入门。只学四样东西就够起步——数据类型尤其字符串、列表、字典、流程控制if/for/while、函数定义与调用、文件读写。学完配合小练习比如写一个登录接口的请求脚本从文件里读用户名密码。第二阶段2-3周接口测试工具与代码结合。先用Postman把请求调通、看响应结构再用Python的requests库把同样请求写进代码最后用unittest或pytest组织用例。这是自动化测试最重要的一个过渡从手动调接口到写代码自动调。第三阶段3-4周自动化框架体系。学Pytest的fixture机制、数据驱动ddt或pytest参数化、allure报告、日志收集、配置文件读取。这阶段的目标是让你写的脚本可维护、可扩展。第四阶段2周UI自动化基础。学Selenium的八大定位方式、等待机制显式/隐式、常用操作封装、PageObject模式。UI自动化是面试高频话题但工作里不会是唯一重点。第五阶段贯穿全程测试基础设施。Git管理代码、MySQL基本操作、Linux常用命令、Docker基础。这些不会单独成为面试题但几乎每个公司的环境里都会用到。2.2 常用工具链速览用途工具说人话的解释开发语言Python 3.8语法简单最适合测试脚本接口测试Requests Pytest发HTTP请求断言返回结果抓包分析Charles / Fiddler看App或网页到底发了什么请求UI浏览器自动化Selenium / Playwright模拟真实用户操作浏览器移动端自动化Appium操作iOS/Android上的App持续集成Jenkins代码提交后自动运行测试任务代码管理Git多人协作、版本回退测试数据MySQL验证数据正确性、准备测试数据接口文档Swagger / Apifox快速查看接口入参和出参我建议工具不要贪多每个方向挑一个用到极致。比如接口方向Requests 会用了就暂时不用研究 grep 和 curl 的花式玩法UI方向Selenium 的稳定性调明白了再考虑要不要换 Playwright。2.3 为什么不要死记命令和API很多初学者最大的痛苦是背不住API。其实任何工具的API你只需要记住最常用的20%剩下的查文档就行了。真正的功夫在三个方面定位问题的思路报错了是请求参数问题、环境问题、还是断言逻辑问题框架设计的思维怎么封装公共方法让测试代码不重复业务场景的抽象怎么把一个用户的真实操作转化为可以验证的用例步骤这三样能力恰恰靠做完项目去复盘获得而不是靠看视频获得。3. 环境从零搭建VMware、MySQL、Git等十大工具的落地细节不管你是Windows还是Mac下面这套环境清单是绝大多数测试岗位入职后必须跑通的。我不会只告诉你去官网下载而是把最容易翻车的细节标出来。3.1 虚拟机与基础工具VMware安装与使用Windows上做测试经常需要Linux服务器环境你会遇到代码在我电脑上好好的到服务器上就报错的问题。这时候本机装个VMware再装一个Ubuntu虚拟机能解决你90%的环境隔离需求。安装时有几个坑需要注意最新版VMware可能需要BIOS开启虚拟化支持否则装完系统启动一直黑屏。虚拟内存大小如果物理机内存是16G给虚拟机分配4G比较合理太少会卡。Ubuntu安装完成后建议立刻装好VMware Tools或open-vm-tools否则屏幕分辨率不对、无法共享粘贴板。Pycharm VSCode写Python首选PyCharm社区版日常阅读和轻量编辑用VSCode。Pycharm里的Python解释器配置是个高频坑安装完Python后记得在Settings里把Project Interpreter指到python.exe所在路径否则模块装了一堆代码还是标红。3.2 Python环境的正确打开方式先装Python再装PyCharm这个顺序别反。Python安装时有一个极其关键的勾选项Add Python to PATH。忘了勾的话cmd里执行python会提示不是内部或外部命令之后还得手动去加环境变量很折腾。装完Python之后强烈建议用虚拟环境工具来管理第三方库。命令很简单# 创建虚拟环境 python -m venv venv # 激活环境Windows venv\Scripts\activate # 激活环境Mac/Linux source venv/bin/activate为什么要用虚拟环境因为每个项目的依赖版本可能不一样。项目A要用requests 2.25项目B要用Requests 2.31装在全局环境里会你争我抢虚拟环境可以做到项目间的依赖隔离。Pycharm新建项目时默认会帮你在项目目录里创建venv直接利用起来就好。3.3 Git安装与配置Git的作用不只是把代码传到GitHub更是你自己的后悔药。安装时一路Next即可但装完之后这三行配置必须执行否则提交代码时会提示身份不明git config --global user.name 你的名字 git config --global user.email 你的邮箱 git config --global credential.helper store第三行是让Git记住账号密码省得每次push都输一次。初始化仓库、关联远程地址、提交拉取日常就这五个命令用得最多git init git remote add origin 仓库地址 git add . git commit -m 提交说明 git push -u origin master真正踩坑多的地方是合并冲突。多人协作时改了同一个文件pull的时候会报冲突。解决方式是用编辑器搜索把冲突标记上下的代码人工合并再重新add和commit。这个操作只要独立完成过一次后面就不慌了。3.4 MySQL安装与应用接口测试几乎绕不开MySQL。安装MySQL时最容易出错的是选认证方式新版安装器会让你选Use Legacy Authentication还是Use Strong Password Encryption如果选了后者很多旧版客户端工具连接时会报caching_sha2_password错误。测试人员本机连库选Legacy就好。装完之后你在终端里能用的只是mysql命令行。实际调试数据推荐装一个Navicat或者DBeaver。DBeaver免费开源支持MySQL、PostgreSQL各种数据库基础功能完全够用。做自动化测试时MySQL主要用在两处准备测试数据往orders表里插入一条指定状态的订单。验证测试结果提交订单后查询数据库确认数据落库成功。这两个场景对应的SQL也就SELECT、INSERT、UPDATE、DELETE这四类学到能熟练写条件过滤就够了不用纠结复杂查询优化。3.5 环境装完后的一个保命操作所有工具装完第一件事不是赶紧写代码而是做快照或收藏配置。VMware里给装好的Ubuntu虚拟机打个快照Windows和Mac上把常用的配置文件备份一份。以后系统崩了、环境乱了恢复到快照状态比重装一遍快十倍。4. 接口自动化测试从Postman调试到Pytest封装一条完整链路接口测试是自动化测试的基石也是面试必考题。完整链路包含五个环节分析接口文档 → Postman调试确认 → 编写Python请求 → 断言与数据驱动 → 生成测试报告。4.1 分析接口文档与Postman调通这里拿一个最典型的登录接口举例。假设接口地址为 POST http://你的测试环境/api/login请求体中包含{ username: admin, password: 123456 }后端正常会返回{ code: 0, token: eyJhbGciOiJIUzI1NiIs..., message: login success }先在Postman里新建请求选择POST填写URLBody选raw JSON点击Send。这一步的核心目的是确认接口本身没问题、参数怎么传、返回长什么样。如果你连这个基本请求都调不通先别急着写代码因为问题可能不在代码层而在环境或数据。4.2 用Python代码替代手工调用Postman调通之后用requests库把同样逻辑写成脚本import requests import json url http://你的测试环境/api/login headers {Content-Type: application/json} data { username: admin, password: 123456 } # 发送请求 response requests.post(url, headersheaders, jsondata) # 打印结果 print(response.status_code) print(response.text) # 断言 expect_code 0 actual_code response.json().get(code) assert actual_code expect_code, f登录失败期望code为{expect_code}实际为{actual_code}这段代码已经很接近接口自动化的雏形了。请求、响应、断言三者清清楚楚。4.3 用Pytest组织用例和配置单条脚本容易写但一多就乱。Pytest帮我们解决的是用例怎么组织的问题。import pytest import requests def test_login_success(): 正常登录正确的用户名密码 url http://你的测试环境/api/login headers {Content-Type: application/json} data {username: admin, password: 123456} response requests.post(url, headersheaders, jsondata) assert response.json().get(code) 0 def test_login_wrong_password(): 异常登录密码错误 url http://你的测试环境/api/login headers {Content-Type: application/json} data {username: admin, password: wrong} response requests.post(url, headersheaders, jsondata) assert response.json().get(code) 10001文件命名有讲究测试文件以 test_ 开头比如 test_login.py测试函数以 test_ 开头这样Pytest才能自动发现。命令行运行方式pytest test_login.py -v -s-v 是显示详细结果-s 是打印脚本里的print输出。跑完会看到每个用例的PASS/FAIL状态。4.4 数据驱动用参数化避免代码冗余真实的接口测试用例里登录场景至少有几十种密码错误、用户不存在、账号锁定、验证码错误……如果每一条都写一个函数代码会变得非常臃肿。Pytest的参数化功能就是专门解决这个问题的import pytest import requests url http://你的测试环境/api/login headers {Content-Type: application/json} class TestLogin: pytest.mark.parametrize(username, password, expect_code, [ (admin, 123456, 0), (admin, wrong, 10001), (nonexist, 123456, 10002), (, 123456, 10003) ]) def test_login(self, username, password, expect_code): data {username: username, password: password} response requests.post(url, headersheaders, jsondata) assert response.json().get(code) expect_code这样新增一条用例只需要在列表里加一行参数组测试逻辑完全复用。4.5 数据驱动进阶从Excel/JSON读取用例参数写在代码里还是不够优雅。更常见的公司落地方式是用例数据放在Excel或YAML文件里代码只负责读取数据执行并断言。import pytest import requests import json def load_cases(): with open(login_cases.json, r, encodingutf-8) as f: return json.load(f) pytest.mark.parametrize(case, load_cases()) def test_login_from_json(case): url http://你的测试环境/api/login headers {Content-Type: application/json} data { username: case.get(username), password: case.get(password) } response requests.post(url, headersheaders, jsondata) assert response.json().get(code) case.get(expect_code)JSON文件里就是纯数据[ {username: admin, password: 123456, expect_code: 0}, {username: admin, password: wrong, expect_code: 10001} ]这套打法维护起来非常舒服。测试数据交给不懂代码的同事也能维护你只需要保证代码逻辑稳定即可。5. UI自动化测试Selenium的定位、等待、封装和坑接口测试保证的是逻辑正确UI自动化保证的是用户能顺利操作。Selenium是目前最通用的浏览器自动化方案但很多新手在老项目上跑Selenium脚本时会出现一会过一会不过的玄学问题核心原因多半是没处理好等待和定位方式。5.1 环境准备与浏览器驱动用Selenium操作真实浏览器Chrome需要下载对应的chromedriver。下载驱动的版本必须和浏览器版本匹配这个很坑。比如Chrome 126就要下载126.x的chromedriver版本对不上会报session not created异常。安装Seleniumpip install selenium基础调用from selenium import webdriver from selenium.webdriver.common.by import By driver webdriver.Chrome() driver.get(https://www.example.com/login) driver.find_element(By.ID, username).send_keys(admin) driver.find_element(By.ID, password).send_keys(123456) driver.find_element(By.ID, loginBtn).click() print(driver.title) driver.quit()5.2 定位方式的优先级Selenium提供八大定位方式但实际使用中优先级应该这样排ID页面元素中ID通常是唯一的优先用。name / class_name次选。CSS Selector结构清晰推荐熟练掌握。XPath最灵活但不要一上来就复制浏览器的绝对路径太容易断。link_text / partial_link_text页面上唯一文本链接时可用。记住一个原则定位表达式越短、和页面结构耦合越低维护起来越省心。XPath里使用绝对路径 /html/body/div[1]/div[2]/div[3]/span 这种隔一个迭代页面一改全盘崩溃尽量用相对定位比如 //input[idusername]。5.3 等待机制解决元素找不到的终极方案UI自动化的玄学问题50%以上出在等待上。页面加载有快有慢你脚本执行到找元素这一步时元素还没渲染出来就会报NoSuchElementException。三种等待方式time.sleep(固定秒数)简单粗暴但浪费大量时间。隐式等待driver.implicitly_wait(10)设置一个全局等待时长每次find_element时如果没找到会轮询等待。推荐。显式等待WebDriverWait配合expected_conditions指定某个条件满足后再继续最稳定。工作中最常用的是显式等待特别是点击前等可点击from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, loginBtn)) ) element.click()注意显式等待的写法第一个参数是driver第二个是超时秒数until里传入的是条件而不是元素。5.4 PageObject模式把页面和用例拆开实战项目中UI自动化最忌讳把定位符、操作步骤、断言逻辑全部堆在一个函数里。你想想一个登录页面如果被20条用例使用了页面结构一改你要改多少处PageObject模式的目的就是让每个页面变成一个类页面元素的定位和操作封装在类内部测试用例只关心在这个页面上做什么操作。class LoginPage: def __init__(self, driver): self.driver driver self.username_input (By.ID, username) self.password_input (By.ID, password) self.login_button (By.ID, loginBtn) def input_username(self, text): self.driver.find_element(*self.username_input).send_keys(text) def input_password(self, text): self.driver.find_element(*self.password_input).send_keys(text) def click_login(self): self.driver.find_element(*self.login_button).click() def login(self, username, password): self.input_username(username) self.input_password(password) self.click_login()测试用例会简洁很多def test_login_success(driver): page LoginPage(driver) page.login(admin, 123456) assert 首页 in driver.title这样做的好处是页面变化时只改LoginPage这个类测试用例的代码基本不动。6. 移动端自动化Appium的环境搭建与连真机/模拟器的常见问题Appium是目前移动端自动化测试的主流方案支持iOS和Android并且允许你用Python写测试脚本。这一节重点说Android方向和最容易卡住的两件事环境配置、连接设备。6.1 Appium原理与环境构成Appium本身是一个Server它通过WebDriver协议与手机端交互。你的Python脚本发送指令给Appium ServerAppium再通过UIAutomator2Android或XCUITestiOS驱动手机上的应用。环境清单Android方向JDK 8配置JAVA_HOME。Android SDK配置ANDROID_HOMEplatform-tools目录下才有adb。Appium Server可以通过npm安装或用Appium Desktop图形化启动。真机开启开发者选项和USB调试或用模拟器。6.2 真机连接与adb命令手机连接电脑后第一步先确认adb能看到设备adb devices输出列表中如果设备名后面有unauthorized说明手机上弹出的调试授权窗口没确定如果没有任何输出检查USB线是不是只能充电。这些是百分之百会遇到的坑。6.3 Python脚本启动App模拟点击微信登录框示例性场景请使用测试应用from appium import webdriver desired_caps { platformName: Android, deviceName: 你的设备名, appPackage: com.example.testapp, appActivity: .MainActivity, noReset: True } driver webdriver.Remote(http://localhost:4723/wd/hub, desired_caps) driver.find_element(By.ID, com.example.testapp:id/loginBtn).click() driver.quit()运行脚本前务必确认Appium Server已经启动并且设备名和实际adb devices输出一致。移动端UI自动化最大的痛点是控件定位不稳定。很多App使用H5页面或Flutter渲染传统ID定位经常找不到。遇到这类问题可以先切换WebView上下文或者用坐标点击绝对坐标不推荐但应急有效来处理。真正能落地的方案是推动开发在关键控件上增加testID属性或content-desc这比什么花哨定位都可靠。7. 持续集成Jenkins Git让测试脚本无人值守脚本写完只是第一步能定时、自动地跑起来才是高级玩法。Jenkins是持续集成领域的老牌工具测试人员在入职后大概率会接触。7.1 Jenkins能解决什么问题假设你的测试脚本有500条接口用例每次发版前手动跑一次需要20分钟。如果你还要同时盯需求、写测试计划这些时间就很浪费。Jenkins能做到的是代码push到Git仓库后自动触发测试任务跑完自动发报告到邮箱。7.2 Jenkins Git Pytest的整合步骤把你的测试项目代码推到Git仓库GitHub/GitLab/Gitee均可。在Jenkins中新建一个自由风格的任务。源码管理里填Git仓库地址添加凭证。构建触发器选择Poll SCM或Webhook触发。构建环境选虚拟环境或直接执行shell。构建时执行的核心命令cd $WORKSPACE pip install -r requirements.txt pytest -v -s --htmlreport.html --self-contained-html运行完可以在构建后操作里添加Publish HTML reports让Jenkins页面直接展示测试报告。7.3 定时触发任务在触发器里加入定时表达式格式和crontab一样H 2 * * *表示每天凌晨2点自动执行一次。这样每天早上一到公司打开Jenkins就能看到昨天的回归结果不用手动跑任何脚本。让测试脚本从手动跑变成自动跑是自动化测试工程师价值体现的很关键一步。8. 面试与简历软件测试的硬技能怎么呈现学完技术是你自己的事面试官怎么在30分钟里判断你能不能干活取决于你简历怎么表达、问题怎么回答。8.1 简历上项目的写法STAR法则变形版很多人的简历上写负责登录模块的自动化测试这一句话等于没说。更好的写法是背景负责XX电商系统登录/订单模块的接口与UI自动化测试。任务搭建基于Pytest Requests Allure的接口自动化测试框架。行动封装统一请求方法、token自动处理、断言处理、数据驱动支持Excel用例。结果覆盖81个接口、320条用例回归时间从2人天缩短到40分钟线上漏测率明显下降。关键是让面试官看到你的产出与影响哪怕项目是自学的也要按真实项目流程去包装和组织你的表述。8.2 高频面试题及答题逻辑面试题大多集中在这些方面什么是Pytest的fixture和setup/teardown有什么区别接口测试断言怎么设计除了状态码还要验证什么怎么处理接口依赖比如登录后拿token。UI自动化为什么不稳定怎么提升稳定性给你一个月时间你怎么把一个项目的自动化从0搭起来我建议的答法永远是结合具体场景。比如第3题不要只说用上一个接口的返回值取token而是说先把登录接口的request和response封装从response里用jsonpath提取token再写入一个全局session变量或单独的token.txt后续接口请求时从session或配置文件里读取并放入headers。这会让面试官觉得你真的动手做过。8.3 自动化测试工程师的能力模型职场上限取决于你能解决多大范围内的问题。自动化测试工程师大致有三个成长阶段阶段主要工作能力重点初级按已有框架写脚本、执行用例工具使用熟练、用例设计清晰中级搭建和维护框架、解决疑难问题代码能力、框架设计、排错能力高级测试平台化、质量效能改进工程化思维、团队赋能、技术选型学习路上一定会有学了又忘的阶段这不可怕可怕的是每次学完就停在看过视频这个层面。真正有效的学习方式是每学一个新工具立刻配套一个具体功能点去实现。学完Requests就去调一个真实接口把登录态贯穿进去学完Selenium就去脚本化你平时常用的某个网页操作流程。技能只有在动手过程中才会变成你自己的。我个人在实战中感受最深的一点是把工作里的重复劳动一点点蚕食掉的感觉特别有成就感。最开始可能只是自动跑接口后来是回归不用手动点再后来是下班前把定时任务挂好第二天早上看报告。这种踏实的掌控感比找到一份工作本身更让人安心。
返回列表