Robot Framework中的关键字是什么?

时间:2017-02-17 21:31:43

标签: python python-3.x robotframework

我无法在任何地方找到解释。即使在引入关键字的tutorial中,它也无法解释我将如何从这个概念中受益。

所以要明确我的问题:说我有一个我编程的客户端和服务器。我想使用Robot Framework来测试它们的协同工作。 "关键字"适合这里?这可以用简单和抽象的测试术语来解释吗?

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

2 个答案:

答案 0 :(得分:9)

概述

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

机器人提供了通用关键字,您可以自己创建特殊用途的关键字。机器人框架的真正强大之处在于您创建自己的关键字,以便测试可以专注于测试逻辑而不是底层实现。

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

  1. 打开浏览器到Super Website 2000!
  2. 输入有效的用户名
  3. 输入有效密码
  4. 点击" Go"按钮
  5. 您应该在仪表板页面上
  6. 这可能是产品所有者在故事卡或故障单跟踪系统中添加为验收标准的字面意思。如果这是一个有人可以运行的实际测试,那会不会很好?

    示例测试用例

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

    *** 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
    

    关键字实施示例

    要运行此测试用例,您需要定义这些关键字,因为机器人不知道"打开浏览器到Super Website 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
    

    简而言之,关键字被组织到库中。机器人附带了许多图书馆,互联网上还有更多图书馆。

    库可以用这些示例中的机器人语法编写,但库也可以用编程语言编写,例如python和java。使用编程语言可以执行复杂的逻辑,使用机器人语言可以更轻松地将现有关键字组合成新的关键字。

    敏捷环境中的关键字

    如果您正在开发Scrum团队,那么关键字驱动的方法可以帮助团队提高效率。例如,如果您的测试人员技能不高,开发人员可以创建一个关键字库,用于与测试进行交互,以便测试人员不必担心页面的详细信息。

    另一方面,如果您拥有高技术测试人员,他们可以承担编写关键字本身的任务,以便开发人员可以将更多时间用于实际产品。

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

答案 1 :(得分:0)

另一个答案非常好,而且要针对问题的实质-对于用户接受度测试,行为驱动测试,绝对是这样。
我想提出一个稍微不同的角度-关键字是软件编程中函数/方法的类似物。

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

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语法创建的关键字是函数,而不是方法-它们不是存储状态的对象的一部分,因此它们的交叉通信是通过当前范围内的共享变量实现的;这推动了程序性的,而不是面向对象的编程。


当关键字要进行更高级别的抽象时,例如,顶层关键字The account is terminated在其实现中具有对关键字The account is not present in the Users pageNo 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!

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