hyrobot 功能介绍

前言

黑羽robot是一款自动化测试框架。要学习它,您需要具备一些自动化测试的基本概念。

本教程讲解 的案例 是 一个 web 系统的自动化。 如果你 还不了解 基于 selenium 的 web自动化,请先 学完我们的 web自动化教程。

点击这里先学习Selenium Web自动化

黑羽robot 和 RobotFramework 的关系


点击这里,边看视频讲解,边学习以下内容

黑羽robot 是基于 RobotFramework, 增强的一款自动化框架。

为什么要基于 RobotFramework ?

RobotFramework 作为系统测试框架,有如下优点:

  • 用目录文件结构存放测试用例,清晰明了

  • 清晰灵活的 初始化清除 机制

  • 可以灵活地 挑选 要执行的测试用例

  • 漂亮的测试日志和报告

  • 国内很多企业采用,跳槽就业有优势


那么, RobotFramework有 缺点 吗?

白月黑羽认为,最大的缺点就是:反人类的 测试用例语法

可能 RobotFramework 的开发者 认为,用Python语言写测试用例比较难,所以自己发明了一套语法写自动化测试用例。

实际上,不但没有降低写用例的难度,反而提高了。 因为 RF的那套语法 反而比 Python 更难学难用。

特别是处理稍微复杂点的任务,比如循环、判断、字典里面包含列表这种 复杂些的数据结构, 用 RobotFramework 可以说是太痛苦了。

而且,调试 RF用例 也 非常的麻烦。

想做好自动化开发,却不想学编程语言? 梦该醒了。


那么,黑羽robot 在 RobotFramework 基础上,增强了什么?

  • 拨乱反正,直接用 Python 来写测试用例。

饱受RF语法折磨的人,会发现再也不需要学习RF奇葩的语法了,一切都是Python。只要你有Python语言基础,一切都是那么的轻松自然。

  • 汉化了 测试报告,对中国用户友好一些。

安装

安装 被测系统

要讲解 自动化测试,需要一个 被测系统

我们使用 白月SMS系统 作为被测系统。

请大家点击这里,按照说明下载、安装、运行 白月SMS系统

针对该系统,现在有一批测试用例,准备自动化。 点击这里下载 白月SMS系统的测试用例文档

接下来,我们就使用 黑羽robot 框架, 开发这些用例的自动化。

安装 黑羽robot


点击这里,边看视频讲解,边学习以下内容

首先确保你电脑上安装好了 Python 3.7 或者 3.8 版本的解释器

  1. 安装RF

黑羽robot基于Robot Framework ,所以必须先安装RobotFramework

直接执行如下Pip命令即可:

pip install robotframework 

  1. 安装黑羽robot

点击这里下载黑羽robot项目包

解压下载的zip包,会产生一个名为 autotest_hyrobot 的目录, 这就是hyrobot的自动化项目目录。

你修改该目录的名字,比如我们要讲解 自动化测试 白月SMS系统 , 就可以改名为 autotest_bysms


建议:用PyCharm 等IDE直接打开项目文件夹,一定要 确保 hyrobot 目录 在项目根目录下面,如下

image

项目目录结构

点击这里,边看视频讲解,边学习以下内容

黑羽robot 项目目录中包含

  • cases 目录

    里面存放 自动化测试用例代码

  • cfg 目录

    里面存放 配置文件

  • hyrobot 目录

    里面存放 hyrobot库 和 工具 代码, 开发者不需要 修改里面的内容

  • lib 目录

    里面存放 自动化测试用例 使用的 库 存放的目录

  • run.bat

    Windows下 运行 黑羽robot, 执行自动化测试 的 脚本

  • run.sh

    苹果 MacOS 下 运行 黑羽robot, 执行自动化测试 的 脚本

    注意:

    苹果用户,需要先执行 chmod +x run.sh 增加执行权限

    运行测试时,执行 ./run.sh 命令

用例和套件

点击这里,边看视频讲解,边学习以下内容

我们先了解一下用例目录的 结构 和 基本概念

cases 目录下面的 每个目录 和 py 文件 都 对应一个 测试套件

所谓测试套件,就是 测试用例的集合

我们把功能相关的测试用例组合起来放在一起,成为某个测试套件。

  • 测试套件 可以是 目录 也可以是 文件

  • 测试用例代码 是在测试套件py文件 中的

  • 一个套件文件文件 可以存放 多个用例

  • 测试套件目录可以包含 子套件目录 和 子套件文件

用例文件的编写、执行、产生日志报告

点击这里,边看视频讲解,边学习以下内容

编写用例

用例文件格式如下:

文件里面每个类对应一个用例。

类的 name 属性 指定 用例名

类的 teststeps 方法 里面的代码 就是 测试步骤

特别注意 : 用例类名 一定要保证唯一 ,推荐包含用例编号。比如

# 类名保证唯一,推荐包含用例编号
class UI_0101:
    # 测试用例名字
    name = '管理员首页 - UI-0101'

    # 测试用例步骤
    def teststeps(self):

代码最前面加上

from hyrobot.common import *

导入 hyrobot 库,库里面有一些函数 和

声明每个步骤使用 STEP 库函数

打印信息用 INFO 库函数

检查点用 CHECK_POINT 函数。


具体的使用示例,参考讲解视频。

执行用例

执行用例需要

  • 打开命令行窗口

  • 进入到自动化项目根目

  • 运行 run.bat

具体的使用示例,参考讲解视频。

日志和报告

执行完后,就会产生 汉化的 日志 和 报告。参考讲解视频。

数据驱动用例

点击这里,边看视频讲解,边学习以下内容

做过自动化测试的朋友经常听说过 数据驱动 (或者面试的时候被问到过)。

什么是数据驱动?

如果有一批测试用例,具有 相同的测试步骤 ,只是 测试参数数据不同

自动化测试时,把测试数据从用例代码中 分离 开来,以后增加新的测试用例,只需要修改数据。

这就是数据驱动。


举个例子:

某系统 登录功能的测试,有一批测试用例,其执行的步骤几乎都是一样的,只是使用的测试参数不同。

比如:

  • 不输入用户名,输入正确密码

  • 输入比正确用户名后面少一个字符,输入正确密码

  • 输入比正确用户名后面多一个字符,输入正确密码

  • 输入比正确用户名前面少一个字符,输入正确密码

  • 输入比正确用户名前面多一个字符,输入正确密码

  • 输入正确用户名,不输入密码

  • 输入正确用户名,输入比正确密码后面多一个字符


上面每种输入对应一个用例, 聪明的读者应该能想到 可以把整个测试逻辑封装到一个库函数中,如下所示

def login(username,password):
   # 下面写登录流程

但是,测试用例仍然需要定义一个个的类,如下, (假设正确的用户名为 user,密码为 123456)

class c00101:
    name = '登录测试 - c00101' 

    def teststeps(self):
      msg = login('','123456')
      CHECK_POINT(msg, '错误的用户名密码')


class c00102:
    name = '登录测试 - c00102' 

    def teststeps(self):
      msg = login('use','123456')
      CHECK_POINT(msg, '错误的用户名密码')

# 下面还有类似的用例定义      

这样做,当然可以,就是有些麻烦了。


这种情况可以使用 HyRobot用例 的 数据驱动格式,只需如下定义即可

class c_login_x:
    # cases里面每个元组定义每个用例的数据
    # 第一个数据是用例名称, 后面的数据是用例参数
    cases = [
        ('登录 - c00101', '','123456'),
        ('登录 - c00102', 'use','123456'),
        ('登录 - c00103', 'user1','123456'),
    ]

    def teststeps(self, para_index):
        # 取出参数
        username, password = self.cases[para_index][1:]
        # 下面写登录流程

这样,我们就不需要定义那么多的测试用例类了, 而且测试数据也可以集中存放。


视频讲解中的被测系统白月SMS如何安装,看课后练习部分说明

视频讲解中的 测试用例代码如下

from hyrobot.common import  *
from selenium import webdriver
import time

class c_login_x:
    cases = [
        ('登录 - c00101', 'byhy1','888888'),
        ('登录 - c00102', 'byh','888888'),
        ('登录 - c00103', '','888888'),
    ]

    def teststeps(self, para_index):
        # 取出参数
        username, password = self.cases[para_index][1:]
        # 下面写登录流程

        driver = webdriver.Chrome()
        driver.implicitly_wait(10)

        driver.get('http://127.0.0.1/mgr/sign.html')

        driver.find_element_by_id('username').send_keys(username)
        driver.find_element_by_id('password').send_keys(password)
        driver.find_element_by_css_selector('button[type="submit"]').click()

        time.sleep(2)
        alterText = driver.switch_to.alert.text
        print(alterText)
        CHECK_POINT('弹出提示', alterText == '登录失败 : 用户名或者密码错误')


        driver.quit()





课后练习

题目1

根据教程



参考答案

参考下一节课的开始部分

下一页