RobotFramework介绍与使用
介绍
robotframework 官网介绍
robotframework是一个开源的自动化测试框架,支持关键字驱动,可以采用python和java进行库的拓展。支持web、app、api、desktop、db等的自动化操作。支持关键字驱动和数据驱动方法。
有RIDE等UI编辑器,但是建议用vscode或pycharm直接编辑,因为有插件,可以辅助编辑更方便。安装方法
同时有网址可以查找常用的关键词
安装
pip install robotframeworkrobot --version
# 查看版本,验证安装没问题
常用的库
Builtin
常用的内建库
SeleniumLibrary
基于SELENIUM的web自动化库
Browser Library
基于playwright的web自动化库
RequestsLibrary
基于requests的api自动化库
AppiumLibrary
基于Appium的app自动化库
Database Library
数据库Oracle、Mysql链接库
DataDriver Library
csv, xls, xlsx的读写库
常规的格式
*** Settings ***
Library Browser*** Variables ***
${BROWSER} chromium
${HEADLESS} false*** Test Cases ***
Create Quote Test Case NameOpen Insurance ApplicationEnd Test*** Keywords ***
Open Insurance ApplicationNew Browser browser=${BROWSER} headless=${HEADLESS}New Context locale=en-GBNew Page http://sampleapp.tricentis.com/End TestClose ContextClose Browser
注意事项
变量作用域
set global variable
使用该关键字修改变量作用域后,在所有测试套件suite中都可以使用该关键字定义的变量
Set Suite Variable
使用此关键字设置的变量在当前执行的测试套件的范围内随处可用
Set Test Variable
使用此关键字设置的变量在当前执行的测试用例的范围内随处可用
变量
变量 用scalar数组创建时用scalar数组创建时用{scalar} 或 @{list};当遍历时用@{list},用scalar时只遍历一次;当向自定义python函数传输时用scalar时只遍历一次;当向自定义python函数传输时用${scalar}
字典 创建时用&{dict};当遍历时用&{dict}
运行用例
# 在项目脚本目录下运行
robot --pythonpath . -d logfolder testcasefolder_or_robotfile
testcasefolder_or_robotfile 可以指定运行的文件夹或robot文件
--pythonpath . 引用文件时可以用相对路径,否则用${CURDIR}/指定绝对路径或设置环境变量PYTHONPATH
-d logfolder 测试结果和日志存放的位置
重新运行失败用例
robot --output original.xml tests # first execute all tests
robot --rerunfailed original.xml --output rerun.xml tests # then re-execute failing
rebot --merge original.xml rerun.xml # finally merge results
或者 用新的扩展插件
pip install robotframework-retryfailed
robot --listener RetryFailed:1 <robot suite>
测试工程构建
一般按照如下结构来搭建,主要分关键字(resources)和测试用例(testcases)两部分。
resources下主要是变量和关键字。根据测试场景进行细分,如UI测试可按POM模式进行细分为公共操作关键字,网页元素定位变量、网页操作关键字、业务层面关键字等;API测试可分为接口请求关键字和响应关键字,共同处理关键字等。
testcases下是实际测试用例的组装,将上面的resource引入测试用例,组装成可运行的cases。
如此拆分,更容易理解,并且对变化的修改更容易。
按照上面的结果,写了一个demo,将RF的几个经典的关键字和用法放进去,大家可以参照。
# demo.robot
*** Settings ***
Documentation Test case for adding and removing todo items in a TodoMVC application.
Library SeleniumLibrary
Library Collections
Resource ${CURDIR}/../resources/demo.resource
Variables ${CURDIR}/../resources/variables.py
Library ${CURDIR}/../resources/utils.py
Suite Setup Open Website url=${URL}
Suite Teardown Close All Browsers*** Variables ***
${URL} https://todomvc.com/examples/angular/dist/browser/#
${TODO1} Complete Robot Framework Training
${TODO2} Write Automated Tests
${TODO3} Take a nap
@{TODOLeftlist}= ${TODOLeft2} ${TODOLeft1} ${TODOLeft0}*** Test Cases ***
Add And Remove Todo Items[Documentation] Test adding and removing todo items on the TodoMVC application.[Tags] TodoMVC Regression[Timeout] 5 minutes[Setup]Log To Console had opened the websiteLog Many @{TODOLeftlist}@{TODOlist}= Create List ${TODO1} ${TODO2} ${TODO3}FOR ${ToDo} IN @{TODOlist}Add New-Todo Item ${ToDo}Log To Console Added todo item:============== ${ToDo}ENDVerify Todo Count ${TODOLeft3}@{PAIRS}= Zip List Items ${TODOlist} ${TODOLeftlist}FOR ${PAIR} IN @{PAIRS}${TODO}= Set Variable ${PAIR}[0]${TODOLeft}= Set Variable ${PAIR}[1]Delete Todo Item ${TODO}Sleep 1sVerify Todo Count ${TODOLeft}END[Teardown]Log To Console had done all things
setup\teardown、自定义函数使用、resource文件使用、基本结构 等等
# demo.resource
*** Settings ***
Library SeleniumLibrary*** Keywords ***
Open Website[Arguments] ${url}Open Browser ${url} browser=chromeMaximize Browser WindowAdd New-Todo Item[Arguments] ${item}Input Text css:.new-todo ${item}Press Keys css:.new-todo RETURNVerify Todo Count[Arguments] ${expected_count}Element Text Should Be class:todo-count ${expected_count}Delete Todo Item[Arguments] ${item}Mouse Over xpath: //*[contains(text(), "${item}")]Click Element xpath: //*[contains(text(), "${item}")]/../input
关键字demo
# variables.py
TODOLeft3="3 items left"
TODOLeft2="2 items left"
TODOLeft1="1 item left"
TODOLeft0="0 items left"
外部定义变量
#utils.py
from robot.libraries.BuiltIn import BuiltIn
from robot.api.logger import consoledef zip_list_items(items1, items2):# console(str((items1)))i = []for index, item in enumerate(items1):i.append([item, items2[index]])return i
外部定义函数,并使用robot自带函数
数据驱动是使用template来实现。
工具使用,在于熟能生巧