如何使用RobotFramework编写好的测试用例

news2024/11/15 23:04:25

目录

概述

命名

测试套件命名

测试用例命名

关键字命名

setup和teardown的命名

文档

测试套件文档

测试用例文档

用户关键字文档

测试套件结构

测试用例结构

工作流测试

数据驱动测试

用户关键字

变量

变量的命名

传参和返回值

避免使用Sleep关键字

我们AT中的一些约定

总结:


概述

  • 这篇文档是使用Robot Framework编写好的测试用例的高级纲要,至于如何实际和被测系统(SUT)交互超出了本文档的范围。
  • 最重要的大纲是使得测试用例尽可能地让熟悉相关领域的人容易理解,这样会降低维护成本。
  • 更多信息请查看以下链接:
    Robot Framework该做的和不该做的
    编写可维护的自动化接收测试 文章
    如何结构化一个可伸缩且可维护的接收测试套件 博客

命名

测试套件命名

  • 套件名称应该尽可能描述清楚。
  • 套件名称会从文件名或目录名自动创建:文件名的扩展名不会出现在套件名称中;下划线会被转成空格;如果套件名称都是小写字母,那么名称会自动转成首字母大写。
  • 名称可以相对长一点,但是过长的话在文件系统中不方便。
  • 如果需要的话,顶级套件的名称可以在命令行使用--name选项进行重写。

举例:

  • 在文件系统中看到的是login_tests.robot,在RIDE中看到的是Login Tests
  • IP_v4_and_v6在RIDE中看到的是IP v4 and v6

测试用例命名

  • 测试用例和测试套件名称描述应该相似。
  • 如果套件包含了多个相似的测试,并且套件命名良好的话,那么测试名称可以短一点。
  • 测试用例名称就是你在测试用例文件中指定的名称,不会有任何的转换。

 

比如,如果我们在一个和非法登录相关的invalid_login.robot文件中有很多测试,那么下面这些测试用例名称都是可以的:

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

下面的名称就有点长了:

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

关键字命名

  • 关键字名称描述应该清晰。
  • 应该解释该关键字做什么而不是怎么做。
  • 不同的抽象级别(比如,Input Text和Administrator logs into system)。
  • 至于应该是每个单词首字母大写还是应该只有名称的首字母大写没有明确的规范。每个单词的首字母大写通常用于关键字名称很短的情况,比如Input Text;如果关键字的命名像一个句子,那么一般将该关键字的首字母大写。比如Administrator logs into system。这些关键字通常也具有更高的级别。

好的关键字命名:

*** Keywords ***
Login With Valid Credentials

不好的关键字命名:

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

setup和teardown的命名

  • 尽量使用描述做什么的名称。可能使用一个已存在的关键词。
  • 如果setup和teardown包含了不相干的步骤,那么可以接受更抽象的名称:将关键字名称逐个列出来会产生重复和维护问题(比如Login to system, add user, activate alarms and check balance)使用一些通用的名字通常来说更好一些(比如Initialize system)。
  • 如果已存在实现了更低级别步骤的关键字,那么建议使用内置的Run Keywords。
    *如果setup或teardown只需要一次的话,那么使用最好,这样不会重复。
  • 使用测试的每个人务必要明白该setup或teardown做了什么。

好的命名:

*** Settings ***
Suite Setup     Initialize System

好的命名2(如果只使用一次):

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

不好的命名:

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

文档

测试套件文档

  • 通常,最好是将所有的文档添加到测试用例文件中。
  • 应该包含背景信息,比如为什么创建测试,执行环境需要注意的地方等等。
  • 不要重复测试套件名称,如果真的不需要,那就最好不要有文档。
  • 不要包含太多的详细信息和测试用例。测试用例本身应该是理解起来清晰的。重复信息浪费时间和精力,还会造成维护问题。
  • 文档可以包含更多信息的链接。
  • 如果需要以键值对形式的文档信息,可以考虑使用测试套件元数据metadata,比如Version:1.0。
  • 顶级套件的文档和元数据可以分别使用--doc 和 --metadata选项从命令行进行设置。

好的文档:

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

不好的文档(特别当套件名称像account_withdrawal.robot时):

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

测试用例文档

  • 测试用例通常不需要文档。父套件的名字和可能的文档以及测试用例本身的名字应该给出足够的背景信息。测试用例的结构应该尽可能地清晰,不需要文档或其它注释。
  • Tags标签通常比文档更灵活,并提供了更多的功能,比如statistics【统计】、include/exclude等等。
  • 有时测试文档是有用的,适当地使用很关键。

好的文档:

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

不好的文档:

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

用户关键字文档

  • 如果关键字很简单的话就不需要文档了,此时应该具备好的关键字和参数名以及清晰的结构。
  • 重要的用法是给参数和返回值加文档。
  • 在资源文件中,使用 Libdoc生成的文档可以在编辑器(RIDE)中完成关键字输入之后,按下Ctrl键看到注释。

测试套件结构

  • 套件中的测试应该是相关的,公用的setup和teardown通常是一个很好的说明。
  • 一个文件中不应该有太多的测试用例(最大10个),除非是数据驱动的测试。
  • 测试应是独立的,使用setup/teardown初始化。
  • 有时,测试间的依赖是无法避免的。比如,分别初始化所有的测试可能花费太多时间。绝对不要有太长的测试依赖链。使用内置的变量${PREV TEST STATUS}验证前一个测试的状态。

测试用例结构

  • 测试用例应该容易理解。
  • 一个测试用例应该测试一个东西,可以很小(一个功能的一部分),也可以很大(端到端)。
  • 选择合适的抽象级别:使用抽象级别要一致在测试用例的级别不要包含不必要的详细信息
  • 两种测试用例:工作流测试和数据驱动测试。

 

工作流测试

  • 通常有以下阶段:前置条件(可选,通常在setup中)操作(对系统做一些操作)验证(对结果进行验证,必须要有)清理工作(可选,总是在teardown中完成)
  • 关键字描述测试做了什么使用明确的关键字名称和合适的抽象级别应该包含足够的信息以手动运行。不需要文档或注释来解释测试做了什么。
  • 不同的测试可以有不同的测试级别细节功能的测试可以更精确。端到端的测试可以是非常高的级别。一个测试应该只包含一个测试级别。
  • 不同的风格:对于低级别细节的更技术性的测试和集成测试。将“可执行的说明书”作为需求。使用领域语言。每个人(包括客户和产品拥有者)应该总可以理解。
  • 测试用例级别没有复杂的逻辑。没有循环或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

数据驱动测试

  • 每个测试应该有一个高级的关键字不同的参数创建不同的测试一个测试可以运行相同的关键字多次来验证相关变化的结果
  • 如果该关键字是以用户关键字实现的,那么它一般包含了和工作流测试相似的工作流。如果在其它地方不需要该关键字,那么在和测试相同的文件中创建该关键字是个好主意。
  • 推荐使用数据驱动测试不需要重复写该关键字多次在一个测试中方很容易测试多种变化。
  • 如果可能的话,推荐给列命名标题头。
  • 如果真的需要大量的测试,可以考虑基于一个外部模型生成。

样例:

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

用户关键字

  • 应该容易理解,和工作流测试具有相同的规则。
  • 不同的抽象级别。
  • 可以包含一些编程逻辑(比如循环,if/else等等)尤其是在一些低级的关键字种。复杂的逻辑一般在测试库种而不是在用户关键字中。

变量

  • 封装一些长的或者复杂的值。
  • 在关键字之间传递信息。

变量的命名

  • 名字明确但不要太长。
  • 可以对变量进行注释。
  • 使用一致的大小写规范:在一个确定的范围内部对局部变量使用小写。其它情况使用大写(全局,套件或测试用例级别的变量)。空格和下划线都可以作为单词分隔符。
  • 推荐在变量表中也要列出那些会动态设置的变量:使用内置的关键字Set Global Variable,Set Suite 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关键字。避免在测试用例级别使用编程风格。使用此方法可能会更复杂,并使得可复用关键字变得困难。

好的例子:

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

不是很好的例子:

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

避免使用Sleep关键字

  • 同步测试时,Sleep是一种非常不稳定的方式。
  • 安全边际会使得平均Sleep时间太长。
  • 使用那些具有轮询确定操作发生的关键字代替Sleep关键字:关键字名称通常以Wait开头应该设置一个等待的最大时间内置的关键字Wait Unitl Keyword Succeeds内部可能封装了其它关键字
  • 有时Sleep是最简单的解决方案:总是要小心使用不要在用户关键字中使用,因为它们可能被其它测试或关键字使用。在调试时阻止执行可能很有用。

以上翻译自https://github.com/robotframework/HowToWriteGoodTestCases/blob/master/HowToWriteGoodTestCases.rst

我们AT中的一些约定

我们项目现在做的是接口测试,比如对api/user/mobileregister接口进行测试。

测试套件的命名:TC_接口类名_方法名,比如上面的接口对应的套件名称是TC_User_MobileRegister。其中TC是TestCase的缩写,本该是TS【TestSuite】的,但一直这样用了,姑且就这样用吧。User是上面的接口所对应的类型,MobileRegister是该类中方法名,注意都是单词首字母大写。对一个接口的测试必须都写在一个测试套件中。

测试用例的命名:没有强制要求,如果说有,就是名字要明确、有序

比如,下面这个创建购买订单时的测试用例。明确体现在每个case名称后面都有简短的关键汉字说明;有序体现在有数字编号。还有一点是,如果有多个单词,单词之间没有分隔符,并且单词首字母大写。

变量的命名:

  • 全局变量都定义在Common文件夹下的variables.txt文件中,见下图。规则是必须以G_开头,单词首字母大写,只有一个单词的话全部大写也可以。比如${G_Server}或${G_SERVER}都可以,但有两个及以上单词时建议使用${G_ServerUrl}(这里还有几个之前没遵守的变量还没改)。
  • 套件范围的变量命名建议单词之间以下划线分隔。比如${user_name},${user_Name}都可以。
  • 测试用例中的变量和关键字中的变量建议使用首个单词首字母小写,比如${userName},${tradePwd}等等。
  • 注意:robot framework IDE中,如果一个关键字定义的形式参数包含${userName},但在测试用例中包含了一个从服务端返回的UserName字段,你将返回的值放到了${user_name}或${User_Name},验证期望的${userName}和返回的值是否相等时,RF会将这两个肉眼看着不同的变量当作同一个变量对待,所以必须明确区分这两个要比较的变量。比如,将返回的值存在变量${res_userName}中。

关键字的命名:

目前项目中有两种用户关键字,一种是在Common文件夹下的resource.txt中的关键字,一种是每个测试套件中定义的关键字。

resource.txt文件中的关键字是经常使用的一些关键字,命名规范是每个单词首字母大写,区别于系统关键字。虽然字体颜色本身有所区分了,但是形式上再有所区分不是更明显了吗,而且颜色可以随意设置的。

总结:

感谢每一个认真阅读我文章的人!!!

 我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。

 Python自动化测试学习交流群:全套自动化测试面试简历学习资料获取点击链接加入群聊【python自动化测试交流】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DhOSZDNS-qzT5QKbFQMsfJ7DsrFfKpOF&authKey=eBt%2BF%2FBK81lVLcsLKaFqnvDAVA8IdNsGC7J0YV73w8V%2FJpdbby66r7vJ1rsPIifg&noverify=0&group_code=198408628

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法设计与分析 课程期末复习简记(更新中)

网络流 下面是本章需要掌握的知识 • 流量⽹络的相关概念 • 最⼤流的概念 • 最⼩割集合的概念 • Dinic有效算法的步骤 • 会⼿推⼀个流量⽹络的最⼤流 下面对此依次进行复习 首先看流量网络的相关概念 上面是课程PPT中的定义,真是抽象 实际上,我们直接…

Maynor的博客专家成长之路——暨2023年中复盘

文章目录 博客专家成长之路——暨2023年中复盘前言念念不忘的博客专家每天只做三件事敲代码写博客健健身 我的感悟 不足之处未来:和CSDN共同成长最后 博客专家成长之路——暨2023年中复盘 前言 ​ 2023年不知不觉已经过去了半年有余,也是时候作年中复盘…

WEB界面测试

目录 前言: 摘要: WEB界面测试,最大的难度之一可能就是兼容性测试了 WEB界面测试,注重用户体验 WEB界面测试,注意用户的使用习惯 前言: Web界面测试是一种通过模拟用户与Web应用程序的交互来验证其功能和用户体验…

基于自然语言处理的多模态模型_综述

A Survey on Multimodal Large Language Models; 论文链接:https://arxiv.org/pdf/2306.13549.pdf 项目链接(实时更新最新论文,已获1.8K Stars):https://github.com/BradyFU/Awesome-Multimodal-Large-Language-Models 研究背景 …

线程安全问题之原因及解决方案

线程安全问题 根本原因代码结构原子性解决方案:synchronized 内存可见性问题解决方案 volatile 指令重排序问题wait和notify判定一个代码是否线程安全,一定要具体问题具体分析!!! 根本原因 根本原因:多线程抢占式执行,随机调度。 …

ESP8266-NodeMCU搭建Arduino IDE开发环境

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、准备工作二、搭建步骤1.打开Arduino IDE 首选项2.打开Arduino IDE的“开发板管理器”3.在Arduino IDE的开发板菜单中找到“NodeMCU开发板”4.设置Arduino IDE的…

实验二:子程序设计实验

一、实验目的闻明找强的的掌握于程府的定又和调用方法掌握子程布的程库设计与调试方法 实验要求. 说明实现本实验需要掌握的知识及本实验害要的实验环境 二、实验要求了解萄单汇师培长程产没计与调武了解江编语子能店定义了解汇编语着子程序设计 实验内容 阐明实验具体内容及实…

3. Linux组件之内存池的实现

文章目录 一、为什么需要内存池二、内存池的工作流程三、内存池的实现3.1 数据结构3.2 接口设计3.2.1 创建内存池3.2.2 内存池销毁3.2.3 内存分配1. 分配小块内存2. 分配大块内存 3.2.4 内存池的释放3.2.5 内存池重置 3.3 完整代码 一、为什么需要内存池 应用程序使用内存&…

【我们一起60天准备考研算法面试(大全)-第一天 1/60(排序、进制)】【每天40分钟,我们一起用60天准备 考研408-数据结构(笔试)】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

与彭老师交流(北京大学 心理与认知科学学院)

交流:主要是了解人家在做什么对什么感兴趣,和让人家知道你在做什么对什么感兴趣,然后你觉得未来可以做什么有价值的事情。 1.老师做的方向里面有包含利用人工智能这一块的知识,我觉得我是可以做的,机理这一块的东西我不…

MySQL数据库复合查询

文章目录 一、多表查询二、自连接三、子查询1.单行子查询2.多行子查询3.多列子查询4.在from子句中使用子查询 四、合并查询 一、多表查询 在实际开发中,我们需要查询的数据往往会来自不同的表,所以需要进行多表查询。下面我们用一个简单的公司管理系统&…

启动游戏提示缺少(或丢失)xinput1_3.dll的解决办法

在我们打开游戏的或者软件的时候,电脑提示“找不到xinput1_3.dll,无法继续执行此代码”怎么办?相信困扰着不少小伙伴,我再在打开吃鸡的时候,然后花了一上午的时候时间研究,现在终于知道xinput1_3.dll文件是…

基于TCP协议实现多人在线的聊天室

基于TCP协议实现多人在线的聊天室 程序采用CS架构,功能支持注册,登录,退出,私聊,群聊,查看历史信息。属于Java Swing窗口程序。 技术:Java swing,mysql 开发工具:IDEA…

性能测试之全链路压测流量模型你了解多少

目录 前言 基于业务模型实现 基于流量录制回放 灰度分流 总结: 前言 现在全链路越来越火,各大厂商也纷纷推出了自己的全链路压测测试方案。特别是针对全链路压测流量模型,各家方案都有所不同。最近我看了一些这方面的资料,有…

万能的网关系统设计方案,一篇带走

本文准备围绕七个点来讲网关,分别是网关的基本概念、网关设计思路、网关设计重点、流量网关、业务网关、常见网关对比,对基础概念熟悉的朋友可以根据目录查看自己感兴趣的部分。 什么是网关 网关,很多地方将网关比如成门, 没什么…

mac pro m1:搭建zookeeper集群并设置开机自启

0. 引言 之前我们讲解过搭建zookeeper单节点,但在实际生产中,为了保证服务高可用,通常我们是采用集群模式。所以本次我们来实操集群模式的搭建 1. zk集群模式 zk可以作为注册中心和配置中心,常用在微服务各类组件的多节点服务治…

Tomcat优化及部署

目录 一、Tomcat概述 二、Tomcat核心组件 1.Web容器 2.servlet容器 3.JSP容器 三、Tomcat的功能组件 1.connector 2.container 3.service 四、Tomcat部署 1.关闭防火墙和安全机制 2.将安装 Tomcat 所需软件包传到/opt目录下 3.安装JDK 4.设置JDK环境变量 5.编写j…

链路性能测试中参数多样性方法分享

目录 业务无关量 随机数字 线程安全随机 随机字符串 业务相关量 随机相关量 上游接口获取 上游接口造数据 提前造数据 总结: 下面分享几种我工作中常用到的增加参数多样性的方法。 业务无关量 这个是最常用到的,当部分的接口参数对接下来的用…

机器人开发--EKF扩展卡尔曼滤波介绍

机器人开发--EKF卡尔曼滤波介绍 1 介绍1.1 概述KF (Kalman Filter)EKF (Extended Kalman Filter)UKF (Unscented Kalman Filter) 1.2 发展历史1.3 卡尔曼演化分支1.4 应用1.5 特点1.6 姿态估计问题 from 南叔先生1.7 EKF、PF、UKF 对比1.8 EKF 递归框架 2 理解機器人學&#xf…

使用Matplotlib画三维图

使用matplotlib画3D图: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D# 创建X和Y的网格点 x np.linspace(-5, 5, 100) y np.linspace(-5, 5, 100) X, Y np.meshgrid(x, y)# 创建Z的网格点(这里使用一…