• hyrobot使用


    参考:http://www.python3.vip/tut/auto/hyrobot/01/

    1、简介

    黑羽robot 在 RobotFramework 基础上,将Python代码转化为.ride可以运行的程序。

    并且汉化测试报告。

    2、被测系统

    https://pan.baidu.com/s/1rnWhuroIMNebStzpwLjsTA#list/path=%2F

     安装被测系统

    下载解压bysms.zip后,进入bysms目录,双击运行runserver.bat 即可启动 白月SMS系统。 如果出现命令行窗口闪退,可能是端口别占用。修改端口即可,

    将80修改为8087,或者其他

    python manage.py runserver 8087 --noreload

    启动成功

     访问: http://127.0.0.1/mgr/sign.html

    输入如下管理员账号

    用户名 :byhy 密码: 88888888

    项目需求文档:http://www.python3.vip/tut/webdev/django/req_1/

    测试用例:http://cdn1.python3.vip/files/selenium/testcases.xlsx

     

    3、安装黑羽robot

    项目架构:http://cdn1.python3.vip/files/hyrobot/autotest_hyrobot.zip

    目录结构

     测试套件

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

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

    4、测试用例

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

    类的 name 属性 指定 用例名

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

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

    from hyrobot.common import *

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

    导入 hyrobot 库,库里面有一些函数 和 声明每个步骤使用 STEP 库函数,在控制台打印信息用 INFO 库函数,检查点用 CHECK_POINT 函数。

    INFO('suite_setup')
    CHECK_POINT(msg, '错误的用户名密码')
    STEP(1, '获取左侧菜单信息')

    5、执行测试用例

    • 进入到自动化项目根目

    • 运行 run.bat

     1)依据测试用例名称执行测试用例

    --test testA                # 执行名为 testA 的用例
    --test testA --test testB  # 执行名为 testA 和  testB 的用例
    --test test*              # 执行名字以 test 开头的用例

     2)依据测试套件名称执行测试用例

    run --suite TestOne

     3)使用参数文件,执行测试用例

    当需要执行某些测试时,一个测试用例的写,势必有些麻烦

    run --test *0301  --test *0302 --test *0303 --test *1401 --test *1402

    于是可以使用参数文件,可以把所有的参数都放在参数文件中,创建文件param,与run.bat放在同一个文件夹中,运行

    run -A param

     4)按照用例标签执行测试用例

    给测试用例打上标签(‘登录功能、冒烟测试、UI测试’),这样在运行的时候,可以通过标签指定要运行哪些用例。标签 就是用例的属性特征描述。

    • 套件文件全局变量 force_tags,在某个套件中
    force_tags = ['登录功能','冒烟测试','UI测试']

    那么该文件里面所有测试用例都具有了这些标签。

    例如:TestOne4.py中全局变量,force_tags = ['登录功能']

     执行结果:在每个测试用例标签中都是显示

    • 套件文件全局变量 force_tags,在全局文件中

    如果我们在测试套件目录初始化文件__st__.py定义了一个这样的 force_tags 全局变量, 那么该目录里面所有测试用例都具有了该tag。

     结果:tag'登录功能'是在测试上面测试套件TestOne4中创建的,所以会组合显示。

     5)根据标签挑选执行

    在执行自动化的时候,我们可以通过命令行参数,指定标签,从而挑选要执行的测试用例。

    # 执行包含 标签 '冒烟测试' 的用例. 
    --include 冒烟测试  
    
    
    # 执行不包含标签 '冒烟测试' 的用例.
    --exclude 冒烟测试 
    
    
    # 执行 有冒烟测试、UITest 两个标签的用例
    --include 冒烟测试ANDUITest 
    
    
    # 执行 有 冒烟测试 或者 UITest 标签 的用例
    --include 冒烟测试   --include UITest
    
    
    # 执行标签格式为 A*B 的用例,比如 A5B, AB, A444B
    --include A*B    

    例如:

    利用方式3中param文件执行测试用例,并且排除  登录功能

    run -A param --exclude 登录功能

    param文件:

     但是用例【管理员首页_UI_0401】【管理员首页_UI_0402】加了标签  force_tags = ['登录功能']

     用例【管理员首页_UI_0301】用全局tag

     执行结果:只有用例【管理员首页_UI_0301】

     6)指定关键测试用例

    如果本次测试中有关键测试用例没有通过,整个测试就被视为测试不通过。反之,所有关键用例都通过,整个测试就视为通过。 即使100个中有99个非关键用例没有通过,只有1个关键通过。

    hyrobot 执行测试时,如果没有命令行参数特别指定,每个测试用例都被视为关键测试用例。

    我们可以通过命令参数 --critical 或 --noncritical 后面加 标签名称 来指定哪些用例 是 关键用例 或者 非关键用例。

     运行时可以指定:

    有first标签的是关键测试用例:

    run --critical first

    有first标签的是非关键测试用例:

    run --noncritical first

    具有 以 basic 开头 或者 important开头 的标签 的用例都是关键用例,其他用例都不是关键用例:

    run --critical basic*  --critical important*

     

    6、 数据驱动

    如果有一批测试用例,具有 相同的测试步骤 ,只是 测试参数数据不同 。自动化测试时,把测试数据从用例代码中 分离 开来,以后增加新的测试用例,只需要修改数据。这就是数据驱动。

    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()
    

    7、公共代码放入库中

     例如,将登录代码放入login.py中,其他用例或是套件进行导入

     使用

     8、初始化与清除

    创建测试开始条件

    1)单个用例初始化、清除

    然后修改 库文件 login.py ,如下

    from hyrobot.common import GSTORE
    
    def open_brower():
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--ignore-certificate-errors')
        driver = webdriver.Chrome(options=chrome_options)
        driver.implicitly_wait(5)
        # 使用黑羽robot 全局存储对象 GSTORE
        GSTORE['global_webdriver'] = driver
        return driver
    
    # 获取 全局使用的 webdriver 对象
    def get_global_webdriver():
        return GSTORE['global_webdriver']
    
    
    def login_web(driver):
        driver.get('http://127.0.0.1:8087/mgr/sign.html')
        # 根据 ID 选择元素,并且输入字符串
        driver.find_element_by_id('username').send_keys('byhy')
        driver.find_element_by_id('password').send_keys('88888888')
        # 根据标签名查找元素
        driver.find_element_by_tag_name('button').click()
    from time import sleep
    from lib.login import *
    from hyrobot.common import *
    
    # 单个用例清除
    class c0101:
        name = '管理员首页_UI_0301'
        tags = "first"
        # 初始化方法
        def setup(self):
            driver = open_brower()
            print("driver---",driver)
            login_web(driver)
    
        #清除方法
        def teardown(self):
            driver = get_global_webdriver()
            print("driver:",driver)
            driver.quit()
    
        # 测试用例步骤
        def teststeps(self):
            # 获取webdriver对象 对应 已经登录好的浏览器
            driver = get_global_webdriver()
            print("teststeps-driver:",driver)
            STEP(2, '点击左侧客户菜单')
    
            # 先找到上层节点,缩小查找范围
            sidebarMenu = driver.find_element_by_class_name('sidebar-menu')
            # 再找到内部元素
            elements = sidebarMenu.find_elements_by_tag_name('span')
            # 第一个span对应的菜单是 客户,点击它
            elements[0].click()
    
            STEP(3, '添加客户')
            # 点击添加客户按钮
            driver.find_element_by_class_name('glyphicon-plus').click()
            # form-contorl 对应3个输入框
            inputs = driver.find_element_by_class_name('add-one-area').find_elements_by_class_name('form-control')
    
            # 输入客户姓名
            inputs[0].send_keys('南京中医院')
            # 输入联系电话
            inputs[1].send_keys('2551867858')
            # 输入客户描述
            inputs[2].send_keys('江苏省-南京市-秦淮区-汉中路-16栋504')
    
            # 第1个 btn-xs 就是创建按钮, 点击创建按钮
            driver.find_element_by_class_name('add-one-area').find_element_by_class_name('btn-xs').click()
    
            # 等待1秒
            sleep(1)
            STEP(4, '检查添加信息')
    
            # 找到 列表最上面的一栏
            item = driver.find_elements_by_class_name('search-result-item')[0]
    
            fields = item.find_elements_by_tag_name('span')[:6]
            print('fields:::',fields)
            texts = [field.text for field in fields]
            print('texts:::',texts)
    
            # 预期内容为
            expected = [
                '客户名:',
                '南京中医院',
                '联系电话:',
                '2551867858',
                '地址:',
                '江苏省-南京市-秦淮区-汉中路-16栋504'
            ]
    
            CHECK_POINT('客户信息和添加内容一致 ',
                        texts == expected)

    2) 整个用例文件的初始化、清除

    整个 用例文件 的初始化、清除 是在 文件中 添加全局函数 suite_setup、suite_teardown

    from hyrobot.common import *
    from lib.login import  *
    from time import sleep
    
    force_tags = ['登录功能']
    
    def suite_setup():
        INFO('suite_setup')
        driver = open_brower()
        login_web(driver)
    
    def suite_teardown():
        INFO('suite_teardown')
        driver = get_global_webdriver()
        driver.quit()
    
    class c0401:
        # 测试用例名字
        name = '管理员首页_UI_0401'
    
        # 测试用例步骤
        def teststeps(self):
            driver = get_global_webdriver()
            STEP(1, '获取左侧菜单信息')
    
            # 先找到上层节点,缩小查找范围
            sidebarMenu = driver.find_element_by_class_name('sidebar-menu')
    
            # 再找到内部元素
            elements = sidebarMenu.find_elements_by_tag_name('span')
    
            menuTitles = []
            for ele in elements:
                INFO(ele.text)
                menuTitles.append(ele.text)
    
            raise Exception
    
    
            STEP(2, '检查是否正确')
    
            CHECK_POINT("侧边栏菜单是否正确",
                        menuTitles[:3] == ['客户', '药品', '订单'])
    
    
    class c0402:
        name = '管理员首页_UI_0402'
    
        # 测试用例步骤
        def teststeps(self):
    
            driver = get_global_webdriver()
    
    
            STEP(1, '点击左侧客户菜单')
    
            # 先找到上层节点,缩小查找范围
            sidebarMenu = driver.find_element_by_class_name('sidebar-menu')
    
            # 再找到内部元素
            elements = sidebarMenu.find_elements_by_tag_name('span')
    
            # 第一个span对应的菜单是 客户,点击它
            elements[0].click()
    
            STEP(2, '添加客户')
    
            # 点击添加客户按钮
            driver.find_element_by_class_name('glyphicon-plus').click()
    
            # form-contorl 对应3个输入框
            inputs = driver.find_element_by_class_name('add-one-area') 
                .find_elements_by_class_name('form-control')
    
            # 输入客户姓名
            inputs[0].send_keys('南京中医院')
            # 输入联系电话
            inputs[1].send_keys('2551867858')
            # 输入客户描述
            inputs[2].send_keys('江苏省-南京市-秦淮区-汉中路-16栋504')
    
            # 第1个 btn-xs 就是创建按钮, 点击创建按钮
            driver.find_element_by_class_name('add-one-area') 
                .find_element_by_class_name('btn-xs') 
                .click()
    
            # 等待1秒
            sleep(1)
    
    
            STEP(3, '检查添加信息')
    
            # 找到 列表最上面的一栏
            item = driver.find_elements_by_class_name('search-result-item')[0]
    
            fields = item.find_elements_by_tag_name('span')[:6]
    
            texts = [field.text for field in fields]
            print(texts)
    
            # 预期内容为
            expected = [
                '客户名:',
                '南京中医院',
                '联系电话:',
                '2551867858',
                '地址:',
                '江苏省-南京市-秦淮区-汉中路-16栋504'
            ]
    
            CHECK_POINT('客户信息和添加内容一致 ',
                        texts == expected)
    View Code

    3)套件目录的初始化、清除

    在这个目录下面创建名为 __st__.py 的文件。

    和套件文件一样,套件目录的 的初始化、清除 也是在 文件中 添加全局函数 suite_setup、suite_teardown。

    9、缺省初始化、清除

    用例文件、和套件目录 除了 可以使用 suite_setup、suite_teardown 对整个目录进行初始化清除,还支持另外一种初始化清除: 缺省初识化、清除

    就是定义 名称为 test_setup 和 test_teardown 的全局函数。

    如果在 用例文件 中定义了 全局函数 test_setup ,如果 该文件中 有用例本身没有初始化 方法, 执行自动化的时候就会对该用例,使用这个 test_setup 初始化

    如果在 用例文件 中定义了 全局函数 test_teardown ,如果 该文件中 有用例本身没有清除 方法, 执行自动化的时候就会对该用例,使用这个 test_teardown 清除。

    参考:http://www.python3.vip/tut/auto/hyrobot/02/

  • 相关阅读:
    HRESULT:0x80070057 (E_INVALIDARG)的异常的解决方案
    c# 取两个时间的间隔
    [转]C#算法
    智能仓库管理系统方案(四)
    分页存储过程
    ASP.NET2.0_多语言本地化应用程序(转)
    C#绘图双缓冲技术总结(转)
    C#.net同步异步SOCKET通讯和多线程总结(转)
    WIN2003 sp2中Delphi 7中的Project菜单中Options菜单打不开
    C#关于日期月天数和一年有多少周及某年某周时间段的计算
  • 原文地址:https://www.cnblogs.com/ychun/p/14586735.html
Copyright © 2020-2023  润新知