设置RobotFramework的ftplibrary中,将Upload_file操作的异常改为回显错误信息。

测试中需要通过FTP通道,将数据发送给服务器,而这个上传的数据要被阻断。在结合RobotFramework测试中,安装的ftplibrary,使用upload_file操作,如果上传动作失败,会抛出异常,使Robotframework测试失败。

而其实我们就是想让他上传失败,不要抛出异常,导致测试失败。这时需要更改下ftplibrary.py。也是非常简单的,我简单记录下:

首先,下载ftplibrary安装包,下载地址:https://pypi.python.org/pypi/robotframework-ftplibrary/1.3

然后执行: Python setup.py install,将其安装。默认应该安装在\Python27\Lib\site-packages\ftplibrary.py.

打开文件后,可以看到upload_file函数的异常处理:

    def upload_file(self, localFileName, remoteFileName=None, connId=‘default‘):
        thisConn = self.__getConnection(connId)
        outputMsg = ""
        remoteFileName_ = ""
        localFilePath = os.path.normpath(localFileName)
        if not os.path.isfile(localFilePath):
            raise FtpLibraryError("Valid file path should be provided.")
        else:
            if remoteFileName==None:
                fileTuple = os.path.split(localFileName)
                if len(fileTuple)==2:
                    remoteFileName_ = fileTuple[1]
                else:
                    remoteFileName_ = ‘defaultFileName‘
            else:
                remoteFileName_ = remoteFileName
            try:
                outputMsg += thisConn.storbinary("STOR " + remoteFileName_, open(localFilePath, "rb"))
            except ftplib.all_errors as e:
               raise FtpLibraryError(str(e))
        if self.printOutput:
            logger.info(outputMsg)
        return outputMsg

它引用了Python自带的ftplib库(\Python\27\Lib\ftplib.py):

打开ftplib.py可以看到对于异常的处理:

# Exception raised when an error or invalid response is received
class Error(Exception): pass
class error_reply(Error): pass          # unexpected [123]xx reply
class error_temp(Error): pass           # 4xx errors
class error_perm(Error): pass           # 5xx errors
class error_proto(Error): pass          # response does not begin with [1-5]

# All exceptions (hopefully) that may be raised here and that aren‘t# (always) programming errors on our sideall_errors = (Error, IOError, EOFError)

因为FTP上传文件被阻止后,返回的错误代码是553。所以只需要将Upload_file函数的异常处理再添加一个对“5XX”(class error_perm(Error): pass # 5xx errors)的判断即可。

下面是添加后的样子(红色是添加的异常判断):

    def upload_file(self, localFileName, remoteFileName=None, connId=‘default‘):
        """
        Sends file from local drive to current directory on FTP server in binary mode.
        Returns server output.
        Parameters:
        - localFileName - file name or path to a file on a local drive.
        - remoteFileName (optional) - a name or path containing name under which file should be saved.
        - connId(optional) - connection identifier. By default equals ‘default‘
        If remoteFileName agument is not given, local name will be used.
        Examples:
        | upload file | x.txt | connId=ftp1 |
        | upload file | D:/rfftppy/y.txt |  |
        | upload file | u.txt | uu.txt |
        | upload file | D:/rfftppy/z.txt | zz.txt |
        | upload file | D:\\rfftppy\\v.txt |  |
        """
        thisConn = self.__getConnection(connId)
        outputMsg = ""
        remoteFileName_ = ""
        localFilePath = os.path.normpath(localFileName)
        if not os.path.isfile(localFilePath):
            raise FtpLibraryError("Valid file path should be provided.")
        else:
            if remoteFileName==None:
                fileTuple = os.path.split(localFileName)
                if len(fileTuple)==2:
                    remoteFileName_ = fileTuple[1]
                else:
                    remoteFileName_ = ‘defaultFileName‘
            else:
                remoteFileName_ = remoteFileName
            try:
                outputMsg += thisConn.storbinary("STOR " + remoteFileName_, open(localFilePath, "rb"))
            except ftplib.error_perm as e:
               return str(e)
            except ftplib.all_errors as e:
               raise FtpLibraryError(str(e))
        if self.printOutput:
            logger.info(outputMsg)
        return outputMsg

然后再执行Robot framework测试时,就可以看到,文件被阻止了,但是测试成功,没有返回Fail:

20160316 11:07:52.446 :  INFO : 220 (vsFTPd 2.2.2)230 Login successful.
20160316 11:07:52.694 :  INFO :
${output} = 553-Requested action not taken
(by xxxx:10006)
553 END
20160316 11:07:52.698 :  INFO :
553-Requested action not taken
(by xxxx:10006)
553 END
时间: 2024-10-07 08:58:58

设置RobotFramework的ftplibrary中,将Upload_file操作的异常改为回显错误信息。的相关文章

php中对MYSQL操作之事务控制,回滚

<?php //事务控制,回滚 //创建一个mysqli对象 $mysqli = new MySQLi("主机名","mysql用户名","密码","数据库名"); //判断是否链接成功 if($mysqli->connect_error){ die($mysqli->connect_error); } //由于在事务提交中系统默认提交,故这里设置为FALSE先不提交 $mysqli->autocomm

element-ui中el-table(隔行换色,复选框回显)

1.隔行换色 el-table加上改属性,然后操作该方法 之后在添加颜色  2.复选框回显 a:表格数据不是动态加载的情况下,表格会自动选中之前选中的 b:表格数据是动态获取的,需要根据行来进行回显 原理:拿已经存储好的之前选中的数据去匹配表格中某一行的某一个属性,两个数组对象中可以匹配上,表格便会回显成功. 原文地址:https://www.cnblogs.com/yxkNotes/p/11584656.html

js中的DOM操作(一)——查看及设置节点

一.前言 DOM 是 W3C(World Wide Web Consortium)标准.同时也 定义了访问诸如 XML 和 HTML 文档的标准: DOM是一个使程序和脚本有能力动态地访问和更新文档的内容.结构以及样式的平台和语言中立的接口. 在HTML和JavaScript的学习中,DOM操作可谓时重中之重.今天,小编就领着大家来看看DOM操作是个什么样子!! 二.DOM节点  DOM节点分为三大类:元素节点.属性节点.文本节点: 而我们心心念念想知道的DOM树就长酱紫!          

MFC中注册热键操作--以CHotKeyCtrl设置热键为例

使用CHotKeyCtrl为程序添加热键功能,进行主界面的显示隐藏,类似于老板键,具体操作如下: 第一:获取设置的热键并使用RegisterHotKey进行热键的注册,代码如下: //获取热键键值 CHotKeyCtrl* photk=(CHotKeyCtrl*)GetDlgItem(IDC_HOTKEY1); WORD vkey,fsmoderfiers; photk->GetHotKey(vkey,fsmoderfiers); //注册热键 BOOL r=RegisterHotKey(m_h

C# Winform中执行post操作并获取返回的XML类型的数据

/// <summary> /// 返回指定日期的订单数据 /// </summary> /// <param name="StartDate">起始日期</param> /// <param name="EndDate">结束日期</param> /// <returns>DataTable</returns> public System.Data.DataTable

git工作中的常用操作

上班开始,打开电脑,git pull:拉取git上最新的代码: 编辑代码,准备提交时,git stash:将自己编辑的代码暂存起来,防止git pull时与库中的代码起冲突,否则自己的代码就白敲了: 然后,git pull:拉取一下代码,与库中代码,做到同步,有冲突则解决冲突,如果省了这一步,别人有提交的代码,没有更新,自己提交就会报错,再走这一步,就会把别人的代码拉取出来,然后一起提交,就相当于你提交了自己的代码,也提交了别人的代码:还有,有时这样会使库中代码乱掉,别人的心血也会丢失,你就是罪

IOS阶段学习第17天笔记(OC中文件的操作)

IOS学习(OC语言)知识点整理 一.单例模式 1)单例是一种编程思想,一个设计模式,与语言无关在采用了单例对象的应用程序中,需要单例类自行提供实例化单例对象, 不管实例化单例对象多少次,只有一个对象存在,这个对象是全局的,能够被整个应用程序共享,访问 2)使用单例模式时使用类提供的类方法获取单例对象,尽量不要用alloc init的方法获取单例对象 3)单例类提供类方法获取单例对象时类方法一般以sharedXX/standedXX/defaultXX开头 实例代码: #import "Plan

jQuery中对AJAX操作的封装函数

jQuery提供了6个简化AJAX操作的函数,每个都可以代替元素AJAX中的四步代码! (1)$('xxx').load()         jQuery对象函数 (2)$.get()                   jQuery全局函数 (3)$.post()                 jQuery全局函数 (4)$.getScript()          jQuery全局函数 (5)$.getJSON()           jQuery全局函数 (6)$.ajax()     

LoadRunner中Action的迭代次数的设置和运行场景中设置

LoadRunner中Action的迭代次数的设置和运行场景中设置 LoadRunner是怎么重复迭代和怎么增加并发运行的呢? 另外,在参数化时,对于一次压力测试中均只能用一次的资源应该怎么参数化呢?就是说这些资源用了一次就不能在用了的. --参数化时,在select  next row选择unique,update value on选择 each occurence, 1. 迭代跟虚拟用户数没什么必然联系 迭代是这样的: 迭代1次   迭代2次  迭代3次 用户1     X1