目录
robot framework和pytest的区别:
共同点:
作为测试框架,其作用就是帮助我们管理测试用例、执行测试用例、生成测试报告等,这两款测试框架都可帮我们实现这些功能
区别:
robot framework:
优点:通过关键字驱动,可以自定义测试库,自动提供测试报告;
缺点:不支持复杂的语法,不够灵活
pytest:
优点:支持很多第三方插件,比较灵活
缺点:需要测试人员有一定的python代码能力
一、框架介绍
Robot Framework 是一个基于Python的、可扩展的、关键字驱动的测试自动化框架。
为什么选择Robot Framework
- 可以通过现有关键字创建可复用的 高层关键字
- 提供了直观的HTML格式的 测试报告 和 日志文件
- 提供了 测试库API,可以轻易地使用Python或者Java创建自定义的测试库
- 提供了多种测试库支持,如用于web测试的Selenium,Java GUI测试,启动进程,Telnet,SSH等
- 提供 标签 来分类和 选择测试用例
- 提供了 用例级别 和 测试套件级别 的setup和teardown
二、安装
如果你已经安装了 pip ,通过命令 pip install robotframework 就能安装robot framework
三、基本语法
robot framework的语法学起来可能有点别扭,我基本上全是用python来自定义测试库,只利用robot framework框架将测试用例运行起来,自动生成测试报告
- robot文件中,每个变量之间的间隔,是4个空格
*** Settings *** ,*** Test Cases *** 是固定格式,A.py是我的自定义library
Test Setup, Test Teardown 会在每个test case执行前后分别执行;
Suite Setup 和 Suite Teardown 会在每个测试套件执行前后分别执行,一般一个Suite(测试套)就是一个robot文件- [Documentation] 是test case的描述,可以加中文
- [Tag] 是test case的标签,用来对case进行分类
- test_1是A.py文件中,test case的名字,也就是我们自定义library中的关键字
- 注意:自定义library的文件名,要和class的名字相同
01_test.robot 文件
*** Settings ***
Test Setup A.setUpClass
Test Teardown A.tearDownClass
Library A.py
*** Test Cases ***
test_1
[Documentation] XXXX
[Tags] tag
test1
A.py 文件
class A(Base):
@classmethod
def setUpClass(self):
pass
@classmethod
def tearDownClass(self):
pass
def test_1(self):
pass
运行
通过执行robot.run()函数,就能执行Testcases/目录下的所有.robot文件
retry是失败后重试的次数,该选项生效需要配置一下环境参数,详细请参见Robot Framework-失败用例自动重跑 - 白灰 - 博客园
# -*- coding:utf-8 -*-
import robot
testcases = 'Testcases/' # 测试用例路径
include_tag = [''] # 运行的tag
exclude_tag = ['tag1','tag2'] # 不运行的tag
log = 'log.html' # 生成的测试log文件目录
report = 'report.html' # 生成的测试报告文件名
output = 'output.xml' # 生成的xml文件名
robot.run(testcases=testcases,
include=include_tag,
exclude=exclude_tag,
log=log,
report=report,
output=output,
retry=1)
四、从xml文件中获取到失败项
import xml.dom.minidom
def getFailcases(output):
context = ''
dom = xml.dom.minidom.parse(output) #打开xml文档
testList = dom.getElementsByTagName('test') # 获取标签
num=1
for element in testList:
if element.getElementsByTagName('status')[-1].getAttribute('status') == 'FAIL': # 获取标签属性
suite = element.parentNode.getAttribute('name')[3:]
test = element.getAttribute('name')
description = element.getElementsByTagName('status')[-1].firstChild.data
if u'Parent suite' in description:
if suite in context:
continue
else:
context=context+ suite +'; '+ description+'\n'
else:
context = context+ str(num) + '. '
context= context + suite +' '+ test+ ': '+ description+'\n'
num=num+1
return context
if __name__=='__main__':
res=getFailcases('output.xml')
print(res)