ARTICLE DETAIL

资讯详情

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

自动化测试资源合集:从框架选型到UDS落地的工程实践指南

自动化测试资源合集:从框架选型到UDS落地的工程实践指南 先说明一下我的写作思路。这篇博文会把“自动化测试资源合集”这个话题当成一张地图来拆从学习路线的搭建、工具链的选择到面试表达和垂直行业UDS的落地每个部分都会给出可以直接参考的工程方案和踩坑心得。内容偏实用适合想系统梳理自动化测试体系的测试工程师也适合准备面试或正在搭建测试平台的朋友。1. 把资源合集拆成一张链路图自动化测试到底包含什么“资源合集”这个标题很诱人但也是最容易让人卡住的地方。刚入门的时候我也收藏过几十个仓库、几百篇文章结果真到写脚本那天反而不知道从哪下手。后来我慢慢想明白一件事自动化测试需要的不是“更多资源”而是一条能走通的链路——从选型、写脚本、执行到输出报告缺一环都会卡壳。先说链路图。做自动化测试不管你是测Web、移动端还是接口底层能力其实可以分成四个维度语言基础目前主流是Python和JavaPython上手快、生态全Java在大型企业级接口测试和Android相关的体系里更常见测试框架Python这边是pytestJava那边是TestNG、JUnit负责组织用例、管理断言、生成报告协议与UI操作能力接口层要懂HTTP/REST、WebSocket、gRPCUI层要懂DOM、XPath移动端要懂Android和iOS的控件树持续集成与报告Jenkins、GitLab CI、Allure、Pytest-HTML这些决定了自动化测试能不能真正跑在流水线上而不是只在本地玩。这四个维度不是并列的而是有依赖关系。我的建议路线是先从一个最小闭环开始——写一个接口自动化脚本用pytest组织用例跑通后把报告接到Allure最后挂到CI上。这个过程其实只涉及接口测试但能把整条链路打通。以后再做UI自动化、移动端自动化、嵌入式诊断自动化思路是相同的只是驱动层和协议层不同。“资源合集”真正应该解决的不是让你看更多教程而是帮你说清楚这条链路每一环要用什么工具、踩什么坑、产出什么东西。下面我按这个思路把我实际用下来觉得靠谱的东西逐个拆开讲。2. Pytest自动化测试框架里的首选也是最值得吃透的2.1 为什么首选是pytest而不是unittest或Robot Framework要说自动化测试框架pytest现在是Python社区里事实上的标准。相比unittestpytest最核心的三个优势是断言简单、fixture复用、插件生态强。先看断言。unittest里你得写assertEqual、assertTrue、assertIn这种写着写着就忘了哪个是哪个。pytest直接用Python原生的assert你写assert response.status_code 200失败了它还能帮你把实际值打印出来。别小看这一点它直接影响用例的可维护性——团队成员看到断言失败信息能更快定位问题。再看fixture。fixture这个词很多人背了定义但没用明白我举个例子你测接口很多用例都需要先登录拿token但有些用例又不需要。pytest里你可以定义一个login_token的fixture在需要的用例里传一个参数就行import pytest import requests pytest.fixture(scopesession) def login_token(): # 只执行一次整个会话期间复用 resp requests.post(https://example.com/api/login, json{user: tester, pass: 123456}) assert resp.status_code 200 return resp.json()[token] def test_get_user_info(login_token): headers {Authorization: fBearer {login_token}} resp requests.get(https://example.com/api/user/1, headersheaders) assert resp.status_code 200 assert resp.json()[username] testerfixture最大的价值是“按需注入”和“作用域管理”。scopesession代表整个测试过程只执行一次适合登录、初始化配置这种耗时操作默认的scopefunction则每个用例都执行一遍适合造独立的测试数据。这个设计比unittest的setUp/tearDown灵活太多也直接解决了测试数据耦合的老大难问题。2.2 pytest插件生态参数化、依赖排序、失败重跑、并发执行pytest的插件生态是它拉开差距的关键。我不推荐一开始就装一堆插件但有四个是实际项目中几乎必装的pytest-ordering控制用例执行顺序虽然好测试不应该依赖顺序但在集成测试里某些场景必须指定先后pytest-xdist并行执行用例用-n auto就能把用例分发到多个CPU核心上跑接口测试套件越大收益越明显pytest-rerunfailures失败用例自动重跑专治Flaky测试它能区分“间歇性环境问题”和“真正的功能缺陷”allure-pytest生成Allure报告界面比原生HTML好读很多尤其失败趋势和步骤回溯功能非常有用。我这里给一个工程里常用的命令参考pytest -n 4 --reruns 2 --reruns-delay 1 --alluredir./allure-results \ -q --disable-warnings --maxfail3参数含义依次是4个进程并行、失败重试2次、每次间隔1秒、Allure结果输出到指定目录、安静模式、忽略警告、最多失败3次就停止。注意--maxfail3一定要配否则出现大面积故障时CI排队时间会非常难看。再补充一下Allure报告的集成allure generate ./allure-results -o ./allure-report --clean生成的allure-report里有用例分层、步骤、附件、历史趋势接口自动化项目用它做汇报材料是最好用的。如果你不想装Allurepytest自带--htmlreport.html插件也能顶一顶缺点是定制能力差一些。2.3 一套可以直接抄作业的pytest工程结构资源合集里最缺的不是单个脚本而是一个能直接开工的工程结构。我习惯这样组织接口自动化项目api_test_platform/ ├── conf/ │ └── settings.py # 环境配置测试环境、预发环境的域名等 ├── common/ │ ├── base_request.py # 封装requests统一鉴权、日志、超时 │ ├── assert_utils.py # 公共断言状态码、业务码、关键字段 │ └── data_loader.py # 读取测试数据JSON/YAML/Excel ├── testcases/ │ ├── test_user.py │ └── test_order.py ├── conftest.py # 全局fixture登录token、数据库清理 ├── requirements.txt └── pytest.ini重点说pytest.ini它是pytest的配置文件很多新手容易漏掉[pytest] testpaths testcases addopts -v -s --alluredir./allure-results markers smoke: smoke tests regression: full regression testsmarkers用来标记用例是冒烟还是全量回归执行时可以-m smoke只跑冒烟用例。这个设计在CI里特别重要——提交代码后先跑快速冒烟通过后再跑全量回归省时间又不漏测。说实话pytest入门不难难的是把fixture作用域、插件取舍、工程结构一次想清楚。只要这三步走对了后面加用例就是复制粘贴的事。3. Java接口自动化测试框架RestAssured TestNG Allure企业项目的经典组合3.1 为什么Java体系里绕不开RestAssured和TestNG做接口自动化面试时碰到Java技术栈的项目是大概率事件。很多团队遗留系统的核心接口用Java写的测试框架也顺理成章选Java。Java这边最稳的组合是RestAssured做HTTP测试TestNG做用例管理和断言Maven管依赖Allure出报告。RestAssured比HttpClient好用的地方在于它把“发送请求、解析响应、校验结果”写成了接近自然语言的DSLimport io.restassured.RestAssured; import io.restassured.http.ContentType; import org.testng.annotations.Test; import java.util.HashMap; import java.util.Map; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.equalTo; public class UserApiTest { Test public void testLoginThenGetUser() { MapString, Object loginData new HashMap(); loginData.put(username, tester); loginData.put(password, 123456); // 登录获取token String token given() .contentType(ContentType.JSON) .body(loginData) .when() .post(https://example.com/api/login) .then() .statusCode(200) .extract() .jsonPath() .getString(token); // 使用token查询用户信息 given() .header(Authorization, Bearer token) .when() .get(https://example.com/api/user/1) .then() .statusCode(200) .body(username, equalTo(tester)); } }这里有几个细节值得注意。第一断言用的Hamcrest匹配器equalTo、containsString、hasItems可读性很强第二RestAssured的extract()可以把中间值提取出来给后续请求用这就解决了接口依赖问题。还要说下TestNG和JUnit的区别TestNG支持组groups、依赖dependsOnMethods、并行parallel这些在企业级接口测试里比JUnit更好用。3.2 数据驱动的接口测试TestNG DataProvider JSON文件很多接口测试用例其实只有输入和期望输出的差别。如果用代码硬编码每加一组测试数据就得写新方法完全是浪费时间。标准做法是数据驱动。TestNG提供了DataProvider可以把测试数据从代码里抽出来import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class OrderApiTest { DataProvider(name orderStatusCases) public Object[][] orderStatusCases() { return new Object[][]{ {1, 200, PROCESSING}, {999, 404, NOT_FOUND}, {abc, 400, INVALID_PARAM} }; } Test(dataProvider orderStatusCases) public void testGetOrder(String orderId, int expectedCode, String expectedStatus) { given() .when() .get(https://example.com/api/orders/ orderId) .then() .statusCode(expectedCode) .body(status, equalTo(expectedStatus)); } }实际工程里我不会把数据直接写在DataProvider里而是用Jackson或Gson把JSON文件读出来再用依赖注入把数据传给测试方法。这样做的好处是测试人员完全不碰Java代码只要维护JSON文件就行。除了数据驱动Java接口自动化里还有一个绕不开的话题签名加密。很多内部系统的接口需要MD5、SHA256或RSA签名RestAssured的filter接口可以用来统一处理这些逻辑不用在每个用例里重复写一遍加签代码。这个在面试里也是高频点后面我会再展开。3.3 工程落地Maven Allure Jenkins的配合Java项目的报告和CI集成比Python稍微繁琐一点。Maven里需要配置allure-maven插件或allure-junit5标准做法是在pom.xml里加上依赖后执行测试时自动生成allure-results目录再由Allure命令行生成HTML报告。同时maven-surefire-plugin要记得配置plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-surefire-plugin/artifactId version3.2.5/version configuration suiteXmlFiles suiteXmlFiletestng.xml/suiteXmlFile /suiteXmlFiles parallelmethods/parallel threadCount4/threadCount /configuration /plugintestng.xml负责定义哪些类、哪些组参与执行。项目大了以后你可以拆成smoke.xml和regression.xmlCI里按分支跑不同的集合。Jenkins侧需要做的事很简单拉代码、执行mvn clean test、归档Allure报告。这里的坑是“时区”和“中文乱码”——Jenkins机器默认时区和UTF-8配置经常不对导致Allure报告里的中文全是问号。解决办法是在Jenkins全局配置里加上-Dfile.encodingUTF-8并且把系统时区设成Asia/Shanghai千万别等乱码了再排查。4. Appium移动端自动化从Driver启动到元素定位实操与避坑4.1 Appium的原理一套协议两层驱动移动端自动化是“自动化测试脚本”被提到最多的场景之一。Appium能同时支持Android和iOS核心原因是它基于WebDriver协议做了一层包转你在脚本里写的findElement、click、sendKeysAppium Server会翻译成对应平台的指令Android走UiAutomator2iOS走XCUITest。这个架构最大的价值是测试脚本可以复用换平台时不至于全部重写。但代价是引入了一个“中间层”定位元素、同步状态时经常出现网络延迟或驱动版本不匹配的问题。所以我一直强调做Appium第一件事是锁定版本Appium Server用哪个版本UiAutomator2/XCUITest驱动用哪个版本必须在项目文档里写死。启动Appium前你的Python环境需要装Appium Python Clientpip install Appium-Python-Client再确认命令行工具appium可用然后启动服务appium --port 4723 --base-path /wd/hub新版本Appium默认路径和旧版本不一样很多教程里还在写http://127.0.0.1:4723/wd/hub其实新版本直接访问http://127.0.0.1:4723/就行这个兼容差异经常让人一头雾水。4.2 Desired Capabilities配置与元素定位实战连接到真机或模拟器核心在desired caps配置。拿Android举例from appium import webdriver caps { platformName: Android, appium:automationName: UiAutomator2, appium:platformVersion: 12.0, appium:deviceName: AndroidEmulator, appium:appPackage: com.example.app, appium:appActivity: .MainActivity, appium:noReset: True, appium:settings[waitForIdleTimeout]: 500 } driver webdriver.Remote(http://127.0.0.1:4723/wd/hub, caps)noReset设为True的意思是测试过程中不重置App数据能省下很多登录步骤但要注意测试数据会被污染适合冒烟测试。元素定位方面Android优先用resource-id遇到动态列表页面再用XPath。一个靠谱的定位示例# 用resource-id定位 login_button driver.find_element(id, com.example.app:id/btn_login) # 用XPath定位带文本的元素 username_input driver.find_element( xpath, //android.widget.EditText[text请输入手机号] )这里有个经验之谈不要一上来就写复杂的XPath。//android.view.View[contains(text,订单)]这种写法一旦UI层级稍变就挂了。更好的做法是先让开发在关键的控件上加resource-id或testID这比你在自动化脚本里花三天调XPath靠谱得多。4.3 移动端自动化最容易踩的坑等待、弹窗、多设备并行移动端的稳定性问题是所有自动化测试框架里最多的。我根据自己的实践整理了三个高频雷区第一个是元素等待。App启动有冷启动、热启动的差别页面渲染有异步加载直接find_element经常会扑空。不要用time.sleep(5)硬等太慢而且不可靠。正确做法是用显式等待from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait WebDriverWait(driver, 20) element wait.until(EC.presence_of_element_located( (id, com.example.app:id/btn_login) ))第二个是系统弹窗。Android的权限弹窗定位、通知和iOS的“允许”弹窗不同机型文案还不一样极容易出现测试中断。我的方案是在caps里把权限弹窗尽量提前关闭比如autoGrantPermissions设为TrueAndroid的方法是通过appium:settings或UIAutomator拦截弹窗。iOS这边还要处理“定位权限”等系统级弹窗比较麻烦建议维护一个“弹窗关闭用例”在测试最前面跑一遍。第三个是多设备并行。用pytest-xdist加Appium可以实现多台设备同时跑不同用例集。但这里的坑在于每个设备的udid设备唯一标识必须隔离不能共享同一个WebDriver实例。实际做法是动态生成caps里的udid再把设备列表作为参数传入pytest testcases/mobile/ -n 2 --device udid1 udid2Appium自动化本身不难难的是稳定度。如果一条用例在模拟器上跑10次有8次通过那不算通过至少到9次才算可用。移动端自动化项目的价值最终要体现在“可信度”上否则汇报结果时根本没人敢信。5. AI自动化测试大模型究竟能帮我们做什么别抱不切实际的期待5.1 AI自动化测试的真实能力边界说句实在话AI自动化测试这两年热度很高但真正落地的时候大家容易走两个极端要么认为AI能完全替代人工写测试要么觉得全是噱头。我自己的实践体会是AI目前最大的价值在“辅助生成”和“辅助维护”而不是“完全自主测试”。先说辅助生成。现在很多IDE和插件支持通过自然语言描述需求直接生成pytest或JUnit用例。比如你写一句“请生成一个验证登录接口的成功和失败用例使用pytest”模型会给你一个基本可跑的脚本。这里的关键是生成的脚本通常只能覆盖直来直去的happy path边界条件、异常场景、数据清理这些工程化细节仍然需要人来补。我的用法是把生成的脚本当“第一稿”再手动改fixture和断言逻辑。其次是智能断言与元素定位。AI在UI自动化里可以帮助识别控件。传统Appium定位一个按钮可能要拼XPath现在一些工具支持语义定位比如根据按钮的文本、颜色、位置综合判断。这个对“页面结构频繁变化”的老项目很有用能减少一部分测试脚本维护成本。5.2 实际用在pytest里的AI辅助方案我最近在项目里做了个实验利用AI辅助为现有接口写更完整的边界值用例。做法很简单先收集接口定义Swagger/OpenAPI然后整理成一份“接口参数说明”文本交给模型生成pytest用例最后人工review。效果是单个接口的用例数量从5条左右增加到15条以上覆盖面明显提升但生成的用例里大约有三成需要微调比如有些参数类型描述不准确、有些断言依赖了不稳定的字段。所以算下来效率提升大概在30%-40%并没有夸张到十倍的“银弹”。提醒一点AI生成测试数据时要特别注意数据脱敏。测试环境中如果有用户手机号、身份证号、订单信息等真实数据千万别直接丢给外部模型。我见过有同事把生产环境脱敏后的数据截图贴给AI结果出了安全事件。稳妥做法是自己部署私有化模型或者只用脱敏后的模拟数据。5.3 从“脚本维护”到“用例生成”的思维转变AI自动化测试真正改变的不是执行层而是维护层。传统自动化最贵的是“变更后改脚本”页面文案改一下、接口字段名变一下都要人力去修。AI辅助后的工作流是让脚本与产品描述尽量解耦——你把产品需求测试点描述清楚了AI可以快速生成新断言、新定位方式。但这里面有个前提你的测试资产需要结构化。比如接口测试应该有清晰的接口定义文档UI测试应该尽量给控件加testID。如果你连这些基础都没有AI也无从下手。自动化测试的资源合集里最底层的那一层永远是规范化、结构化的数据。6. UDS自动化测试输出测试报告汽车电子垂直方向怎么做6.1 UDS是什么为什么自动化测试要单独说它UDS是ISO 14229里定义的一套统一诊断服务广泛应用于汽车ECU电子控制单元的测试与故障诊断。说人话车里的每个ECU都实现了UDS服务诊断仪或测试设备可以通过UDS协议和ECU对话读故障码、读写数据、执行例程。为什么在“自动化测试资源合集”里要单独讲UDS因为传统软件测试的人可能完全没接触过但它恰恰是汽车电子行业测试工程师的刚需技能。UDS自动化测试的核心不是用pytest或TestNG跑业务用例而是通过诊断工具比如CANoe、CANalyzer或者自研的Python硬件盒去模拟诊断仪与ECU通信执行UDS服务并校验响应。6.2 Python CAN底层通信层才是UDS自动化的关键在PC上做UDS自动化通常需要一个CAN盒CANoe硬件、PCAN、或者国产的周立功USBCAN。Python侧用python-can库可以实现CAN2.0报文的收发再通过UDS协议层解析ISO-TP的帧结构。一个简化版的UDS请求过程大概是把要发送的UDS服务比如0x22读DID、0x2E写DID、0x31例程控制封装成CAN帧通过CAN盒发给ECUECU在CAN总线上回复响应帧测试脚本解析后判断服务是否成功。伪代码思路如下import can bus can.interface.Bus(interfacepcan, channel0, bitrate500000) def send_uds_request(service_id, sub_functionNone, dataNone): # 构造UDS请求帧这里简化了ISO-TP分帧逻辑 # 服务ID 0x22表示按标识符读取数据 frame can.Message( arbitration_id0x7E0, # 诊断请求ID data[0x02, service_id, sub_function] (data or []), is_extended_idFalse ) bus.send(frame) # 等待ECU响应通常从0x7E8收帧 resp_frame bus.recv(timeout2) return parse_response(resp_frame) # 读DID 0xF190 resp send_uds_request(0x22, 0xF1, 0x90) assert resp.pid 0x62 # 正确读取数据的响应服务ID这里特别提醒真实项目里一定要考虑ISO-TP分帧/组帧逻辑因为单个CAN报文最多8字节UDS请求可能拆成多帧还有寻址模式物理寻址和功能寻址的差别会影响响应的来源。初学者最容易犯的错是拿着别的项目里的请求ID直接用不同车型的诊断请求ID0x7E0等虽然多数是标准值但也不全是务必先看诊断数据库ODX/CDD再写脚本。6.3 UDS自动化测试报告怎么输出、怎么呈现才规范回到热词里最具体的需求——“uds自动化测试输出测试报告”。在UDS测试里测试报告不是简单打勾而是要能追溯到每一条报文的请求与响应。所以我的报告模板通常包含以下内容用例ID和测试目的前置条件ECU版本、诊断仪配置、总线波特率测试步骤按时间顺序列出每一步操作和UDS服务请求报文和响应报文的详细记录原始HEX值断言结果响应中DID数据是否符合预期日志截图或总线波形可选最终PASS/FAIL结论和问题描述。生成报告的工具链我惯用的是pytest allure给每个UDS测试用例加上allure.step把请求帧、响应帧逐帧记录import allure allure.title(读取VIN码DID 0xF190) allure.step(发送0x22服务读取VIN码) def test_read_vin(): request_data [0x02, 0x22, 0xF1, 0x90] response send_can_diagnostic_request(request_data) allure.attach(str(request_data), name请求帧, attachment_typeallure.attachment_type.TEXT) allure.attach(str(response), name响应帧, attachment_typeallure.attachment_type.TEXT) assert response[positive] is True assert response[data] in EXPECTED_VIN_RANGE这样生成的HTML测试报告无论是给研发看还是给产线审核都会非常直观因为每一帧报文都有迹可循。也是我在这类垂直行业里反复强调的底层协议测试的自动化报告质量直接决定了你的可信度。不能说“我测过了”而是要让对方一眼看到“请求了什么、回的是什么、为什么Pass、为什么Fail”。如果你的团队还没搭Allure用纯pytest-html也能实现只是步骤级展示不如Allure方便。UDS这块先跑通读取VIN码0x22, DID 0xF190或读故障码0x19服务的用例基本上就能建立一套可复用的测试工程。7. 自动化测试面试题精选这样答既显功底又接地气7.1 框架与概念题为什么这样设计、怎么解决Flaky自动化测试面试题里最常问的其实是“底层原理”和“场景设计”两类。比如有人问“PO模式是什么”大部分人都能说一句“Page Object页面对象封装”但面试官真正想听的是你知不知道为什么要封装。答案核心是把页面元素定位和页面行为从测试用例里剥离这样页面变化时只改PO类用例脚本不用动。如果能再补一句“PO模式同样适用于接口测试可以把每个接口封装成一个方法用例层只关心业务流”那就更能体现经验。再比如“UI自动化用例不稳定怎么办”也是一个高频题。这种问题没有唯一答案但面试官希望听到一套排障方法先分析是等待问题、定位问题还是数据问题再对症下药。一个成熟的回答思路是如果元素偶发找不到优先加显式等待而不是加sleep如果是页面结构频繁变化优先要求开发加testID或改用更稳定的父级定位如果是接口返回慢导致渲染异常优先做“接口层预校验”让UI层专注交互逻辑如果以上都无效再考虑用例隔离、失败重跑、并行隔离。这种回答模式的好处是既展示了你的工具熟悉度又展示了“根因分析”的思维远比背几个API名有说服力。7.2 数据驱动用例设计题输入、输出与场景的搭法面试官还喜欢问“给你一个登录接口你会怎么设计测试用例”。很多人只能想到“正常登录、密码错误、用户名不存在”这其实是不够的。更合理的结构是按三层拆协议层请求方法、Content-Type、超时、鉴权头缺失、非法Token业务层正确密码、错误密码、空密码、账户锁定、验证码错误、密码加密传输数据层边界数据超长用户名、特殊字符、SQL注入样本、重复提交、并发登录。在回答时如果能顺便提一句“我会把协议层用例放在pytest的smoke标记里业务和数据层用例放在regression标记里”那面试官马上知道你对工程组织是有概念的不是只会写两条用例。7.3 项目经验怎么讲从“我写了多少条用例”到“我解决了什么问题”最后聊面试里的项目经验表达。很多简历上写“参与自动化测试框架搭建”但问起来就只说“用了pytest写了500条接口用例”。这些数字本身没什么说服力。更好的表达方式是讲你解决的具体问题。比如“之前的接口测试用例执行经常因为token过期失败我通过pytest的session级别fixture实现了统一登录和token自动刷新把失败率从30%降到3%。”这种描述有场景、有指标、有手段面试官才能判断你是否真的动过手。如果你想进汽车电子或嵌入式领域那“UDS自动化测试输出测试报告”的技能非常加分。面试时可以说“我基于python-can和pytest写了ECU诊断回归用例把测试结果和请求/响应报文自动关联生成Allure报告研发可以直接定位到失败帧。”这就把自动化测试脚本、行业协议和报告产出串成了一条完整的能力链。8. 一些真正帮我省过时间的工具与资源清单前面已经把关键知识点拆开了最后再说说资源合集里我觉得真正值得长期留存的工具和信息源。pytest相关的API文档、插件仓库是最值得优先读一遍的尤其是fixture的参数和作用域以及pytest.ini的配置项。Java侧建议把RestAssured的官方文档和TestNG的DataProvider示例跑一遍光看不写很容易忘。Appium方面官方文档比零散的博客靠谱重点看新版WebDriverAgent和UiAutomator2的迁移说明。UDS的话ISO 14229-1的原始定义太长可以先从“诊断会话控制”“读取DID”“故障码读取”三类服务入手配合CANdb或ODX工具了解实际报文结构。如果在网上检索“自动化测试面试题”很容易搜到几百道题目但我建议不要死记而是把题目按“原理题、设计题、场景题、项目题”四类自己消化一遍。资源越是丰富越要懂得做减法——你的目标是打通一条链路而不是把每个工具都学到八十分。我的个人体会是自动化测试的“资源合集”核心不在收藏了多少篇教程而在你脑子里有没有那张图从需求到用例设计、从框架选型到CI集成、从报告展示到维护策略每一步都有一条顺理成章的依据。如果你能照着这篇文章的思路先把pytest接口自动化跑通再把Appium或者UDS的垂直场景加进来那你对“自动化测试”这四个字的理解一定比单纯看十篇教程都要深。
返回列表