创建测试库
测试库的实现可以是Python模块, 也可以是Python类.
Python模块
Python类
测试库通常在 Setting 表格中设置 Library 来导入, 库名称跟在 Library
后面. 不同于大部分的其它数据, 库名称既是大小写敏感的, 也是空白敏感的. 如果一个测试库是在某个文件里的, 则必须指明路径.
测试结果
============================================================================== Functest ============================================================================== 测试库用例 我的方法 我的类 | PASS | ------------------------------------------------------------------------------ Functest | PASS | 1 test, 1 passed, 0 failed ==============================================================================
一些重要的概念:
- 实现为类的测试库都可以接受参数. 这些参数在Setting表中指定, 跟在库名后面, 当Robot Framework创建测试库的实例时, 把这些参数传给构造函数.意思就是MyModule=MyModule(__init__方法的参数),之后使用MyModule.method。
- 有个常用场景是通过数据库获取数据,就可以创建测试库完成。
开始连接 ============================================================================== Functest ============================================================================== DBtest 开始连接 开始查询 查询完成,数据为{'id': 1, 'username': 'admin', 'password': 'pbkdf2:sha256:260000$l0K5upqR$87143093593e3622bc700f3c57e91180ad05ccb51169b36617cfe3ac6207c9a2', 'nickname': '管理员', 'email': '[email protected]', 'isadmin': 0, 'group_id': 1, 'create_time': datetime.datetime(2022, 10, 15, 20, 19, 4), 'update_time': datetime.datetime(2022, 10, 15, 20, 19, 4), 'delete_time': None, 'update_user_id': None, 'create_user_id': None, 'update_user_name': None, 'create_user_name': None} | PASS | ------------------------------------------------------------------------------ Functest | PASS | 1 test, 1 passed, 0 failed ==============================================================================
- 有个常用场景是通过数据库获取数据,就可以创建测试库完成。
- 传递给库的参数, 包括库名本身, 都可以使用变量. 也就是说可以在某些时候, 例如命令行(--variable), 修改它们.
- Robot Framework 为了保证测试用例之间的独立性, 默认情况下, 它为每个测试用例 创建新的测试库实例. 然而, 这种方式不总是我们想要的, 比如有时测试用例需要共享 某个状态的时候. 此外, 那些无状态的库显然也不需要每次都创建新实例.
- TEST CASE 为每个测试用例创建新的实例. 如果有suite setup和suite teardown的话, 同样 也会新建. 这是默认行为.
TEST SUITE
为每个测试集创建新的实例. 最底层的测试集, 也就是由测试用例文件组成的测试集, 拥有属于自己的测试库实例, 高层的测试集, 都有属于自己的测试库实例.GLOBAL
整个测试执行过程中只有一个实例被创建. 所有的测试集和测试用例共享这个实例. 通过模块创建的测试库都是全局的.from robot.api import logger class MyModule: ROBOT_LIBRARY_SCOPE = 'GLOBAL' def __init__(self): self._counter = 0 def count(self): self._counter += 1 logger.console(self._counter) def clear_counter(self): self._counter = 0
- 名称的比较是忽略大小写的, 并且其中的空格和下划线 也都忽略掉
- 异常的回溯(traceback)信息在 日志级别 为
DEBUG
时也会被写入日志 - 有时候出现异常意味着要 结束整个测试. 要实现这种效果, 为抛出的异常类设置一个特殊的
ROBOT_EXIT_ON_FAILURE
属性 , 并将其值设为True
- 有时候, 即使出现了错误仍然希望测试 继续执行. 这时要为异常类设置特殊属性
ROBOT_CONTINUE_ON_FAILURE
, 并将值设为True
. - 其中一个最有用的方法是
replace_variables
, 它允许访问当前可用的变量.- 比如我们不知道rfw的哈希方法,可以自己写一个
import hashlib from robot.libraries.BuiltIn import BuiltIn class MyModule: def getcode(self,password): code = hashlib.md5(BuiltIn().replace_variables("${password}").encode()) print(code.hexdigest())
*** Test Cases *** case1 Set Global Variable ${password} 111111 Getcode ${password}
============================================================================== Functest ============================================================================== case1 | PASS | ------------------------------------------------------------------------------ [info] ${password} = 111111 [info] 96e79218965eb72c92a549dd5a330112 Functest | PASS | 1 test, 1 passed, 0 failed ==============================================================================
- 比如我们不知道rfw的哈希方法,可以自己写一个
- 一个直接的方式是使用继承来扩展已有库,一个大问题是, 这两个库将很难同时使用. 首先这两个库的同名关键字会产生 冲突, 另外, 这两个库没有共享状态.
- 比如rfw使用requests不打印请求响应信息,可以重写session类来打印
============================================================================== Functest ============================================================================== [info] ${data} = {'username': 'admin', 'password': '111111'} case1 b'{"username": "admin", "password": "111111"}' {'name': 'admin', 'nickname': '管理员', 'token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTY2NjI4MzI3NCwianRpIjoiMTY0ZmEzYjAtNDI1ZC00YzE1LWEyM2ItOThiMGIzZWY4NDY0IiwidHlwZSI6ImFjY2VzcyIsInN1YiI6MSwibmJmIjoxNjY2MjgzMjc0LCJleHAiOjE2NjYzMDEyNzR9.ndUAu0VmcBKLvS9AGmxb-nufVumA4hR-9qeegKxJ4GI', 'uuid': 1} | PASS | ------------------------------------------------------------------------------ Functest | PASS | 1 test, 1 passed, 0 failed ==============================================================================
- 比如rfw使用requests不打印请求响应信息,可以重写session类来打印
- 内置关键字 Get Library Instance 可以用来获取当前活动的测试库的实例. 该关键字返回的实例与框架自己使用的实例完全一样
- 比如获取正在运行的Selenium实例获取页面元素
*** Settings *** Library BuiltIn Library SeleniumLibrary Library util/SeLibExtensions.py Suite Teardown Close All Browsers *** Variables *** ${host} http://www.baidu.com *** Test Cases *** case1 Open Browser ${host} chrome SeLibExtensions.Title Should Be 谷歌
============================================================================== Functest ============================================================================== [info] Opening browser 'chrome' to base url 'http://www.baidu.com'. [info (+2.43s)] 获取的抬头:百度一下,你就知道 [FAIL] Title '百度一下,你就知道' is not '谷歌' case1 | FAIL | Title '百度一下,你就知道' is not '谷歌' ------------------------------------------------------------------------------ Functest | FAIL | 1 test, 0 passed, 1 failed ==============================================================================
- 比如获取正在运行的Selenium实例获取页面元素
-
导入测试库的另一种方式是使用 BuiltIn 库提供的关键字 Import Library. 该关键字接受库名称以及可能的参数作为它的参数. 被导入的库中的关键字在调用 Import Library 关键字的测试套件中可用。
- 重写上面的功能,初始化就获取对象,复用对象方法,可以用Import Library在实例生成后导入多个实例,使用
WITH NAME
(此处区分大小写) 命名,调用特定实例的方法。*** Settings *** Library BuiltIn Library SeleniumLibrary Suite Teardown Close All Browsers *** Variables *** ${host} http://www.baidu.com *** Test Cases *** case1 Open Browser ${host} chrome b1 ${seleniumlib} Get Browser Aliases Import Library util/SeLibExtensions.py SeleniumLibrary WITH NAME mydriver mydriver.get_session_id Open Browser ${host} chrome b2 Switch Browser b2 ${seleniumlib} Get Browser Aliases Import Library util/SeLibExtensions.py SeleniumLibrary WITH NAME mydriver2 mydriver2.get_session_id
============================================================================== Functest ============================================================================== [info] Opening browser 'chrome' to base url 'http://www.baidu.com'. [info (+4.34s)] ${seleniumlib} = {'b1': 1} case1 dd7cf760150bbb2a910e1a355414eda5 [info (+0.01s)] Opening browser 'chrome' to base url 'http://www.baidu.com'. [info (+9.59s)] ${seleniumlib} = {'b1': 1, 'b2': 2} ee414a1679bb6013acdcdbc6edefeb82 | PASS | ------------------------------------------------------------------------------ Functest | PASS | 1 test, 1 passed, 0 failed ==============================================================================
- 重写上面的功能,初始化就获取对象,复用对象方法,可以用Import Library在实例生成后导入多个实例,使用
以上是robotframework自动化测试框架创建及使用测试库的主要实践,可以完善和增强robotframework基本功能。先到这里。
标签:info,教程,Library,Functest,实例,robotframework,测试,PASS From: https://www.cnblogs.com/zerotest/p/16812157.html