1. 环境准备:别急着敲代码,先把“地基”打牢

大家好,我是老张,在自动化测试这个行当里摸爬滚打了十来年,用过不少框架,RobotFramework(后面咱们就亲切地叫它RF)绝对是让新手又爱又恨的一个。爱的是它关键字驱动,写起用例来像搭积木;恨的是环境搭建这一步,经常能把人卡得没脾气。今天,我就带你从零开始,手把手把RF的环境搭起来,顺便把那些常见的“坑”提前给你填上,保证你一次成功,绝不从入门到放弃。

咱们先明确一个核心思想:RF是基于Python的。所以,整个环境的基石就是Python。很多新手一上来就去找RF的安装包,结果装了半天报一堆错,根源往往就在Python这里没弄对。我建议,无论你电脑上有没有其他Python环境,为了RF,咱们最好单独管理一个。现在最省心的方式就是直接用Python 3.9或3.10的版本,太新的版本(比如3.11+)有时候第三方库兼容性会有点小问题,咱们求稳不求新。

第一步,安装Python。 这个确实如很多教程所说,“百度一下就行”,但我得多啰嗦两句细节。去Python官网下载安装包时,记得一定要把那个“Add Python to PATH”的复选框勾上!这个选项能自动把Python和它的包管理工具pip添加到系统环境变量里,省去你后面手动配置的麻烦。安装完成后,别急着关窗口,咱们需要验证一下。打开你的命令行(Windows按Win+R,输入cmd;Mac或Linux打开终端),输入 python --versionpip --version。如果都能正确显示版本号,比如“Python 3.9.6”和“pip 21.2.4”,那恭喜你,第一步稳了。如果提示“不是内部或外部命令”,那就说明环境变量没加成功,需要你手动去系统属性里添加一下,具体步骤网上很多,这里不展开。

第二步,安装Robot Framework核心库。 这是RF的引擎。有了pip,这一步就简单得不像话。在刚才的命令行里,输入:

pip install robotframework

回车,等它刷刷刷下载安装完成就行。这里有个小技巧,因为网络原因,有时候直接用pip会慢或者超时。你可以试试国内的镜像源,速度会飞起。比如用清华的源:

pip install robotframework -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完,你可以用 pip list 命令看看,列表里有没有 robotframework 这一行,有就说明成功了。

第三步,安装图形化编辑器RIDE(可选但强烈推荐)。 RF的测试用例可以用纯文本写,但对于新手来说,有一个可视化界面来组织项目、套件、用例和关键字,会直观太多。RIDE就是这个官方编辑器。但安装它,往往是整个过程中最大的“坑点”。网上很多老教程会让你去下载一个.exe的安装包,但现在官方早就不维护那种方式了。现在最靠谱的安装方法,就是通过pip来安装。在命令行里输入:

pip install robotframework-ride

对,就这么简单。但是,在安装RIDE之前,它依赖一个叫wxPython的图形库,这个库在某些系统上(尤其是Windows)安装可能不太顺利。不过别担心,新版robotframework-ride的安装命令通常会尝试自动解决这个依赖。如果安装过程中报错提到wxPython,你可以先手动安装它:

pip install wxPython

这个包稍微大一点,耐心等待即可。全部装好后,怎么启动RIDE呢?它不会在桌面生成快捷方式。你需要在命令行里直接输入 ride.py 并回车。如果一切正常,RIDE的图形界面就会弹出来。为了方便,你可以在桌面创建一个快捷方式,目标指向你Python安装目录下的 pythonw.exe(注意是pythonw,不是python),然后参数加上 -c “from robotide import main; main()”。这样双击就能打开了。

2. 第一个项目:从“Hello World”开始理解RF架构

环境搭好了,RIDE也打开了,面对一个空白的界面,是不是有点不知所措?别慌,咱们不搞复杂的,就从创建一个最简单的项目开始,输出一句“Hello, RobotFramework!”。通过这个最小化的例子,你能把RF的核心概念一次性捋清楚。

创建项目和组织结构。 打开RIDE,点击菜单栏的 File -> New Project。会弹出一个对话框,这里就有第一个关键选择:Type。你会看到 DirectoryFile 两个选项。这俩有什么区别?我打个比方:Directory 就像一个文件夹,里面可以继续放子文件夹(测试套件)和文件(测试用例);而 File 就是一个独立的文件,通常用来存放一组相关的测试用例。对于新手,我建议第一个项目就选 Directory,这样更符合我们管理多个测试用例的习惯。给项目起个名字,比如 MyFirstRFProject,然后选择保存路径,点击 OK

项目创建好后,左边导航树里就出现了你的项目名。右键点击它,选择 New Suite。这相当于在项目文件夹里创建一个测试套件文件。注意,在弹出的窗口里,Type 这次要选 File。为什么?因为测试套件(Suite)是测试用例的直接容器,它本身就是一个 .robot 文件。我们给它起名叫 FirstSuite。现在,你的结构就是:项目(目录) -> 测试套件(.robot文件)。

接下来,在 FirstSuite 上右键,选择 New Test Case。这就是我们写具体测试步骤的地方了,起名叫 My First Test。双击这个测试用例,右边的主编辑区就激活了。

编写并运行第一个测试用例。 RF的测试用例由“关键字”(Keyword)组成。关键字可以是RF内置的,也可以是库提供的,或者你自己写的。咱们先用一个最简单的内置关键字:Log。这个关键字就是用来在控制台和生成的报告里打印信息的。在测试用例的编辑表格里,第一列输入 Log,第二列输入 Hello, RobotFramework!。对,就这么简单,一行就是一个测试步骤。

现在,点击工具栏上那个绿色的播放按钮(Run Tests),或者按 F8。RIDE会弹出一个运行配置的对话框,直接点 OK 就行。然后你会在下方看到一个输出窗口在滚动日志,最后显示绿色的 PASS。恭喜!你的第一个自动化测试脚本运行成功了。你可以点击 ReportLog 按钮,看看生成的HTML格式的详细报告和日志,里面会清晰记录我们刚才打印的那句话。

通过这个最简单的流程,你应该能感受到RF的基本架构了:项目 -> 测试套件 -> 测试用例 -> 关键字。关键字是执行动作的最小单元,而测试用例就是由一系列有序的关键字组成的。这种“搭积木”的方式,正是RF易于上手的关键。

3. 核心武器库:掌握这些关键字,你就能解决80%的问题

光会打印日志可不够。RF的强大,在于它拥有一个丰富的“关键字”生态。这些关键字主要来自两个地方:标准库(BuiltIn)和扩展库。标准库是RF自带的,开箱即用,包含了日常测试中最常用的操作。咱们先花时间把标准库里的几个“王牌”关键字玩熟,你就能应付很多基础场景了。

变量和数据类型操作。 自动化测试离不开处理数据。RF里定义变量使用 ${变量名} 的格式。设置一个变量最常用的关键字是 Set Variable。比如,在测试用例里写:

${my_name}    Set Variable    老张
Log    ${my_name}

运行后,日志里就会输出“老张”。除了标量,RF还支持列表和字典。创建列表用 Create List

@{hobbies}    Create List    读书    跑步    写代码
Log Many    @{hobbies}

注意,列表变量用 @{变量名} 表示。Log Many 关键字可以一次性打印出列表里的所有元素。创建字典用 Create Dictionary

&{person}    Create Dictionary    name=老张    age=18    job=测试开发
Log    ${person.name}

字典变量用 &{变量名} 表示,访问其中的值可以用 ${变量名.key} 的方式。

流程控制:让测试用例“活”起来。 真正的测试不可能都是顺序执行,我们需要根据条件判断或者循环执行某些步骤。RF通过关键字实现了流程控制。最常用的是 Run Keyword If,它实现了条件判断。看个例子:

${score}    Set Variable    85
Run Keyword If    ${score} >= 90    Log    优秀!
...    ELSE IF    ${score} >= 60    Log    及格。
...    ELSE    Log    再接再厉。

这个关键字后面跟着条件表达式,如果为真,就执行后面指定的关键字(这里是Log)。ELSE IFELSE是可选的分支。注意...是RF中的续行符,表示这一行和上一行是同一条语句。

循环最常用的是 FOR 循环。RF支持几种循环方式:

# 遍历一个列表
FOR    ${item}    IN    @{hobbies}
    Log    My hobby: ${item}
END

# 遍历一个数字范围
FOR    ${index}    IN RANGE    1    5
    Log    Current index is: ${index}
END

IN RANGE 的范围是左闭右开的,上面这个例子会打印1,2,3,4。

其他实用内置关键字。

  • Sleep:强制等待。Sleep 3 就是暂停3秒。虽然不推荐在自动化测试中滥用强制等待,但在某些调试或特定场景下还是需要的。
  • Get Time:获取当前系统时间。${now} Get Time
  • Evaluate:这个关键字非常强大,它允许你直接执行一段Python表达式。这意味着你可以调用任何Python的内置函数或你熟悉的库。比如:
${random_num}    Evaluate    random.randint(1, 100)    random
Log    随机数是:${random_num}

这里我们通过 modules=random 参数,导入了Python的random模块,然后调用它的randint函数。这大大扩展了RF的能力边界。

把这些关键字组合起来,你已经可以写出逻辑相当复杂的测试用例了。比如,模拟一个登录场景:先读取一个用户列表,然后循环尝试登录,根据返回结果判断是否成功,并记录日志。多动手把这些关键字在RIDE里敲一遍,感受一下它们的效果,比光看文档强十倍。

4. 打造你的专属工具:自定义关键字和资源文件

当你用内置关键字写了一些用例后,可能会发现有些操作序列经常重复,比如“登录系统”、“查询某个订单”、“退出登录”。每次都复制粘贴一堆关键字,不仅麻烦,而且一旦流程有变,修改起来就是灾难。这时候,你就需要 自定义关键字(User Keyword) 来把这些重复操作封装成一个新的、更高级的关键字。

创建和使用自定义关键字。 自定义关键字需要放在“资源文件(Resource)”里。在RIDE中,右键点击你的项目或测试套件,选择 New ResourceType 选择 File,起个名字比如 MyKeywords。创建好后,双击这个资源文件,你会发现它的编辑区和测试套件很像。在这里,我们点击 Add User Keyword 按钮。

假设我们经常需要组合“输入用户名”、“输入密码”、“点击登录”这三个步骤。我们可以创建一个叫 Login To System 的关键字。在关键字编辑区,给它添加三个步骤(这里用伪关键字示意):

[Arguments]    ${username}    ${password}
Input Text    id=username    ${username}
Input Text    id=password    ${password}
Click Button    id=login-btn

注意第一行的 [Arguments],它定义了这个关键字可以接收两个参数:用户名和密码。这样,这个关键字就变得通用了。

那么,如何在测试用例中使用它呢?首先,你需要在用到它的测试套件里,“引用”这个资源文件。在测试套件的编辑区,点击 Add Resource,然后浏览找到你刚才保存的 MyKeywords.resource 文件。引用成功后,你在测试用例里就可以像使用内置关键字一样使用 Login To System 了:

Login To System    zhangsan    123456

看,一行代码就完成了登录操作,清晰又简洁。如果登录流程以后要增加一个“验证码”步骤,你只需要去修改 Login To System 这一个自定义关键字,所有用到它的测试用例就自动更新了,这就是封装的好处。

资源文件的组织艺术。 当你的自定义关键字越来越多,一个好的实践是按照功能模块来组织资源文件。比如,你可以有 LoginKeywords.resourceOrderKeywords.resourceUserCenterKeywords.resource。然后在主测试套件中按需引用。这样结构清晰,维护起来也方便。自定义关键字是RF框架可扩展性的核心体现,也是你从“用例编写者”迈向“框架设计者”的第一步。花时间思考如何将你的测试逻辑抽象成一个个高内聚、低耦合的关键字,这会让你的自动化代码质量提升一个档次。

5. 连接真实世界:引入SeleniumLibrary做Web自动化

前面的例子都是在“自娱自乐”,真正的自动化测试最终是要操作浏览器、操作APP、调用接口的。这就需要引入RF的扩展库。其中,做Web自动化最经典、最常用的库就是 SeleniumLibrary(注意,老版本的Selenium2Library已合并至此)。它提供了一系列用于操作浏览器和网页元素的关键字。

安装与初步使用。 安装扩展库一如既往地简单,打开命令行:

pip install robotframework-seleniumlibrary

安装完成后,你不需要重启RIDE,但需要在你的测试套件中“导入”这个库。在测试套件的编辑区,点击 Add Library,在弹出的对话框中输入 SeleniumLibrary,然后点击 OK。如果导入成功,库名会显示为黑色;如果失败(比如名字拼错或没安装),会显示为红色。

现在,你就可以使用SeleniumLibrary提供的上百个关键字了。一个最基础的打开浏览器并访问网页的脚本如下:

*** Settings ***
Library    SeleniumLibrary

*** Test Cases ***
打开百度首页
    Open Browser    https://www.baidu.com    chrome
    Input Text    id=kw    RobotFramework
    Click Button    id=su
    Sleep    2
    Close Browser

我们来拆解一下:

  1. *** Settings *** 是RF的“设置区”,在这里我们通过 Library 关键字导入了SeleniumLibrary。
  2. 在测试用例中,Open Browser 关键字需要两个参数:网址和浏览器类型(需要你电脑上已安装对应的浏览器驱动,如ChromeDriver,并放在系统PATH路径下)。
  3. Input TextClick Button 是模拟用户在输入框输入文本和点击按钮。这里的 id=kwid=su 是百度首页搜索框和按钮的HTML元素定位方式。元素定位是Web自动化的核心技能,你需要配合浏览器的开发者工具(F12)来查看和获取元素的id、name、xpath等。
  4. 最后用 Close Browser 关闭浏览器。

处理常见的Web交互。 SeleniumLibrary的关键字非常丰富,几乎涵盖了所有Web交互。比如:

  • Click Element / Click Link:点击任何元素或链接。
  • Select From List By Value:从下拉列表中选择。
  • Mouse Over:模拟鼠标悬停。
  • Wait Until Page Contains Element:等待页面出现某个元素,这是处理页面加载慢、避免使用硬性Sleep的更好方式。
  • Get Text / Get Value:获取元素的文本或值,用于断言。

断言与测试验证。 自动化测试的灵魂是“验证”。RF内置了诸如 Should Be EqualShould Contain 等断言关键字,结合SeleniumLibrary获取到的页面信息,就可以完成验证。例如,在百度搜索后,我们验证页面是否包含“RobotFramework”这个词:

    ${result_text}    Get Text    id=content_left
    Should Contain    ${result_text}    RobotFramework

把上面这些关键字组合起来,你就能编写出完整的、带验证的Web端到端测试用例了。从打开浏览器,到一系列操作,再到最后的结果断言和报告生成,RF+SeleniumLibrary提供了一条完整的Web自动化解决方案。刚开始写定位器可能会遇到元素找不到的问题,别灰心,多用浏览器的开发者工具,多尝试几种定位方式(优先用id、name,其次用css selector,最后考虑xpath),这是每个自动化工程师的必经之路。

6. 让测试更智能:数据驱动与高级技巧

当你掌握了基础关键字和Web操作后,可能会面临新的挑战:如何用同一套测试逻辑,去验证不同的测试数据?比如用10组不同的用户名密码测试登录功能。这时候,数据驱动测试(Data-Driven Testing) 就是你的利器。RF原生支持一种简单而强大的数据驱动模式。

使用[Template]实现数据驱动。 在测试套件(Suite)的Settings里,有一个设置项叫 Test Template。你可以指定一个自定义关键字作为模板。然后,这个套件下的所有测试用例,就不再需要写具体的步骤了,而是变成了一行行的测试数据。我们用一个登录的例子来看: 首先,在资源文件里创建一个模板关键字 Login With Credentials

[Arguments]    ${username}    ${password}    ${expected_result}
Go To Login Page
Input Text    username_field    ${username}
Input Text    password_field    ${password}
Click Button    login_button
Run Keyword If    '${expected_result}' == 'PASS'
...    Page Should Contain    Welcome
...    ELSE
...    Page Should Contain    Login Failed

然后,在测试套件的Settings里设置模板:

*** Settings ***
Test Template    Login With Credentials

最后,创建测试用例,每一行就是一组测试数据:

*** Test Cases ***              username        password    expected_result
Valid Login                    correct_user    correct_pwd    PASS
Invalid Login - Wrong Password correct_user    wrong_pwd     FAIL
Invalid Login - Wrong Username wrong_user      correct_pwd    FAIL

运行这个测试套件,RF会自动用每一行数据去调用一次 Login With Credentials 关键字,生成三条独立的测试结果。这种方式极大地减少了代码重复,让测试逻辑和数据分离,维护起来非常清晰。

标签(Tags)的妙用。 当你的测试用例成百上千时,如何有选择地运行一部分?比如只运行冒烟测试,或者只运行某个模块的测试。RF的标签功能就是为此而生。你可以在测试用例或测试套件的Settings里,通过 Force Tags[Tags] 来打标签。

*** Test Cases ***
搜索功能测试
    [Tags]    smoke    search
    Open Browser    ${URL}    chrome
    ...    # 其他步骤
用户中心测试
    [Tags]    regression    user_center
    ...    # 其他步骤

在RIDE中运行测试时,你可以在“Run”标签页的“Only run tests with these tags”框里输入 smoke,那么就只有第一个用例会被执行。在命令行中,可以使用 --include--exclude 参数来按标签过滤,这对于集成到CI/CD流水线中非常有用。

命令行执行与报告。 虽然RIDE很方便,但在持续集成环境中,我们通常通过命令行来执行测试。RF的命令行工具 robot 功能非常强大。基础命令如下:

robot --outputdir results my_test_suite.robot

这条命令会运行 my_test_suite.robot 文件中的所有测试,并将生成的报告(output.xml)、日志(log.html)和报告(report.html)输出到 results 文件夹中。你可以组合各种参数,比如 --test 指定运行单个用例,--variable 传入变量,--loglevel DEBUG 设置更详细的日志级别等。掌握命令行执行,是你将RF测试集成到自动化流程中的关键一步。

环境搭建是起点,关键字是砖瓦,自定义关键字和资源文件是设计图,扩展库是连接外界的桥梁,而数据驱动和标签等高级特性则是让整个测试工程变得高效、可维护的工艺。RobotFramework就像一个乐高套装,提供了丰富的标准件,同时也给了你自由创造的空间。一开始可能会觉得规则稍多,但一旦熟悉了这套模式,你会发现编写和维护自动化测试用例其实可以很高效、很有条理。我见过很多团队用RF构建了成体系的自动化测试项目,从Web到API,再到移动端和数据库,它都能很好地支撑。最重要的是开始动手,遇到报错别怕,那正是学习的最好时机。RF的社区很活跃,大部分你踩的坑,网上都能找到解决方案。

更多推荐