通用开源自动化测试框架 - Robot Framework

news2025/1/17 3:53:21

一、什么是 Robot Framework?

1. Robot Framework 的历史由来

Robot Framework是一种通用的自动化测试框架,最早由Pekka Klärck在2005年开发,并由Nokia Networks作为内部工具使用。后来,该项目以开源形式发布,并得到了广泛的社区支持和贡献。

2.官方介绍:

Robot Framework is a generic open source automation framework. It can be used for test automation and robotic process automation (RPA).
Robot Framework 是一个通用的开源自动化框架。它可用于测试自动化和机器人流程自动化 (RPA)。

Robot Framework is supported by Robot Framework Foundation. Many industry-leading companies use the tool in their software development.
Robot Framework 由 Robot Framework Foundation 提供支持。许多行业领先的公司在其软件开发中使用该工具。

Robot Framework is open and extensible. Robot Framework can be integrated with virtually any other tool to create powerful and flexible automation solutions. Robot Framework is free to use without licensing costs.
机器人框架是开放且可扩展的。Robot Framework几乎可以与任何其他工具集成,以创建强大而灵活的自动化解决方案。Robot Framework 可免费使用,无需许可费用。

Robot Framework has an easy syntax, utilizing human-readable keywords. Its capabilities can be extended by libraries implemented with Python, Java or many other programming languages. Robot Framework has a rich ecosystem around it, consisting of libraries and tools that are developed as separate projects.
Robot Framework 具有简单的语法,使用人类可读的关键字。它的功能可以通过使用 Python、Java 或许多其他编程语言实现的库来扩展。Robot Framework 拥有丰富的生态系统,由作为独立项目开发的库和工具组成。

3. 基本语法

  • 测试用例以*** Test Cases ***开头,后跟一个或多个测试用例。
  • 关键字定义以*** Keywords ***开头,后跟一个或多个关键字定义。
  • 测试用例和关键字定义使用缩进来表示层次结构。
  • 关键字和关键字参数之间使用制表符或多个空格分隔。

4. Code is worth a thousand words代码胜过千言万语

简单示例
此示例包含用户登录的单个测试用例。它使用模拟的后端 API 进行用户管理。该测试套件TestSuite.robot包含两个测试用例“使用密码登录用户”和“使用错误密码拒绝登录”。此测试用例从资源文件 keywords.resource 调用关键字。

TestSuite.robot:

*** Settings ***
Documentation     A test suite for valid login.
...
...               Keywords are imported from the resource file
Resource          keywords.resource
Default Tags      positive

*** Test Cases ***
Login User with Password
    Connect to Server
    Login User            ironman    1234567890
    Verify Valid Login    Tony Stark
    [Teardown]    Close Server Connection

Denied Login with Wrong Password
    [Tags]    negative
    Connect to Server
    Run Keyword And Expect Error    *Invalid Password    Login User    ironman    123
    Verify Unauthorised Access
    [Teardown]    Close Server Connection

Resource File 资源文件
keywords.resource 包含关键字定义。资源文件还使用库 CustomLibrary.py 中基于 python 的关键字来实现更专业的功能。存在无数社区制作的库,它们以各种方式扩展了机器人框架!

keywords.resource:

*** Settings ***
Documentation     This is a resource file, that can contain variables and keywords.
...               Keywords defined here can be used where this Keywords.resource in loaded.
Library           CustomLibrary.py


*** Keywords ***
Connect to Server
    Connect    fe80::aede:48ff:fe00:1122

Close Server Connection
    Disconnect

Login User
    [Arguments]    ${login}    ${password}
    Set Login Name    ${login}
    Set Password    ${password}
    Execute Login

Verify Valid Login
    [Arguments]    ${exp_full_name}
    ${version}=    Get Server Version
    Should Not Be Empty    ${version}
    ${name}=    Get User Name
    Should Be Equal    ${name}    ${exp_full_name}

Verify Unauthorised Access
    Run Keyword And Expect Error    PermissionError*    Get Server Version

Login Admin
    [Documentation]    'Login Admin' is a Keyword.
    ...                It calls 'Login User' from 'CustomLibrary.py'
    Login User    admin    @RBTFRMWRK@
    Verify Valid Login    Administrator

CustomLibrary.py:

from TestObject import TestObject
from robot.api.logger import info, debug, trace, console

class CustomLibrary:
    '''This is a user written keyword library.
    These libraries can be pretty handy for more complex tasks an typically
    more efficiant to implement compare to Resource files.

    However, they are less simple in syntax and less transparent in test protocols.

    The TestObject object (t) has the following public functions:

    class TestObject:
        def authenticate(self, login: str, password: str) -> str: ...
        def logout(self, token): ...
        def get_version(self, token) -> str: ...
        def get_user_id(self, token, login) -> str: ...
        def get_user_name(self, token, user_id) -> str: ...
        def get_user(self, token, user_id=None) -> Dict[str, str]: ...
        def get_user_all(self, token) -> List[Dict[str, str]]: ...
        def delete_user(self, token, userid): ...
        def get_logout(self, token): ...
        def put_user_password(self, token, new_password, user_id=None): ...
        def put_user_name(self, token, name, user_id=None): ...
        def put_user_right(self, token, right, user_id): ...
        def post_new_user(self, token, name, login) -> str: ...
    '''

    ROBOT_LIBRARY_SCOPE = 'SUITE'

    def __init__(self) -> None:
        self._session = None
        self.login = ''
        self.password = ''
        self._connection: TestObject = None

    def connect(self, ip):
        self._connection = TestObject(ip)

    def disconnect(self):
        self._connection = None

    @property
    def connection(self):
        if not self._connection:
            raise SystemError('No Connection established! Connect to server first!')
        return self._connection

    @property
    def session(self):
        if self._session is None:
            raise PermissionError('No valid user session. Authenticate first!')
        return self._session

    def set_login_name(self, login):
        '''Sets the users login name and stores it for authentication.'''
        self.login = login
        info(f'User login set to: {login}')

    def set_password(self, password):
        '''Sets the users login name and stores it for authentication.'''
        self.password = password
        info(f'Password set.')

    def execute_login(self):
        '''Triggers the authentication process at the backend and stores the session token.'''
        self._session = self.connection.authenticate(self.login, self.password)
        if self.session:
            info(f'User session successfully set.')
            debug(f'Session token is: {self.session}')
        self.login = self.password = ''

    def login_user(self, login, password) -> None:
        '''`Login User` authenticates a user to the backend.

        The session will be stored during this test suite.'''
        self._session = self.connection.authenticate(login, password)

    def logout_user(self):
        '''Logs out the current user.'''
        self.connection.logout(self.session)

    def create_new_user(self, name, login, password, right):
        '''Creates a new user with the give data.'''
        user_id = self.connection.post_new_user(self.session, name, login)
        self.connection.put_user_password(self.session, password, user_id=user_id)
        self.connection.put_user_right(self.session, right, user_id)

    def change_own_password(self, new_password, old_password):
        '''Changes the own password given the new and current one.'''
        self.connection.put_user_password(self.session, new_password, old_password)

    def change_users_password(self, login, new_password):
        '''Changes the password of a user by its name.
        Requires Admin priviliges!'''
        user_id = self.get_user_id(login)
        self.connection.put_user_password(self.session, new_password, user_id=user_id)

    def get_all_users(self):
        '''`Get All Users` does return a list of user-dictionaries.

        A user dictionary has the keys `name`, `login`, `right` and `active`.
        This keyword need Admin privileges.

        Example:
        `{'name': 'Peter Parker', 'login': 'spider', 'right': 'user', 'active': True}`
        '''
        return self.connection.get_user_all(self.session)

    def get_user_details(self, user_id=None):
        '''Returs the user details of the given user_id or if None the own user data.'''
        return self.connection.get_user(self.session, user_id)

    def get_user_id(self, login):
        '''Returns the user_id based on login.'''
        return self.connection.get_user_id(self.session, login)

    def get_username(self, user_id=None):
        '''Returns the users full name of the given user_id or if None the own user data.'''
        return self.connection.get_user_name(self.session, user_id)

    def get_server_version(self):
        return self.connection.get_version(self.session)

二、为什么选择 Robot Framework

Robot Framework支持插件化的架构,可以使用许多内置库和第三方库来扩展功能,例如SeleniumLibrary用于Web自动化测试,RequestsLibrary用于API测试等。

1. Robot Framework 的常见用法

Robot Framework可用于各种自动化测试任务,包括:

  • Web应用测试
  • API测试
  • 数据库测试
  • 移动应用测试
  • 自动化任务和流程
  • 持续集成和部署

2. 常见关键字库

Robot Framework有广泛的关键字库可供使用,以下是一些常见的关键字库:

  • SeleniumLibrary:用于Web应用测试,包括页面操作、表单填写、页面验证等。
  • RequestsLibrary:用于发送HTTP请求,进行API测试。
  • DatabaseLibrary:用于数据库测试,支持各种数据库操作。
  • SSHLibrary:用于通过SSH执行命令和操作远程服务器。
  • ExcelLibrary:用于读写Excel文件。
  • DateTimeLibrary:用于日期和时间相关操作。

3. 技术架构和原理

Robot Framework的技术架构基于关键字驱动的测试方法。它使用Python语言编写,通过解析测试用例文件和执行测试步骤来实现自动化测试。

Robot Framework的核心原理如下:

  1. 测试用例文件(通常使用.robot扩展名)包含测试用例、关键字定义和设置。
  2. 测试执行器(test runner)读取并解析测试用例文件。
  3. 测试执行器调用相应的关键字库(如SeleniumLibrary、RequestsLibrary等)执行测试步骤。
  4. 关键字库提供了一组关键字(如打开浏览器、点击按钮等)来操作被测试的系统。
  5. 执行结果被记录下来,并生成报告和日志文件。

三、怎么使用 Robot Framework

1. Robot Framework的安装方法

1. 安装Python

Robot Framework是基于Python的,所以首先需要安装Python。你可以从Python官方网站(https://www.python.org)下载适合你操作系统的Python安装程序,并按照官方指南进行安装。

2. 安装Robot Framework

一旦Python安装完成,你可以使用Python的包管理工具pip来安装Robot Framework。打开终端或命令提示符窗口,并执行以下命令:

pip install robotframework

这将下载并安装最新版本的Robot Framework及其依赖项。

3. 安装额外的关键字库

根据你的测试需求,你可能需要安装额外的关键字库。例如,如果你需要进行Web应用测试,可以安装SeleniumLibrary。以安装SeleniumLibrary为例,执行以下命令:

pip install robotframework-seleniumlibrary

类似地,你可以使用pip命令安装其他关键字库,具体取决于你的需求。

4. 验证安装

安装完成后,你可以验证Robot Framework是否成功安装。在终端或命令提示符窗口中执行以下命令:

robot --version

如果成功安装,它将显示安装的Robot Framework的版本号。

2. 自动化测试用例常见实例代码

示例1:Web应用测试

*** Settings ***
Library    SeleniumLibrary

*** Test Cases ***
Open Browser and Verify Title
    Open Browser    https://www.example.com    chrome
    Title Should Be    Example Domain
    Close Browser

示例2:API测试

*** Settings ***
Library    RequestsLibrary

*** Test Cases ***
Get User Details
    Create Session    Example API    https://api.example.com
    ${response}    Get Request    Example API    /users/123
    Should Be Equal As Strings    ${response.status_code}    200
    ${user_details}    Set Variable    ${response.json()}
    Log    ${user_details}
    Delete All Sessions

示例3:数据库测试

*** Settings ***
Library    DatabaseLibrary
Library    Collections

*** Test Cases ***
Verify User in Database
    Connect To Database    pymysql    mydatabase    myusername    mypassword
    @{query_result}    Query    SELECT * FROM users WHERE id = '123'
    Should Contain    ${query_result}    username=John
    Disconnect From Database

示例4:SSH操作

*** Settings ***
Library    SSHLibrary

*** Test Cases ***
Execute Command on Remote Server
    Open Connection    192.168.1.100    username=myusername    password=mypassword
    ${output}    Execute Command    ls /path/to/directory
    Should Contain    ${output}    myfile.txt
    Close Connection

示例5:Excel操作

*** Settings ***
Library    ExcelLibrary

*** Test Cases ***
Read Data From Excel
    Open Excel    path/to/excel/file.xlsx
    ${cell_value}    Read Cell Data By Name    Sheet1    A1
    Log    ${cell_value}
    Close Excel

四、相关链接

  • Robot Framework官方网站
  • Robot Framework用户指南
  • Robot Framework论坛
  • Robot Framework Github

RobotFramework基金会成员
RobotFramework基金会成员

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

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

相关文章

SPSS平均值检验

前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…

ChatGPT文章创作指令Prompt提示词模板

目录 用途&注意说明提示模板中文版英文版 指令说明提示示例输出结果示例 用途&注意说明 用途:根据命题写作,可以用来起草文章,写英语范文适合。 注意点:如果不给范文示例,会写成英文小作文的翻译版。 提示模…

基于Selenium+Python的web自动化测试框架详解

一、什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE:Firefo…

HZGO-A-031/315、KZGO-A-031/50比例减压阀放大器

RZGO-A-010/210、RZGO-A-010/32、RZGO-A-010/100、RZGE-A-010/210、RZGE-A-010/32、RZGE-A-010/100、CART RZGE-A-010/210、CART RZGE-A-010/32、CART RZGE-A-010/100、RZGO-A-031/210、RZGO-A-033/100、HZGO-A-033/350、HZGO-A-031/315、KZGO-A-031/50、KZGO-A-033/210滑阀型、…

对音频文件的处理:音频信息,读取内容,获取时长,切割音频,pcm与wav互转

音频处理发现的比较简单的代码,原作者代码在github:GitHub - silencesmile/python_wav: 对音频文件的处理:音频信息,读取内容,获取时长,切割音频,pcm与wav互转 可以按给定的开始和结束时间调用代…

Spring Boot Web MVC

文章目录 一、Spring Boot Web MVC 概念二、状态码三、其他注解四、响应操作 一、Spring Boot Web MVC 概念 Spring Web MVC 是⼀个 Web 框架,一开始就包含在Spring 框架里。 1. MVC 定义 软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视…

最新版本idea2023.2新特性,最后一点你肯定想不到哈哈

idea2023.2版本正式发布,最新的idea2023.2包含以下新特性: AI Assistant 当前具备一组由 AI 提供支持的初始功能,提供集成式 AI 聊天,可以完成一些任务,例如自动编写文档注释、建议名称、生成提交消息等。编辑器内性能…

【23真题】对不起,由于我的择校分析,这所可能会炸!

哈喽大家好,现在这个时间节点,有很多同学开始刷真题了!所以23真题系列正式启动!小马哥将全面发布23真题及详细解析! 注意太原科技大学,自我发了择校分析以后(苍天为证,我真的没有任…

水果FL Studio21.2体验版下载安装教程(增加云服务功能)

FL Cloud 音效库包含开放版权的Loop和采样,以及来自 FL Studio 著名用户的艺术家独家内容。更新后,现在还可以使用人工智能辅助母带处理和数字发行功能来制作音轨。FL Studio 由最初的 "Fruity Loops" DAW 发展而来,25 年来&#x…

RISC-V IDE MRS无感远程协助模块详解

RISC-V IDE MRS无感远程协助模块详解 一、说明 1.1 概述 针对RISC-V/ARM等内核MCU的嵌入式集成开发环境MRS(MounRiver Studio)从V1.90版本开始内置无感远程协助模块(Sensorless Remote Assistant Module,以下简称SRA模块)。SRA模块是一款支…

PowerCLI vCenter批量更改esxi主机root密码

前提条件 安装 powercli开启wmi,配置网卡,参考 PowerCLi 批量添加所有esxi到vCenter 编写通过vCenter批量更改所有esxi主机root密码自动化脚本 最终实现批量重置所有esxi 密码,无需干预。$vCenterServer = "192.168.19.254" #你的vCenter 管理中心地址更改$User= …

国外调查问卷真的能做吗?

大家好,我是橙河网络,今天聊一聊国外调查问卷真的能做吗? 国外问卷调查这个项目已经存在多年,其赚钱逻辑非常简单,即通过填写国外公司发放的商业调查问卷来获取报酬,一般都是以美元的方式结算。这些问卷可…

性能优化之AA反走样优化

反走样主要是解决采样不足导致的。一般方案选择需要兼顾画面质量与渲染效率权衡的前提下,对图像进行增强。反走样经过了第一代超级采样抗锯齿SSAA,到第二代的多重采样抗锯齿MSAA,快速近似采样FXAA,增强子像素变形抗锯齿SMAA&#…

弱网测试神器—Qnet(上)

一、APP 弱网测试背景 App 在使用的过程中,难免会遇到不同的弱网络环境,像在公车上、在地铁、地下车库等。在这种情况下,手机常常会出现网络抖动、上行或下行超时,导致 APP 应用中出现丢包延迟,从而影响用户体验。 作…

写在2023末,很庆幸自己入了软件测试这行...

为什么会学习软件测试? 已经28岁了,算一下快过去3年了,刚毕业那会工作了一年,因为自己当时很迷茫(觉得自己挺废的),所以就没去工作就一直在家,家里固定每个月给点生活费&#xff0c…

查看公司电脑里软件安装

查看公司电脑里软件安装是一项重要的任务,可以帮助管理员了解员工在工作中使用的软件情况,以及发现潜在的安全风险。 方法一:事件查看器 点击开始菜单,搜索“事件查看器” 2、点击“windows”日志,打开“应用程序”&a…

XAMPP的下载安装配置详细教程

XAMPP的下载安装配置详细教程(含拒绝访问坑) ​ xampp 话不相瞒,当初为了在XAMPP(ApacheMySQLPHPPERL)里面配置phpwind,我在卸载与安装之间来回了不下10次,但是我的phpwind始终还是安装不成功…

『OpenStack』云计算平台『Nova』计算服务学习指南

前言 本文将会讲解 OpenStack 平台计算服务组件 Nova ,结合抽象概念和简单易懂的实战操作,帮助您更好的理解 Nova 计算服务在 OpenStack 中的作用 系统配置:宿主机 Ubuntu 20.04(WSL2) 简介 OpenStack 官网链接&…

如何利用数字化系统发挥数据的最大价值?

社会日新月异,企业管理也在时刻发生着变化,数字化系统的引入,解决了企业纸质化的汇报形式,简便快捷,一切事物都是有两面性的,数字化也给企业带来了新的挑战,如何利用数字化发挥数据的最大价值&a…

【记录】使用yolov5_obb训练自己的数据集

引言 对于寻常的yolov5目标检测任务,只能检测水平或者垂直的检测框,而对于旋转框的检测却无能为力。为此,在这记录下使用yolov5_obb来训练自己数据集。 一、准备数据集 1、我们先看所需要的数据集文件什么样子,如下图文件夹Sym…