帅哥写的robotframework最佳测试用例准则

这是一篇描述怎么用 Robot Framework 来编写优秀测试用例的高级指南。

至于如何使用 Robot Framework 来与您的待测试系统相作用这样的细节讨论是不包含在这篇文档中的。

最重要的一条原则就是保证测试用例对于(不?)熟悉这个领域的人来讲越简单越好。 同样也需要容易维护。

关于这个主题的更多信息,你可以查看以下这些优秀的资源:
Robot Framework Dos and Don’ts
Writing Maintainable Automated Acceptance Tests 作者:Dale H. Emery
How to Structure a Scalable And Maintainable Acceptance Test Suite 作者:Andreas Ebbert-Karroum

为什么要翻译这一篇呢,还不是因为作者的颜值高,嗯。(其实一共有三个人,但是只有他有头像)

pekka.png

命名
测试套件(Test suite)的命名
套件的名称应该尽可能地描述这个套件的用途。
名称可以相对长一些,但是如果超过40个字那也太长了一些。
套件名称是直接从文件/目录的名字转换来的。 文件的后缀名被去掉了
下划线会被转换成空格
如果你的用到的单词都是小写的,那么开头字母会被转换成大写的

比如
login_tests.robot -> Login Tests
IP_v4_and_v6 -> IP v4 and v6


测试用例(Test case)的命名
测试用例的名字应该与套件的名字描述相似。

如果一个套件里包含了好多个相似的测试用例,而且测试套件本身已经很好地命名了,那么用例的名称可以简短一些。

在测试用例文件中的名称应该恰好表达了你需要做什么。

例如,我们要在一个名为invalid_login.robot脚本中编写关于无效登陆的功能,下面的名字就可以:

*** Test Cases ***
Empty Password
Empty Username
Empty Username And Password
Invalid Username
Invalid Password
Invalid Username And Password

下面的名字就会有点长了:

*** Test Cases ***
Login With Empty Password Should Fail
Login With Empty Username Should Fail
Login With Empty Username And Password Should Fail
Login With Invalid Username Should Fail
Login With Invalid Password Should Fail
Login With Invalid Username And Invalid Password Should Fail

关键词(Keyword)命名
同样的,关键词的名称也应该是清晰具体的。

应该可以表达这个关键词干了什么,而不是它如何去做。
关键词应该是非常不同的抽象层次(比如,「输入字符」或者「用户登录到系统」)。

没有明确的规定

Good:
*** Keywords ***
Login With Valid Credentials

Bad:
*** Keywords ***
Input Valid Username And Valid Password And Click Login Button

--
Setup和Teardown的命名
试着用名称来描述这个步骤完成了什么。 或许你可以用一个已经存在的关键词

如果Setup或者Teadown包含了不相关的步骤,那么可以接受更抽象一点的名称。
在名称中列举步骤是一个重复化和维护的问题(比如:登入系统,添加用户,激活警报和检查平衡)。
或许需要用到一些通用一些的名称比如「初始化系统」

如果关键字需要执行的低级步骤已经存在,BuiltIn 关键字中的Run Keywords可以帮你很好的执行它
Setup和Teardown脚本只需要运行一次的时候,这样不会出现重复

让每个用到这几个测试用例的人都需要明白这几个Setup或者Teardown动作是干什么的。

Good:

*** Settings ***
Suite Setup     Initialize System

Good (如果只用一次):

*** Settings ***
Suite Setup     Run Keywords
...             Login To System    AND
...             Add User           AND
...             Activate Alarms    AND
...             Check Balance

Bad:

*** Settings ***
Suite Setup     Login To System, Add User, Activate Alarms And Check Balance

文档
测试套件(Test suite)的文档
通常把文档添加到包含测试用例的最底层套件中是一个不错的想法。 高层的套件不需要那么频繁地文档化。

文档应该包含必要的背景信息,比如为什么要创建这些测试用例,测试环境中需要注意的点等等。
文档内容不要只是简单地重复套件的名称。 如果不是真的有文档还不如不添加文档。

文档的内容不要包含关于测试用例的太详细的信息。 测试用例本身就应该足够清楚易懂了。
重复的信息是一种浪费,而且也不容易维护。

文档中可以添加一些详细内容的链接。
如果你需要在文档中添加一些比如(版本:1.0 或者 OS:Linux)这样的「名称-值」组的话,可以考虑使用测试套件 metadata

Good:

*** Settings ***
Documentation    Tests to verify that account withdrawals succeed and
...              fail correctly depending from users account balance
...              and account type dependent rules.
...              See http://internal.example.com/docs/abs.pdf
Metadata         Version    0.1

Bad (特别是如果测试套件刚好命名为 account_withdrawal.robot):

*** Settings ***
Documentation    Tests Account Withdrawal.

测试用例(Test case)的文档
测试用例通常来说不需要文档。 套件名称和文档以及用例的名称已经提供了足够的背景信息。
测试用例的结构应该是不需要文档或者其他注释都足够清楚了的。

Tag 通常比文档更灵活,还能提供更多的功能(比如:统计,包含/排除等)。(CC先生说:Tag更多的时候是执行的时候可以有效的筛选。)

当测试用例的文档是有用的时候,没有必要去害怕它。

Good:

*** Test Cases ***
Valid Login
    [Tags]    Iteration-3    Smoke
    Open Login Page
    Input Username    ${VALID USERNAME}
    Input Password    ${VALID PASSWORD}
    Submit Credentials
    Welcome Page Should Be Open

Bad:

*** Test Cases ***
Valid Login
    [Documentation]    Opens a browser to login url, inputs valid username
    ...                and password and checks that the welcome page is open.
    ...                This is a smoke test. Created in iteration 3.
    Open Browser    ${URL}    ${BROWSER}
    Input Text    field1    ${UN11}
    Input Text    field2    ${PW11}
    Click Button    button_12
    Title Should Be    Welcome Page

用户自定义关键词(User keyword)文档
如果这个关键词非常简单明了的话,不需要文档。 好的名称和明确的结构就足以说明一切了。

用户自定义关键词文档的一个重要的用途是用来记录参数和返回值的信息。
RIDE(比如在关键词补全的地方)以及在资源文件中显示的文档是由 libdoc.py 生成的。


测试套件(Test suite)的结构
在套件中的用例应该是互相相关的。 如果测试用例拥有同样的Setup或者Teardown部分,那么他们应该是属于一个套件的。

除非是数据驱动(data-driven tests)的,在一个套件中不要放10个以上的测试用例。
测试用例应该是独立的。用Setup和Teardown来初始化他们。
有时候测试用例之间无法避免地相关联 比如说,它可能是因为把所有的用例独立出来要化太多的时间在初始化上。
相关联的测试用例就那么几个(最多4到5个)
下一个用例是用来验证上一个用例的结果的。(用${PREV TEST STATUS} 这个变量)\


测试用例(Test case)的结构
测试用例应该是易懂的。
一个测试用例只测试一件事情。 当然,事情本身可大可小。

选择一个合适的抽象层面。 一致地使用抽象水平(单一水平的抽象原则)
只包含与测试相关的信息。

用例可以分为两种 工作流程的测试用例

  • 数据驱动的测试用例

  • 工作流程的测试用例

数据驱动的测试用例

  • 通常来说有以下这些部分:

    • 前置条件(可选,通常在Setup部分)
    • 动作 (对被测系统执行一些动作)
    • 验证 (必须有一个验证的部分!)
    • 清理 (可选,通常在Teardown部分,以保证用例已经执行完毕)
  • 关键词是用来描述这个用例做了什么。

    • 用清晰的关键词名称和合适的抽象层次。
    • 应该包含足够的信息使得手动执行可以启动。
    • 应该从来不需要文档或者沟通来告诉你这个用例在做什么。
  • 不同的用例可以有不同的抽象层次。

    • 详细的功能测试是更精确的。
    • 端到端的测试可以是一个很高的抽象层次。
    • 一个测试用例应该只使用一种抽象层次。
  • 不同的风格

    • 对于底层的详细测试和集成测试用例来讲应该是更关注技术细节。
    • [可执行规范」作为要求。
    • 使用本领域的语言(估计是说专业术语)。
    • 所有人(包括顾客和产品负责人)都应该可以看明白。
  • 测试用例级别没有复杂的逻辑

    • 不用 for 循环或者 if/else 判断结构。
    • 小心给变量赋值。
    • 测试用例不应该看起来像脚本一样难读。
  • 最多10步,越少越好。

使用“正常”关键字驱动的风格:

*** Test Cases ***
Valid Login
    Open Browser To Login Page
    Input Username    demo
    Input Password    mode
    Submit Credentials
    Welcome Page Should Be Open

使用更高级别的“gherkin”风格:

*** Test Cases ***
Valid Login
    Given browser is opened to login page
    When user "demo" logs in with password "mode"
    Then welcome page should be open

上面的例子你可以参考web demo project

(CC先生说:Gherkin是一种语法,使用Given,when,then等关键来描述一个User Story,也就是平时经常所说道的行为驱动的模式)


数据驱动的测试用例

  • 每个测试用例有一个高层次的关键词。

    • 不同的参数创建不同的测试。
    • 一个测试可以运行相同的关键字多次来验证多种关联的变化
  • 如果关键字是由用户关键字来实现的,那他通常包含类似工作流 的工作流测试,如果还需要用到其他地方,用一个测试文件创建它比较好

  • 推荐使用测试模板功能。 不需要多次地去重复关键词。

    • 在一个用例里去测试更容易去测试多种变化。
    • 如果可能,推荐在列头部命名。
    • 如果需要一个非常大的数据的测试,可以考虑用一个外部模块来生成他们

栗子:

*** Settings ***
Test Template         Login with invalid credentials should fail

*** Test Cases ***    USERNAME             PASSWORD
Invalid Username      invalid              ${VALID PASSWORD}
Invalid Password      ${VALID USERNAME}    invalid
Invalid Both          invalid              invalid
Empty Username        ${EMPTY}             ${VALID PASSWORD}
Empty Password        ${VALID USERNAME}    ${EMPTY}
Empty Both            ${EMPTY}             ${EMPTY}

*** Keywords ***
Login with invalid credentials should fail
    [Arguments]    ${username}    ${password}
    Input Username    ${username}
    Input Password    ${password}
    Submit Credentials
    Error Page Should Be Open

以上例子同样可以在web demo project 中获取到


用户定义关键词(User keywords)
应该容易让人理解 和工作流程测试用例一样的标准。

不同的抽象层次。
可以包含一些编程逻辑(for 循环,if 判断这些) 特别对于底层的的关键词。
复杂的逻辑应该放在库里而不是用户定义的关键词里。


变量(Variables)
封装长的或者复杂的值。
可以通过命令行使用 –variable选项 来传参。
在关键词之间传递信息。


变量的命名
清楚,但是不要太长。
可以在变量表格里用注释来说明。
对每个使用场景保持一致:

  • 小写的本地变量只在当前的用例或者关键词中可用。
  • 全局变量或者套件,用例级别的变量需要大写。
  • 空格或者下划线都可以用来分割变量中的词。

推荐在变量表格中也把设置成动态的变量也列出来。 用Set Global/Suite/Test variable关键词来命名变量。
变量的初始值应该可以解释真实的值应该是什么。

比如:

*** Settings ***
Suite Setup       Set Active User

*** Variables ***
# Default system address. Override when tested agains other instances.
${SERVER URL}     http://sre-12.example.com/
${USER}           Actual value set dynamically at suite setup

*** Keywords ***
Set Active User
    ${USER} =    Get Current User    ${SERVER URL}
    Set Suite Variable    ${USER}

传递和返回值
通常的方式是通过关键词来返回值,把他们赋给变量,然后传递给其他关键词的参数。 清楚易懂地遵循这个方法。
允许创建独立的关键字,并有利于重新使用
看起来像是编程

备选方案是使用Set Test Variable关键词 不需要在测试用例层面上有什么编程风格。
要遵循起来比较复杂,很难重用关键词。

Good:

*** Test Cases ***
Withdraw From Account
    Withdraw From Account    $50
    Withdraw Should Have Succeeded

*** Keywords ***
Withdraw From Account
    [Arguments]    ${amount}
    ${STATUS} =    Withdraw From User Account    ${USER}    ${amount}
    Set Test Variable    ${STATUS}

Withdraw Should Have Succeeded
    Should Be Equal    ${STATUS}   SUCCESS

Not so good:

*** Test Cases ***
Withdraw From Account
    ${status} =    Withdraw From Account    $50
    Withdraw Should Have Succeeded    ${status}

*** Keywords ***
Withdraw From Account
    [Arguments]    ${amount}
    ${status} =    Withdraw From User Account    ${USER}    ${amount}
    [Return]    ${status}

Withdraw Should Have Succeeded
    [Arguments]    ${status}
    Should Be Equal     ${status}    SUCCESS

避免使用sleeping

  • Sleeping 是非常脆弱的。
  • 安全边际会使Sleeping的平均变长。
  • 用包含了一定的动作触发的关键词来替代 Sleeping 等待需要有一个超时的值。
  • 关键词可以用 Wait … 来开头
  • 可能的话用内置的关键词 Wait Until Keyword Succeeds Succeeds来包装其他关键词。
  • 有时候 Sleeping 是一种最简单的解决方式 请总是小心使用
    不要在经常用到的自定义关键词或者其他关键词中用 Sleeping。
  • 在 调试的时候 Sleeping 用来暂停测试执行还是很有用的。 虽然 DialogsLibrary 通常更适合用来干这个。

译自:How to write good test cases using Robot Framework

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容