3、第一个测试用例:编写并运行简单的测试用例,理解测试用例的组成(关键字、参数、返回值)与执行流程

在掌握了 Robot Framework 的环境搭建与基础语法之后,我们正式进入自动化测试的核心实践环节。本章将带领你从零编写并运行第一个完整的测试用例,深入剖析测试用例的三大组成要素——关键字、参数与返回值,并梳理从用例编写到报告生成的完整执行流程。理解这些基础概念,是后续构建复杂测试套件、设计数据驱动测试和封装业务关键字的基石。

测试用例执行链路与组成要素 测试用例文件 *.robot *** Settings *** *** Variables *** *** Test Cases *** *** Keywords *** Robot 执行引擎 解析语法 匹配关键字 传递参数 收集返回值 记录执行状态 关键字库 BuiltIn (内置) SeleniumLibrary 自定义用户关键字 参数/返回值契约 输出结果 output.xml log.html report.html ① 关键字 (Keyword) 操作的最小单元 如: Log, Should Be Equal 分为内置/库/用户自定义 命名规范: 空格分隔, 大小写不敏感 示例: Log Message ② 参数 (Argument) 传递给关键字的数据 位置参数 / 命名参数 支持变量 ${var} 与标量 示例: Log ${message} level=WARN 参数类型: 字符串/数字/列表/字典 ③ 返回值 (Return) 关键字执行后的结果 通过 ${result} 接收 用于断言或后续操作 示例: ${count}= Get Element Count 返回值可继续作为参数传递 三者协同完成测试逻辑

3.1 测试用例的核心组成:关键字、参数与返回值

Robot Framework 的测试用例本质上是一系列关键字(Keyword)的调用序列。关键字是执行特定操作的最小单元,它可以是框架内置的(如 Log、Should Be Equal),也可以来自第三方测试库(如 SeleniumLibrary 中的 Open Browser),还可以是用户自定义的关键字。每个关键字都可以接收参数(Argument)来定制其行为,并在执行后返回返回值(Return Value)供后续步骤使用。

理解三者的关系是编写有效测试用例的前提。关键字定义了“做什么”,参数定义了“怎么做”,返回值则提供了“结果如何”的证据。例如,Should Be Equal 关键字接收两个参数(期望值和实际值),如果两者不一致,该关键字会抛出断言错误,导致测试用例失败。这种设计使得测试用例的意图非常清晰,且易于维护。

组成要素作用典型示例注意事项
关键字执行具体操作或断言Log, Run Keyword If关键字名称不区分大小写,但建议使用可读性强的命名
参数向关键字传递输入数据Log ${message}参数之间用两个以上空格分隔;支持变量与转义
返回值获取关键字执行后的结果${result}= Get Text使用 ${var}= 语法接收;返回值可直接用于断言
经验提醒:在编写测试用例时,尽量将业务操作封装为“用户关键字”,而测试用例本身只保留“业务步骤描述”和“断言”。这样既能提高可读性,又能减少重复代码。例如,将“登录系统”封装为一个关键字,传入用户名和密码两个参数,返回登录是否成功的布尔值。

3.2 编写第一个测试用例:从需求到脚本

我们以一个最简单的场景为例:验证两个数字相加的结果。这个场景虽然简单,但完整地展示了测试用例的编写规范和执行流程。首先,我们需要创建一个 .robot 文件,并在其中定义测试套件(Suite)和测试用例(Test Case)。

*** Settings ***
Documentation    这是一个简单的数学运算测试套件
Library          Collections

*** Variables ***
${NUMBER_A}    10
${NUMBER_B}    20

*** Test Cases ***
验证两个数字相加
    [Documentation]    验证 10 + 20 的结果等于 30
    [Tags]    smoke    math
    ${sum}=    Evaluate    ${NUMBER_A} + ${NUMBER_B}
    Should Be Equal As Integers    ${sum}    30
    Log    ${sum}    计算完成

在上述代码中,*** Settings *** 部分引入了 Collections 库(虽然本例未直接使用,但展示了库的导入方式)。*** Variables *** 定义了全局变量。*** Test Cases *** 下是具体的测试用例。用例中,Evaluate 关键字执行 Python 表达式并返回结果,Should Be Equal As Integers 断言返回值与期望值相等,Log 关键字将结果输出到日志。

运行该测试用例的命令非常简单:在终端中切换到文件所在目录,执行 robot 文件名.robot。Robot Framework 会自动解析文件,执行用例,并生成 output.xml、log.html 和 report.html 三个文件。其中,report.html 是概要报告,log.html 是详细日志,包含每个关键字的执行时间、参数和状态。

执行流程拆解:
  1. 解析阶段:Robot Framework 读取 .robot 文件,识别表格结构(Settings、Variables、Test Cases 等),并检查语法错误。
  2. 数据绑定:将 *** Variables *** 中定义的变量与测试用例中的 ${NUMBER_A} 等占位符进行绑定。
  3. 执行阶段:按顺序执行测试用例中的每一行关键字。每个关键字执行前,框架会记录开始时间;执行后,记录结束时间、状态(PASS/FAIL)和可能的返回值。
  4. 断言与日志:当执行到 Should Be Equal As Integers 时,框架会比较两个参数。若相等,则继续;若不相等,则抛出异常,该用例标记为 FAIL,后续关键字不再执行。
  5. 报告生成:所有用例执行完毕后,框架汇总结果,生成 XML 和 HTML 格式的报告。

3.3 案例拆解:一个带前置条件与清理步骤的完整用例

在实际项目中,测试用例往往需要前置条件(Setup)和清理步骤(Teardown)。例如,测试一个 Web 登录功能,我们需要先打开浏览器,测试结束后关闭浏览器。Robot Framework 提供了 [Setup] 和 [Teardown] 来管理这些步骤。下面是一个更贴近实战的案例:

*** Settings ***
Library    SeleniumLibrary
Test Setup       Open Browser    https://example.com/login    chrome
Test Teardown    Close All Browsers

*** Variables ***
${VALID_USER}    admin
${VALID_PWD}     secret123

*** Test Cases ***
用户使用有效凭证登录
    [Documentation]    验证有效用户能够成功登录
    [Tags]    login    regression
    Input Text    id=username    ${VALID_USER}
    Input Text    id=password    ${VALID_PWD}
    Click Button    id=login-btn
    Wait Until Page Contains    Welcome, admin
    Page Should Contain    Dashboard

在这个案例中,Test Setup 和 Test Teardown 定义了每个测试用例执行前后的固定操作。测试用例本身只关注业务步骤:输入用户名、输入密码、点击登录、验证页面内容。这种结构将“环境准备”与“业务验证”分离,大大提高了用例的稳定性和可维护性。

我们来看一下执行过程中的关键数据流:Input Text 关键字接收两个参数(定位器和输入值),Click Button 接收一个参数(定位器),Wait Until Page Contains 接收一个参数(期望出现的文本)。这些关键字执行后,SeleniumLibrary 会返回操作结果(成功或失败),但通常我们不需要显式接收返回值,因为如果操作失败,关键字会直接抛出异常,导致用例失败。

关键字参数返回值失败行为
Open BrowserURL, Browser无(或浏览器索引)无法打开时抛出异常
Input Textlocator, text无元素未找到时抛出异常
Click Buttonlocator无点击失败时抛出异常
Wait Until Page Containstext, timeout无超时未出现时抛出异常
Page Should Containtext无断言失败时抛出异常
风险提示:在编写测试用例时,不要忽略 [Teardown] 的重要性。如果测试中途失败,没有 Teardown 会导致浏览器进程残留,影响后续测试执行。此外,Test Setup 中的操作如果失败,该用例会直接标记为 FAIL,且不会执行用例体中的任何步骤。

3.4 常见误区与执行流程复盘

初学者在编写第一个测试用例时,常会遇到以下几类问题:

  • 空格使用不当:Robot Framework 使用两个或更多空格作为参数分隔符。如果只使用一个空格,框架会将整个内容视为一个参数,导致关键字找不到或参数错误。
  • 变量作用域混淆:在 *** Variables *** 中定义的变量是全局的,而在测试用例中通过 ${var}= 创建的变量是局部于该用例的。如果需要在多个用例间共享数据,应使用 Suite 或 Global 级别的变量。
  • 忽略返回值:有些关键字(如 Get Text)会返回页面上的文本内容。如果不接收返回值,就无法进行后续断言。正确的做法是使用 ${text}= Get Text 语法。
  • 断言不充分:只验证操作成功(如点击按钮)而不验证结果(如页面跳转、数据变化),会导致测试用例失去意义。应始终使用 Should ... 系列关键字进行结果验证。

为了帮助大家更好地理解执行流程,我们复盘一个典型的失败场景:假设上述登录用例中,Input Text 的定位器 id=username 写错了,实际页面的 id 是 user-name。执行流程如下:

  1. Test Setup 打开浏览器,成功。
  2. 执行 Input Text,SeleniumLibrary 尝试查找 id=username 元素,未找到。
  3. 关键字抛出 Element not found 异常,该用例立即终止。
  4. Test Teardown 执行,关闭所有浏览器。
  5. 用例状态为 FAIL,报告和日志中记录了失败原因和堆栈信息。

通过查看 log.html,我们可以清晰地看到每个关键字的执行状态、耗时和错误信息。这正是 Robot Framework 强大的可调试性所在。建议读者在编写用例后,养成查看日志的习惯,尤其是关注 FAIL 关键字前后的上下文。

总结复盘:编写第一个测试用例的核心目标是建立“关键字驱动”的思维模式。不要急于编写复杂的业务逻辑,而是先掌握如何用关键字组合出简单的验证流程。记住三个关键点:一是参数传递要准确,二是返回值要善用,三是断言要到位。当你能够熟练地阅读 log.html 并快速定位失败原因时,你就已经迈入了 Robot Framework 自动化测试的大门。