Robot框架中的关键字是什么?

2024-04-27 17:05:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: 服务器框架概念客户机编程机器人关键字协同工作
2条回答

另一个答案是非常好的,对于问题的主体——用户接受测试、行为驱动测试来说,这是绝对正确的。
我想给出一个稍微不同的角度-关键字类似于软件编程中的函数/方法。

在与开发人员或其他技术人员交谈时,它总是帮助我说“关键字只是函数”,这将为深入的交谈设置正确的上下文。为了利用上面的一个例子,这个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#,或者-you-name):

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

这在很大程度上有助于维护性、实现更改和调试,同时顶层使用保持不变;这种方法也是良好软件设计的一个特性,有助于将类比关键字作为功能传递给软件开发人员。

概述

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

robot提供了一些通用关键字,您可以自己创建一些特殊用途的关键字。robot框架的真正强大之处在于,当您创建自己的关键字时,测试可以集中于测试逻辑而不是底层实现。

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

  1. 打开超级网站2000的浏览器!
  2. 输入有效的用户名
  3. 输入有效密码
  4. 点击“开始”按钮
  5. 你应该在仪表板页面上

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

示例测试用例

这些步骤中的每一个都可以看作是一个关键字。robot的一个优点是,您可以编写一个看起来与原始规范几乎相同的测试:

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

关键字实现示例

要运行此测试用例,您需要定义这些关键字,因为robot不知道“打开浏览器到超级网站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!

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

没有自定义关键字的可选示例

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

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

就我个人而言,我认为测试的第一个版本可读性要高得多,代价是必须维护一些自定义关键字。

自定义关键字的优点

通过使用关键字,您可以隐藏web页面实现的详细信息,这样您就可以专注于测试的逻辑。另外,多个测试可以重用相同的关键字。

实现的实际细节(元素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有很多图书馆,在互联网上还有更多的图书馆。

库可以用robot语法编写,就像在这些考试中一样但是库也可以用python和java等编程语言编写。使用编程语言可以实现复杂的逻辑,使用robot语言可以更容易地将现有关键字组合成新关键字。

敏捷环境中的关键词

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

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

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

相关问题 更多 >