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}
当关键字要进行更高级别的抽象时,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!
*** 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
*** 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!
*** 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
另一个答案是非常好的,对于问题的主体——用户接受测试、行为驱动测试来说,这是绝对正确的。
我想给出一个稍微不同的角度-关键字类似于软件编程中的函数/方法。
在与开发人员或其他技术人员交谈时,它总是帮助我说“关键字只是函数”,这将为深入的交谈设置正确的上下文。为了利用上面的一个例子,这个Robotframwork关键字:
看起来与POM中的python方法几乎相同(或者java,或者c#,或者-you-name):
将值传递给关键字是调用带有参数的函数,返回值也是:
模拟法:
需要强调的是,在Robotframework语法中创建的关键字是函数,而不是方法——它们不是存储状态的对象的一部分,因此它们的交叉通信是通过当前作用域中的共享变量进行的;这将推到过程式的,而不是面向对象的编程。
当关键字要进行更高级别的抽象时,Robotframework的美妙之处就真正闪耀了出来——例如,顶级关键字
The account is terminated
在其实现中对关键字The account is not present in the Users page
和No DB record for the account
进行了调用,每个关键字中都有较低级别和较低级别的关键字调用。这在很大程度上有助于维护性、实现更改和调试,同时顶层使用保持不变;这种方法也是良好软件设计的一个特性,有助于将类比关键字作为功能传递给软件开发人员。
概述
将关键字看作一个测试步骤。正如测试在概念上由许多步骤组成一样,机器人测试也由许多关键字组成。关键字是所有机器人测试的基础。
robot提供了一些通用关键字,您可以自己创建一些特殊用途的关键字。robot框架的真正强大之处在于,当您创建自己的关键字时,测试可以集中于测试逻辑而不是底层实现。
例如,让我们考虑一下登录到服务器的验收测试是什么。从敏捷产品所有者或首席设计师的角度来看,它可能是这样的:
这可能是产品所有者在故事卡或票证跟踪系统中添加的验收标准。如果这是一个真正的测试,有人可以运行,不是很好吗?
示例测试用例
这些步骤中的每一个都可以看作是一个关键字。robot的一个优点是,您可以编写一个看起来与原始规范几乎相同的测试:
关键字实现示例
要运行此测试用例,您需要定义这些关键字,因为robot不知道“打开浏览器到超级网站2000!”手段。您可以用python或其他几种语言编写它们,也可以通过组合现有关键字来编写它们。
例如,前几个关键字可以使用Selenium2Library关键字来实现,例如:
如您所见,您可以使用关键字来生成非常可读的测试用例。关键字可以使用其他关键字进行设计,也可以使用编程语言编写关键字。
没有自定义关键字的可选示例
当然,你不必写这样的关键词。您可以在测试中直接使用selenium2库关键字,这将使您的测试看起来像这样:
就我个人而言,我认为测试的第一个版本可读性要高得多,代价是必须维护一些自定义关键字。
自定义关键字的优点
通过使用关键字,您可以隐藏web页面实现的详细信息,这样您就可以专注于测试的逻辑。另外,多个测试可以重用相同的关键字。
实现的实际细节(元素id、url等)都可以嵌入到关键字中。如果这些细节改变了,就不必改变任何测试用例。相反,更改关键字,测试将继续运行。想象一下,如果开发人员将输入的id更改为
username_form_field
和password_form_field
——您是想编辑每个必须登录的测试用例,还是想编辑所有测试共享的一个或两个关键字?变量
机器人框架中的变量非常强大。例如,您可以在一个地方定义站点的根URL,而不是在每次测试中对其进行硬编码。对于大多数生产站点,您必须使用两个、三个或更多的url运行测试。例如,您可能有一个本地开发框、一个qa框、一个暂存框和一个生产框。
Robot允许您重写命令行或参数文件中的变量。这意味着您可以创建一组在多个系统上工作的测试。例如,要在登台时使用firefox运行测试,您可以这样做(为了清晰起见,可以分成多行):
要使用chrome在QA1上运行完全相同的测试,可以执行以下操作:
图书馆
简单地说,关键字被组织到库中。Robot有很多图书馆,在互联网上还有更多的图书馆。
库可以用robot语法编写,就像在这些考试中一样但是库也可以用python和java等编程语言编写。使用编程语言可以实现复杂的逻辑,使用robot语言可以更容易地将现有关键字组合成新关键字。
敏捷环境中的关键词
如果你在一个scrum团队中工作,关键字驱动的方法可以帮助团队变得非常高效。例如,如果您的测试人员不是很熟练,开发人员可以创建一个与测试交互的关键字库,这样测试人员就不必担心页面的细节。
另一方面,如果您有高技术的测试人员,他们可以自己承担编写关键字的任务,这样开发人员就可以在实际的产品上花费更多的时间。
在这两种情况下,关键字驱动的方法使qa和开发团队能够一起创建高质量的产品。
相关问题 更多 >
编程相关推荐