繁体   English   中英

Robot Framework中的关键字是什么?

[英]What is a keyword in Robot Framework?

我在任何地方都找不到解释。 即使在介绍关键字的教程中,也没有解释我将如何从该概念中受益。

因此,为了明确我的问题:假设我有一个客户端和一个我编程的服务器。 我想使用 Robot Framework 来测试它们是否协同工作。 “关键字”在哪里适合这里? 这可以用简单抽象的测试术语来解释吗?

PS:非常感谢解释其他概念,例如库和变量(尽管它们看起来很明显)。

概述

将关键字视为单个测试步骤。 正如测试在概念上由许多步骤组成一样,机器人测试由许多关键字组成。 关键字是构建所有机器人测试的基础。

有机器人提供的通用关键字,也有您可以自己创建的专用关键字。 机器人框架的真正威力在于当您创建自己的关键字时,测试可以专注于测试逻辑而不是底层实现。

例如,让我们考虑登录到您的服务器的验收测试可能是什么。 从敏捷产品所有者或首席设计师的角度来看,它可能如下所示:

  1. 打开浏览器访问 Super Website 2000!
  2. 输入有效的用户名
  3. 输入有效密码
  4. 点击“前往”按钮
  5. 您应该在仪表板页面上

这可能是产品所有者在故事卡或票证跟踪系统中添加的验收标准。 如果这是一个有人可以运行的实际测试,那不是很好吗?

示例测试用例

这些步骤中的每一个都可以被视为一个关键字。 机器人的一大优点是您可以编写一个看起来与原始规范几乎相同的测试:

*** Test Cases ***
Login of an existing customer
    [Setup]     Open a browser to Super Website 2000!
    [Teardown]  close all browser windows

    Enter a valid username
    Enter a valid password
    Click the GO button
    You should be on the dashboard page

关键字实现示例

为了运行这个测试用例,你需要定义这些关键字,因为机器人不知道“打开浏览器到超级网站 2000!”是什么意思。 方法。 您可以使用 python 或其他几种语言编写它们,也可以通过组合现有关键字来编写它们。

例如,前几个关键字可以使用Selenium2Library关键字实现,如下所示:

*** Settings ***
Library    Selenium2Library

*** Variables ***
${ROOT}     http://super.website2000.com
${BROWSER}  chrome

*** Keywords ***
Open a browser to Super Website 2000!
    # this is a pre-defined Selenium2Library keyword
    Open browser  ${ROOT}    ${BROWSER}

Enter a valid username
    # these are pre-defined Selenium2Library keywords
    wait until element is visible    id=username_input
    input text    id=username_input  Test User #1

Enter a valid password
    # these are pre-defined Selenium2Library keywords
    wait until element is visible      id=password_input
    input text    id=password_input    LetMeIn!

如您所见,您可以使用关键字来制作非常易读的测试用例。 可以使用其他关键字设计关键字,也可以使用编程语言编写关键字。

没有自定义关键字的替代示例

当然,您不必像这样编写关键字。 您可以在测试中直接使用 Selenium2Library 关键字,这将使您的测试看起来像这样:

*** Test Cases  ***
Login of an existing customer
    [Setup]      Open browser  ${ROOT}    ${BROWSER}
    [Teardown]   close all browsers

    wait until element is visible      id=username_input
    input text    id=username_input    Test User #1
    wait until element is visible      id=password_input
    input text    id=password_input    LetMeIn!
    wait until element is enabled      id=submit_button
    click button  id=submit_button
    wait until element is visible      id=//div[@class='dashboard']
    location should be  ${ROOT}/dashboard

我个人认为测试的第一个版本更具可读性,代价是必须维护一些自定义关键字。

自定义关键词的优势

通过使用关键字,您可以隐藏网页实现的细节,以便您可以专注于测试的逻辑。 另外,多个测试可以重用相同的关键字。

实现的实际细节(元素 ID、URL 等)都可以嵌入到关键字中。 如果这些细节发生变化,您不必更改任何测试用例。 相反,您更改关键字,您的测试将继续运行。 想象一下,如果开发人员将输入的 id 更改为username_form_fieldpassword_form_field -- 您是要编辑每个必须登录的测试用例,还是要编辑所有测试共享的一两个关键字?

变量

机器人框架中的变量非常强大。 例如,您可以在一个位置定义站点的根 URL,而不是在每个测试中对其进行硬编码。 对于大多数生产站点,您必须使用两个、三个甚至更多 URL 运行测试。 例如,您可能有一个本地开发箱、一个 qa 箱、一个暂存箱和一个生产箱。

Robot 允许您覆盖命令行或参数文件中的变量。 这意味着您可以创建一组适用于多个系统的测试。 例如,要在登台时使用 firefox 运行测试,您可以这样做(为了清楚起见,分成多行):

$ pybot \
   --variable ROOT:http://staging.example.com \
   --variable BROWSER:firefox \
   /path/to/tests

要使用 chrome 在 QA1 上运行完全相同的测试,您可以这样做:

$ pybot \
   --variable ROOT:http://qa1.example.com \
   --variable BROWSER:chrome \
   /path/to/tests

图书馆

简而言之,关键字被组织到库中。 Robot 带有许多库,互联网上还有更多库。

库可以像这些示例中那样用机器人语法编写,但库也可以用 Python 和 java 等编程语言编写。 使用编程语言可以完成复杂的逻辑,使用机器人语言可以让您更轻松地将现有关键字组合成新的关键字。

敏捷环境中的关键词

如果您在 Scrum 团队中工作,关键字驱动的方法可以帮助团队变得非常高效。 例如,如果您的测试人员技能不高,开发人员可以创建一个关键字库与测试交互,这样测试人员就不必担心页面的细节。

另一方面,如果您有技术含量高的测试人员,他们可以自己承担编写关键字的任务,以便开发人员可以将更多时间花在实际产品上。

在这两种情况下,关键字驱动的方法使 qa 和开发团队能够协同工作以创建高质量的产品。

另一个答案非常好,就问题的主体而言——对于用户验收测试、行为驱动测试,绝对如此。
我想给出一个稍微不同的角度 - 关键字类似于软件编程中的函数/方法。

在与开发人员或其他技术人员交谈时,它总是帮助我说“关键字只是功能”,这将为深入交谈设置正确的上下文。 为了搭载上述示例之一,这个 Robotframework 关键字:

Enter a valid username
    # these are pre-defined Selenium2Library keywords
    wait until element is visible    id=username_input
    input text    id=username_input  Test User #1

看起来与 POM 中的 python 方法(或 java、c# 或 - 你命名)几乎相同:

def enter_a_valid_username(self):
    self.driver_instance.wait_until_element_is_visible('id=username')
    self.driver_instance.input_text('id=username_input', 'Test User #1')

将值传递给关键字是调用带参数的函数,因此返回值:

Attempt to login with user and password
    [Documentation]   Enters the provided user and password, clicks the "Login" button, and returns boolean True/False is the user logged in.
    [Arguments]    ${user}    ${pass}
    wait until element is visible    id=username_input
    input text    id=username_input  ${user}
    input text    id=password_input  ${pass}
    click button  id=submit_button

    ${success}=   Run Keyword And Return Status     Dashboard Page Should Be Opened
    [Return]    ${success}

模拟作为一种方法:

def attempt_login(self, user, pass):
    self.driver_instance.wait_until_element_is_visible('id=username')
    self.driver_instance.input_text('id=username_input', user)
    self.driver_instance.input_text('id=password_input', pass)
    self.driver_instance.click_button('id=submit_button')

    try:
        self.dashboard_is_opened()
        return True
    except IncorrectPageException:
        return False

需要强调的是,Robotframework 语法中创建的关键字是函数,而不是方法——它们不是存储状态的对象的一部分,因此它们的交叉通信是通过当前范围内的共享变量; 这推动了程序化,而不是面向对象的编程。


当关键字进入更高级别的抽象时,Robotframework 的美丽真正闪耀 - 例如顶级关键字The account is terminated在其实现中调用了关键字The account is not present in the Users page并且No DB record for the account ,它们中的每个都有较低级别和较低级别的关键字调用。

The account is terminated
 |
 \--> | The account is not present in the Users page
 |    \--> | Go to the Users page
 |         \--> | ${location}=    Get Location
 |         |    | Run Keyword If  '${location}' != '${url users page}'    Go To  '${url users page}'
 |         |    | The Users Page Is Opened
 |         |     \-->  | # checks the currently opened page is Users 
 |         |           | ...
 |         | ${users}=  Get All Users
 |         | ...
 |
 \--> | No DB record for the account
           | ${users}=  Get All DB Accounts 
           |            \--> | Connect To The DB
           |                 | ${DB data}=  Execute Query  SELECT * FROM users;  # etc
           |                 | ...
           | Should Not Contain   ${users}   ${the user}  msg=The user is still present!

这极大地有助于可维护性、实现更改和调试,同时顶级用法保持不变; 这种方法也是良好软件设计的一个属性,有助于将类比关键字是功能传递给软件开发人员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM