一文掌握Robot Framework自动化测试:从核心思想到Web/API实战
1. 项目概述:为什么是Robot Framework?
如果你正在寻找一个能让你快速上手、又能应对复杂场景的自动化测试框架,Robot Framework(后文简称RF)绝对是一个绕不开的名字。我接触过不少测试框架,从纯代码驱动的Selenium+Python,到需要一定编程基础的Cypress,再到各种宣称“零代码”的平台。RF给我的感觉是,它在“易用性”和“灵活性”之间找到了一个绝佳的平衡点。它不像纯代码框架那样对新手有很高的门槛,也不像某些图形化工具那样在复杂逻辑面前捉襟见肘。你可以把它理解为一个“关键字驱动”的积木盒,官方和社区提供了海量的“积木”(即测试库),你只需要用接近自然语言的语法把这些积木组合起来,就能搭建出从Web UI、API接口到移动端、数据库的全栈自动化测试城堡。
这个“一文搞定”的目标,不是让你一天成为专家,而是为你铺平一条从零开始、直达实战的清晰路径。我们会从最核心的“关键字驱动”思想讲起,手把手搭建环境,然后深入到Web、API、移动端等不同领域的实战,最后探讨如何组织一个可维护、可扩展的测试工程。无论你是刚入行的测试新人,还是想为团队引入更高效工具的技术负责人,这篇文章都能给你带来直接的、可落地的参考价值。
2. 核心思想与框架架构拆解
在动手写第一行脚本之前,理解Robot Framework的设计哲学至关重要。这能让你在后续的学习中,知其然更知其所以然,而不是机械地记忆语法。
2.1 关键字驱动:像说话一样写测试
RF的核心是“关键字驱动”(Keyword-Driven Testing)。什么是关键字?你可以把它看作一个封装好的、能完成特定功能的指令。比如,Open Browser是打开浏览器的关键字,Input Text是输入文本的关键字。
这种设计带来了几个巨大的优势:
- 低代码/无代码门槛:测试用例的编写者(通常是测试工程师)不需要精通编程语言。他们只需要用“打开浏览器”、“登录系统”、“检查表格”这样的业务语言来组织测试步骤。这极大地降低了自动化测试的参与门槛,让业务专家也能参与到自动化脚本的设计中。
- 高可读性:一个写好的RF测试用例,读起来就像一份清晰的测试手册。这对于团队协作、知识传承和测试用例评审非常有帮助。
- 关注点分离:关键字将“做什么”(What)和“怎么做”(How)分离开。测试用例只关心“做什么”,而“怎么做”的实现细节被封装在背后的测试库(Test Library)中。当底层技术栈变更(比如从Selenium 3升级到Selenium 4),你只需要更新测试库,而不需要大规模修改成千上万的测试用例。
2.2 三层架构:清晰的责任划分
RF的架构可以清晰地分为三层,这保证了它的灵活性和可维护性。
第一层:测试数据文件(.robot, .txt)这是你编写测试用例的地方。文件以表格形式组织,主要包含以下几个部分:
- Settings: 用于导入测试库、资源文件,定义测试套件的元数据。
- Variables: 定义在该文件中可用的变量。
- Test Cases: 具体的测试用例,由一系列关键字组成。
- Keywords: 用户自定义的关键字,用于封装可复用的操作序列。
- Tasks: 用于机器人流程自动化(RPA)场景。
第二层:测试库(Test Library)这是RF的“动力源泉”。测试库由Python(或Java、.NET)编写,提供了具体的关键字实现。例如:
SeleniumLibrary: 提供了所有Web自动化相关的关键字,如点击、输入、断言等。RequestsLibrary: 提供了HTTP接口测试的关键字。AppiumLibrary: 提供了移动端(Android/iOS)自动化测试的关键字。DatabaseLibrary: 提供了数据库操作的关键字。
你可以使用官方库,也可以使用社区库,甚至可以基于业务需求自己用Python编写自定义库。
第三层:被测系统(System Under Test, SUT)这就是你的Web应用、移动App、后端API等。RF通过测试库与它们进行交互。
这个三层架构意味着,作为测试脚本的主要编写者,你的工作重心在第一层,用清晰的语言描述测试流程。当需要扩展能力时,你去第二层寻找或开发合适的库。这种分离让整个自动化体系非常清爽。
注意:很多新手会混淆“RF脚本”和“Python代码”。RF脚本(.robot文件)本身不是编程语言,它是一种特定领域的语言(DSL)。它的执行依赖于Python环境和对应的测试库。理解这一点,能帮助你更好地定位问题——当关键字执行失败时,你应该去检查对应的Python测试库是否安装正确,或者其实现逻辑是否有误。
3. 环境搭建与核心工具链实战
工欲善其事,必先利其器。一个顺畅的本地开发环境是高效学习的基础。下面我将以Windows/macOS通用、配合VSCode编辑器的方式,带你一步步搭建。
3.1 Python环境与Robot Framework安装
RF基于Python,所以首先需要一个Python环境。
- 安装Python:前往Python官网下载最新稳定版(如3.9+)。安装时务必勾选“Add Python to PATH”,这样可以在命令行中直接使用
python和pip命令。 - 验证安装:打开终端(Windows CMD/PowerShell, macOS Terminal),输入以下命令:
如果能正确显示版本号,说明安装成功。python --version pip --version - 安装Robot Framework核心:在终端中执行:
这个命令会安装RF的运行核心。pip install robotframework - 安装常用测试库:我们一次性安装几个最常用的库。
pip install robotframework-seleniumlibrary # Web自动化 pip install robotframework-requests # 接口自动化 pip install robotframework-appiumlibrary # 移动端自动化 (需先配置Appium环境) pip install robotframework-databaselibrary # 数据库操作 pip install robotframework-faker # 生成测试数据 - 验证RF安装:安装完成后,输入以下命令:
如果显示RF版本,则大功告成。robot --version
3.2 编辑器配置:VSCode成为RF开发利器
纯文本编辑器写.robot文件体验很差。VSCode凭借其强大的插件生态,是目前RF开发的首选。
- 安装VSCode:从官网下载安装。
- 安装Robot Framework插件:在VSCode扩展商店中搜索并安装
Robot Framework Language Server。这个插件提供了语法高亮、关键字自动补全、代码导航、调试等强大功能,是RF开发的“灵魂”。 - (可选)安装测试运行插件:可以安装
Robotcode或Test Explorer for Robot Framework插件,它们提供了图形化的测试运行和结果查看界面,更加直观。
配置完成后,创建一个新的.robot文件,你会立刻看到语法被高亮显示,输入关键字时会有智能提示。
3.3 第一个脚本:Hello, Automation!
让我们用一个最简单的例子,感受一下RF的工作流程。这个例子不依赖任何外部应用,仅使用RF内置的关键字。
在VSCode中新建一个文件,保存为
hello_world.robot。输入以下内容:
*** Settings *** Documentation 第一个Robot Framework脚本 Library BuiltIn *** Test Cases *** 验证日志输出功能 Log 你好,Robot Framework! level=INFO Log 这是一条警告信息。 level=WARN ${message}= Set Variable 动态生成的变量 Log 消息内容是:${message} console=True代码解读:
*** Settings ***: 设置区。这里我们导入了RF内置的BuiltIn库,它包含了许多基础关键字。*** Test Cases ***: 测试用例区。我们定义了一个名为“验证日志输出功能”的测试用例。Log: 是BuiltIn库提供的关键字,用于输出日志。level参数指定日志级别(INFO, WARN, DEBUG等)。console=True表示直接将日志打印到控制台。
运行脚本:打开终端,导航到
hello_world.robot文件所在的目录,执行命令:robot hello_world.robot查看结果:命令执行后,RF会自动生成三个文件:
log.html: 最详细、可交互的日志报告,是分析测试结果的主要工具。report.html: 测试执行的总结报告,展示通过率、耗时等统计信息。output.xml: 机器可读的原始输出数据。
用浏览器打开report.html和log.html,你就能看到测试执行的详细过程和结果。至此,你的第一个RF自动化脚本已经成功运行!
实操心得:养成在编写用例时使用
Documentation为测试套件和测试用例添加描述的好习惯。这行文字会显示在最终的测试报告中,对于理解测试意图非常有帮助。另外,初期可以多使用Log关键字输出中间变量值,这是调试RF脚本最直接有效的方法。
4. Web自动化测试实战(SeleniumLibrary)
Web UI自动化是RF最经典的应用场景。SeleniumLibrary是对Selenium WebDriver的完美封装,让我们能以关键字的方式操作浏览器。
4.1 浏览器驱动与基础操作
在开始之前,你需要下载对应浏览器的WebDriver(如ChromeDriver),并确保其路径在系统的PATH环境变量中,或者直接在脚本中指定路径。
让我们编写一个完整的登录场景用例:
*** Settings *** Documentation Web自动化测试示例:登录功能 Library SeleniumLibrary *** Variables *** ${BROWSER} Chrome ${LOGIN_URL} https://example.com/login ${USERNAME} testuser ${PASSWORD} secret123 *** Test Cases *** 用户成功登录系统 [Documentation] 验证使用正确的用户名和密码可以成功登录 [Tags] smoke login Open Browser ${LOGIN_URL} ${BROWSER} Maximize Browser Window Input Text id=username ${USERNAME} Input Password id=password ${PASSWORD} # Input Password关键字会隐藏输入 Click Button css=button[type='submit'] Wait Until Page Contains 欢迎回来,${USERNAME} timeout=10s Page Should Contain 仪表盘 Close All Browsers 用户登录失败-用户名错误 [Documentation] 验证使用错误的用户名登录会提示错误 Open Browser ${LOGIN_URL} ${BROWSER} Input Text id=username wrong_user Input Password id=password ${PASSWORD} Click Button css=button[type='submit'] Wait Until Page Contains Element css=.alert-danger timeout=5s Element Should Contain css=.alert-danger 用户名或密码错误 Close Browser关键点解析:
- 定位器:
id=username,css=button[type='submit']这些是元素定位器。RF支持多种定位策略:id,name,xpath,css,tag等。优先使用id和name,其次css,万不得已再用xpath,因为xpath性能相对较差且易受页面结构变化影响。 - 等待机制:Web页面加载需要时间,直接操作元素可能导致失败。
Wait Until Page Contains和Wait Until Page Contains Element是显式等待,比固定的Sleep更高效、更可靠。 - 断言:
Page Should Contain,Element Should Contain用于验证页面状态是否符合预期,是测试逻辑的核心。 - 清理:每个测试用例结束后,使用
Close Browser或Close All Browsers关闭浏览器,释放资源,避免影响后续用例。
4.2 高级技巧:页面对象模式与自定义关键字
当测试用例越来越多时,直接在用例中编写大量定位器和操作会导致代码难以维护。这时需要引入“页面对象模式”(Page Object Model, POM)。
1. 创建资源文件封装页面对象新建一个login_page.resource文件:
*** Settings *** Library SeleniumLibrary *** Variables *** # 页面元素定位器 ${LOGIN_PAGE.USERNAME_INPUT} id=username ${LOGIN_PAGE.PASSWORD_INPUT} id=password ${LOGIN_PAGE.SUBMIT_BUTTON} css=button[type='submit'] ${LOGIN_PAGE.ERROR_ALERT} css=.alert-danger *** Keywords *** 打开登录页面 [Arguments] ${url} ${browser}=Chrome Open Browser ${url} ${browser} Maximize Browser Window Title Should Be 用户登录 输入登录凭证 [Arguments] ${username} ${password} Input Text ${LOGIN_PAGE.USERNAME_INPUT} ${username} Input Password ${LOGIN_PAGE.PASSWORD_INPUT} ${password} 点击登录按钮 Click Button ${LOGIN_PAGE.SUBMIT_BUTTON} 验证登录成功 [Arguments] ${expected_username} Wait Until Page Contains 欢迎回来,${expected_username} timeout=10s Page Should Contain 仪表盘 验证登录失败提示 [Arguments] ${expected_error_message} Wait Until Page Contains Element ${LOGIN_PAGE.ERROR_ALERT} timeout=5s Element Should Contain ${LOGIN_PAGE.ERROR_ALERT} ${expected_error_message}2. 在测试用例中引用资源文件修改你的测试用例文件login_tests.robot:
*** Settings *** Documentation 登录功能测试套件 Resource login_page.resource # 导入资源文件 Suite Setup 打开登录页面 https://example.com/login Suite Teardown Close All Browsers *** Test Cases *** 用户成功登录系统 输入登录凭证 testuser secret123 点击登录按钮 验证登录成功 testuser 用户登录失败-用户名错误 输入登录凭证 wrong_user secret123 点击登录按钮 验证登录失败提示 用户名或密码错误这样做的好处:
- 可维护性:当登录页面的HTML元素ID发生变化时,你只需要修改
login_page.resource文件中的定位器变量,所有引用该资源的测试用例都会自动生效。 - 可读性:测试用例变成了纯粹的业务逻辑描述,读起来就像产品文档。
- 可复用性:
打开登录页面、输入登录凭证这些关键字可以在多个测试套件中被复用。
避坑指南:在编写自定义关键字时,务必为其添加
[Documentation]和[Arguments]。清晰的文档和参数定义,能让你的关键字库像一个小型API,方便团队其他成员理解和使用。另外,资源文件(.resource)和变量文件(.py, .yaml)是RF组织代码的利器,在项目初期就规划好它们的结构,能省去后期大量重构的麻烦。
5. API接口自动化测试实战(RequestsLibrary)
现代应用前后端分离,API测试变得至关重要。RequestsLibrary让RF能够轻松发起HTTP请求并验证响应。
5.1 发起请求与响应断言
假设我们有一个用户查询的API:GET https://api.example.com/users/{id}。
*** Settings *** Documentation API自动化测试示例 Library RequestsLibrary Library Collections # 用于处理复杂的响应断言 *** Variables *** ${BASE_URL} https://api.example.com *** Test Cases *** 获取指定用户信息-成功 [Documentation] 验证通过有效ID可以获取到正确的用户信息 # 1. 创建一个会话(Session),管理cookie和headers Create Session user_api ${BASE_URL} # 2. 发起GET请求 ${response}= GET On Session user_api /users/123 # 3. 断言响应状态码 Should Be Equal As Numbers ${response.status_code} 200 # 4. 断言响应体内容(JSON) # 方式一:直接断言整个JSON对象 Dictionary Should Contain Item ${response.json()} id 123 Dictionary Should Contain Item ${response.json()} name John Doe Dictionary Should Contain Item ${response.json()} email john@example.com # 方式二:提取特定字段进行断言(更灵活) ${user_name}= Set Variable ${response.json()}[name] Should Be Equal ${user_name} John Doe # 5. 断言响应头 ${content_type}= Get From Dictionary ${response.headers} Content-Type Should Contain ${content_type} application/json 获取用户信息-用户不存在 [Documentation] 验证使用不存在的ID请求返回404 Create Session user_api ${BASE_URL} ${response}= GET On Session user_api /users/999999 expected_status=404 Should Be Equal As Numbers ${response.status_code} 404 Dictionary Should Contain Item ${response.json()} error User not found5.2 处理复杂请求:POST与数据驱动
对于创建、更新等操作,我们需要发送POST/PUT请求。
*** Test Cases *** 创建新用户 [Documentation] 验证通过POST请求可以成功创建用户 Create Session user_api ${BASE_URL} # 准备请求体(JSON格式) &{request_body}= Create Dictionary ... name=Jane Smith ... email=jane@example.com ... age=28 # 设置请求头 &{headers}= Create Dictionary ... Content-Type=application/json ... Authorization=Bearer your_token_here # 发起POST请求 ${response}= POST On Session user_api /users ... json=${request_body} ... headers=${headers} # 断言 Should Be Equal As Numbers ${response.status_code} 201 Dictionary Should Contain Key ${response.json()} id # 创建成功应返回新用户的ID 使用模板文件进行数据驱动测试 [Documentation] 使用不同的测试数据多次执行同一个测试逻辑 [Template] 创建用户数据驱动模板 # 测试数据行: name, email, age, expected_status Alice alice@example.com 25 201 ${EMPTY} bob@example.com 30 400 # 姓名为空,预期失败 Charlie invalid-email 22 400 # 邮箱格式错误,预期失败 *** Keywords *** 创建用户数据驱动模板 [Arguments] ${name} ${email} ${age} ${expected_status} Create Session user_api ${BASE_URL} &{request_body}= Create Dictionary name=${name} email=${email} age=${age} ${response}= POST On Session user_api /users json=${request_body} expected_status=${expected_status} Run Keyword If ${expected_status} == 201 ... Log 用户 ${name} 创建成功,ID为:${response.json()}[id] ... ELSE ... Log 创建失败,符合预期。响应:${response.text}关键点解析:
- 会话管理:
Create Session可以复用TCP连接,提升性能,并自动管理cookies,模拟浏览器行为。 - JSON处理:RF内置的
Collections库和BuiltIn库提供了丰富的字典(Dictionary)和列表(List)操作关键字,非常适合处理JSON响应。 - 数据驱动:使用
[Template]标签是实现数据驱动测试最简洁的方式。它将一个关键字转化为测试模板,其下的每一行数据都会作为一次独立的测试用例执行,并生成独立的测试结果。这对于测试边界值和异常场景非常高效。 - 预期状态码:
GET On Session和POST On Session等关键字支持expected_status参数。当实际状态码与预期不符时,测试会立即失败。这比先发送请求再断言状态码更清晰。
实操心得:对于复杂的API响应断言,我强烈建议将断言逻辑也封装成自定义关键字。例如,可以创建一个名为
验证用户信息完整且正确的关键字,内部包含对用户对象各个字段的详细检查。这样主测试用例会非常简洁。另外,对于需要认证的API,可以将获取Token的逻辑封装成一个套件级别的Suite Setup关键字,确保所有测试用例执行前都已获得有效的认证信息。
6. 测试工程化:组织、运行与报告
当测试脚本达到几十上百个时,如何组织它们就成了一门学问。好的工程结构能提升协作效率和维护性。
6.1 项目目录结构规划
一个典型的RF自动化项目目录可以这样组织:
my_robot_project/ ├── README.md # 项目说明 ├── requirements.txt # Python依赖包列表 ├── run_tests.robot # 主执行入口(可选) │ ├── resources/ # 资源文件目录 │ ├── common.resource # 公共关键字、变量 │ ├── web_pages/ # Web页面对象资源 │ │ ├── login_page.resource │ │ └── dashboard_page.resource │ └── api_clients/ # API客户端资源 │ ├── user_api.resource │ └── product_api.resource │ ├── test_data/ # 测试数据文件 │ ├── users.yaml │ └── products.csv │ ├── test_cases/ # 测试用例目录(按功能/模块划分) │ ├── smoke_tests/ # 冒烟测试 │ │ └── quick_check.robot │ ├── regression_tests/ # 回归测试 │ │ ├── web/ │ │ │ ├── login_logout.robot │ │ │ └── user_management.robot │ │ └── api/ │ │ ├── user_crud.robot │ │ └── order_flow.robot │ └── acceptance_tests/ # 验收测试 │ ├── libraries/ # 自定义Python测试库(高级) │ └── my_custom_library.py │ ├── results/ # 测试输出目录(.gitignore忽略) │ └── latest/ # 最近一次运行结果 │ └── scripts/ # 辅助脚本 ├── run_smoke.sh └── generate_report.py6.2 高级运行控制与标签
RF提供了强大的命令行工具来控制测试的执行。
1. 按标签(Tags)运行在测试用例或套件上使用[Tags]可以为其打上标签。
*** Test Cases *** 用户成功登录系统 [Tags] smoke high login # ... 测试步骤 ... 用户登录失败 [Tags] regression login # ... 测试步骤 ...通过命令行,你可以灵活选择要运行的测试:
# 运行所有带有smoke标签的测试 robot --include smoke test_cases/ # 运行所有不带有wip(work in progress)标签的测试 robot --exclude wip test_cases/ # 组合使用 robot --include smoke --include api test_cases/2. 按名称、文件运行
# 运行指定文件 robot test_cases/web/login_logout.robot # 运行名称匹配“login”的测试用例 robot --test *login* test_cases/ # 运行名称匹配“用户成功*”的测试用例(支持通配符) robot --test "用户成功*" test_cases/3. 生成定制化报告
# 指定输出目录 robot --outputdir results/run_20231027 test_cases/ # 设置日志和报告标题 robot --name "全量回归测试" --logtitle "详细执行日志" test_cases/ # 合并多次运行的结果(用于生成趋势报告) rebot --merge output1.xml output2.xml --output merged.xml6.3 集成到CI/CD流水线
自动化测试只有集成到持续集成/持续部署(CI/CD)流程中,才能发挥最大价值。以Jenkins为例:
- 在Jenkins中创建一个自由风格项目。
- 配置源码管理(如Git),指向你的RF项目仓库。
- 增加构建步骤:
- 执行Shell(Linux/macOS) 或执行Windows批处理命令:
# 安装依赖(如果没在Jenkins全局环境中) pip install -r requirements.txt # 运行测试,指定输出目录 robot --outputdir ${WORKSPACE}/results --xunit xunit.xml --include smoke test_cases/ # 检查退出码,非0则构建失败 exit $?
- 执行Shell(Linux/macOS) 或执行Windows批处理命令:
- 增加构建后操作:
- Publish Robot Framework results: 安装Jenkins的Robot Framework插件后,可以配置此选项,指定
output.xml路径,Jenkins会自动解析并展示漂亮的趋势图。 - Publish JUnit test result report: 指定
xunit.xml路径,可以将RF结果转换为标准的JUnit格式,与其他工具集成。
- Publish Robot Framework results: 安装Jenkins的Robot Framework插件后,可以配置此选项,指定
- 配置触发条件:可以设置为定时构建、代码推送后构建等。
这样,每次代码提交后,Jenkins会自动拉取代码、运行指定的自动化测试套件(如冒烟测试),并根据测试结果决定是否允许后续的部署流程。测试报告会永久保存在Jenkins中,方便回溯。
注意事项:在CI环境中运行UI自动化测试(尤其是Web)是一大挑战,因为通常没有图形界面。你需要配置无头浏览器(Headless Browser)或者使用Xvfb等虚拟显示设备。对于Selenium,只需在打开浏览器时添加对应选项即可,例如
Open Browser ${URL} headlesschrome。确保你的测试环境稳定、可重复,是CI成功的关键。
7. 常见问题排查与性能优化
即使框架再成熟,在实际使用中也难免会遇到问题。下面是一些我踩过的坑和总结的经验。
7.1 高频问题速查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
导入库失败Resolving variable '${var}' failed: ...或No keyword with name 'Open Browser' found. | 1. 测试库未安装。 2. 库名称拼写错误。 3. Python环境路径问题(多版本Python)。 | 1.pip list检查库是否已安装。2. 确认 *** Settings ***中Library语句拼写正确,如SeleniumLibrary。3. 确认运行 robot命令的终端所使用的Python环境与安装库的环境是同一个。使用python -m robot来运行可以确保环境一致。 |
元素找不到/操作超时Element with locator 'id=button' not found. | 1. 定位器错误或页面元素尚未加载。 2. 页面有iframe或Shadow DOM。 3. 动态ID或类名。 | 1. 使用浏览器开发者工具重新检查元素定位器。 2. 在操作前增加显式等待: Wait Until Element Is Visible。3. 如果元素在iframe内,需先 Select Frame。4. 使用更稳定的相对定位方式,如XPath轴( //button[text()='提交'])或CSS属性选择器([data-testid='submit-btn'])。 |
| 测试报告为空或缺失 | 1. 测试执行被强制中断(Ctrl+C)。 2. 输出目录权限问题。 3. 使用了 --nooutput等选项。 | 1. 确保测试正常执行完毕。 2. 检查对输出目录是否有写权限。 3. 检查 robot命令参数,确保没有禁用报告生成。 |
| 变量作用域混乱 在某个关键字里设置的变量,在其他地方获取不到。 | 不理解RF的变量作用域。RF变量默认在创建它的作用域(测试用例、关键字、文件)内有效。 | 1.设置全局变量:使用Set Global Variable。2.传递返回值:关键字使用 [Return]返回变量,调用方用${var}=接收。3.使用变量文件:在 .py或.yaml文件中定义变量,通过Variables导入,作用域为整个导入的文件。 |
| 中文乱码 | 控制台或报告中的中文字符显示为乱码。 | 1. 确保.robot文件本身以UTF-8 without BOM编码保存。2. 在命令行执行时,可以尝试设置环境变量: set PYTHONIOENCODING=utf-8(Windows) 或export PYTHONIOENCODING=utf-8(Linux/macOS)。3. 对于日志输出,使用 Log To Console关键字并指定编码。 |
7.2 性能优化与最佳实践
- 减少不必要的浏览器启动/关闭:浏览器启动是耗时操作。对于一组相关的Web测试,使用
Suite Setup打开一次浏览器,在所有用例执行完后用Suite Teardown关闭。对于独立的用例,也要确保每个用例结束时关闭自己的浏览器(Close Browser),避免资源泄露。 - 善用标签进行测试分类和筛选:给测试用例打上清晰的标签(如
smoke,regression,slow,bug-123),可以让你在CI中快速运行核心用例,或者定期运行全量回归。避免在不需要的时候运行耗时很长的测试。 - 将静态数据外部化:不要将测试数据(如用户名、URL、产品信息)硬编码在测试脚本中。使用YAML、JSON或CSV文件来管理测试数据,并通过
Variables导入。这样数据变更时无需修改脚本。 - 编写健壮的关键字:自定义关键字时,要考虑到异常情况。使用
Run Keyword And Ignore Error或Run Keyword And Return Status来处理非关键步骤的失败。在关键字内部加入足够的日志(Log),便于调试。 - 定期维护定位器:UI自动化最大的维护成本来自于页面变化导致的定位器失效。建议为重要的UI元素添加稳定的测试属性,如
>