百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

认识 RIDE(第3节)

toyiye 2024-06-21 12:28 13 浏览 0 评论

Run

我一直在想 Robot Framework 不要 RIDE 可不可以。对于编写测试用例来说,只要掌握 Robot

Framework 的语法规则,随便在一个你顺手的编辑器下编写也没问题,甚至效率更高。为什么要填写那个该死的“表格”。

直到运行案例的时候我才意识到 RIDE 的好处。在 RIDE 中运行测试用例,就是勾选想要运行的用例,然后点击按钮即可。想想我们在做单元测试的时候可不会这么方便,调用 addTest()方法将一个个想要运行的测试方法添加到测试套件中,或者一行行的注释掉不添加到测试套件的测试用例的addTest()方法,这是个极其痛苦的过程。

Run 标签

下面是 Run 标签的截图:

第一眼看上去,Run 标签提供了丰富的操作和日志。按照截图我们依次来说明 Run 标签上的按钮和输入框的作用:

1)Execution Profile:选择运行方式,里面有 pybot、jybot 和 custom script。其中我们默认是用 pybot 来运行案例,pybot 的运行 Python 编译器完成。jybot 需要安装 Jython 的支持。custom script 是选择自定义的脚本来运行。

2)Start 和 Stop:用例的运行和停止。

3)Report 和 Log:报告和日志,要运行之后才能点击。他们之间的区别:报告更多是结果上的展示, 日志更多是过程的记录,在测试用例调试的过程中更多使用日志来查看执行错误。当只想知道测试用例的最终执行情况时用报告。

4)Autosave:自动保存,如果不勾选,在修改了用例之后如果没有保存的话,运行案例时会提示是否保存。勾选则在运行时自动保存了。

5)Arguments:pybot 的参数(或者 jybot 等),可以在这里输入 pybot 的命令完成相应的操作。

6)Only Run Tests with these Tags:只运行这些标记的测试案例。

7)Skip Tests with these Tags: 跳过这些标记的测试案例。

下面的两个区域,中间区域记录用例的执行过程,底部的区域输出用例的执行结果。

command: pybot.bat --argumentfile c:\users\fnngj\appdata\local\temp\RIDEg0ek6m.d\argfile.txt --listener

C:\Python27\lib\site-packages\robotide\contrib\testrunner\TestRunnerAgent.py: 63009:False D:\robot\测试项目

=================================================================

测试项目

=================================================================

测试项目.测试套件

=================================================================

test case | PASS |

-----------------------------------------------------------------

test case2 | PASS |

-----------------------------------------------------------------

test case3 | PASS |

-----------------------------------------------------------------

测试项目.测试套件 | PASS |

3critical tests, 3 passed, 0 failed

3 tests total, 3 passed, 0 failed

=================================================================

测试项目 | PASS |

3 critical tests, 3 passed, 0 failed

3 tests total, 3 passed, 0 failed

=================================================================

Output: c:\users\fnngj\appdata\local\temp\RIDEg0ek6m.d\output.xml Log:c:\users\fnngj\appdata\local\temp\RIDEg0ek6m.d\log.html Report: c:\users\fnngj\appdata\local\temp\RIDEg0ek6m.d\report.html

test finished 20150304 16:33:22

Starting test: 测试项目.测试套件.test case

20150304 16:33:22.639 :INFO : test1

Ending test:测试项目.测试套件.test case

Starting test: 测试项目.测试套件.test case2

20150304 16:33:22.643 :INFO : 小明 欢迎你第一次使用 Robot Framework。它的强大性和易用性相信会让你的测试工作变得更加简单可靠。

20150304 16:33:22.645 :INFO : 小红 欢迎你第一次使用 Robot Framework。它的强大性和易用性相信会让你的测试工作变得更加简单可靠。

Ending test:测试项目.测试套件.test case2

Starting test: 测试项目.测试套件.test case3 20150304 16:33:22.649 :INFO : 小明

20150304 16:33:22.652 :INFO : 小红

20150304 16:33:22.654 :INFO : 小华

20150304 16:33:22.657 :INFO : 小刚

Ending test:测试项目.测试套件.test case3

运行与停止

在 Run 标签页提供了运行与停止的按钮,使用很简单。可是你知道到点击“运行”按钮的时候,Robot

Framework 是怎么执行“测试套件.txt”文件的么?点击“停止”按钮的时候,Robot Framework 又做了什么操作来终止用例的执行的?带着这样的疑问,我们来简单的读一下 RIDE 的 run 代码。

首先打开 C:\Python27\Lib\site-packages\robotide\run 目录下的 process.py 文件。

import os import time import tempfile

import subprocess

class Process(object):

……

def start(self):

self._out_fd, self._out_path = \

tempfile.mkstemp(prefix='rfproc_', suffix='.txt', text=True)

self._out_file = open(self._out_path) if not self._command:

self._error = 'The command is missing from this run configuration.' return

try:

self._process = subprocess.Popen(self._command, stdout=self._out_fd,

stderr=subprocess.STDOUT)

except OSError, err: self._error = str(err)

……

def stop(self): try:

self._process.kill() except AttributeError:

raise AttributeError('Stopping process is possible only with ' 'Python 2.6 or newer')

……

def get_output(self, wait_until_finished=False): """Returns the output produced by the process.

If ``wait_until_finished`` is True, blocks until the process is finished and returns all output. Otherwise the currently available output is returned immediately.

Currently available output depends on buffering and might not include everything that has been written by the process.

"""

if self._error: self._close_outputs() return self._error

if wait_until_finished: self._process.wait()

output = self._out_file.read() if self.is_finished():

self._close_outputs() return output

def _close_outputs(self): self._out_file.close() os.close(self._out_fd) self._remove_tempfile()

以上为 process.py 文件的部分代码。看有标蓝的代码即可。

首先看 start()方法,通过 tempfile 模块的 mkstemp()方法找到“txt”文件,也就是“测试套件.txt”文这类件。接着通过 open()方法打开。

在 get_output()方法中通过 read()方法来读取“txt”文件。最后把读取的文件的赋值给变量 output 并返

回。

在_close_outputs()方法中通过 close()关闭打开的“txt”文件。

停止测试用例的执行非常单间,由 stop()方法实现,通过调用 kill()将用例的执行进程杀死。

代码读到这里只是开始,get_output()方法读到的文件返回给谁了呢?或者谁会调用 get_output()方法呢?继续打开 C:\Python27\Lib\site-packages\robotide\run 目录下的 ui.py 文件

……

from robotide.run.process import Process

……

class Runner(wx.EvtHandler):

def init (self, config, notebook): wx.EvtHandler. init (self) self.Bind(wx.EVT_TIMER, self.OnTimer) self.name = config.name

self._timer = wx.Timer(self) self._config = config

self._window = self._get_output_window(notebook)

def _get_output_window(self, notebook): return _OutputWindow(notebook, self)

def run(self):

self._process = Process(self._config.command) self._process.start()

self._timer.Start(500)

def OnTimer(self, event=None):

finished = self._process.is_finished() self._window.update_output(self._process.get_output(), finished) if finished:

self._timer.Stop()

def stop(self): try:

self._process.stop() except Exception, err:

wx.MessageBox(str(err), style=wx.ICON_ERROR)

……

ui.py 文件调用 process.py 文件的方法来运行测试用例。如果读者精通于 Python 语言的话可以顺着这条线继续读下去,看看哪个方法会调用 Runer 类。因为本文档的重点的不是分析 Robot Framework 代码,所以不在再继续。但这里想传达的思路是知其然,一定要知其所以然;用工具而不要受制于工具。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码