您的位置:首页 > 数据库 > Oracle

DatabaseLibrary—Oracle的测试介绍之windows篇

2016-10-21 15:12 260 查看
一、环境准备

基础环境

首先,robotframework的基础环境+DatabaseLibrary环境要准备好,没准备好的同学看一下之前发的文章,文章列表加到最后了。

安装支持

我们需要测试Oracle的话,需要安装一个支持库是cx_Oracle。

这个库的下载地址:

https://pypi.python.org/pypi/cx_Oracle

不推荐用pip安装,因为他会先判断你是否有安装Oracle客户端,在Mac或Linux上装这个是有点麻烦的,所以后面我会单独发文来说明,今天这篇主要是Windows的。用Windows系统的同学只需要在这边下载exe来安装即可,不过cx_Oracle版本有些多,上面下载地址里的是最新的常用的版本,如果你需要旧版的话,请到SourceForge去找一下,地址:

https://sourceforge.net/projects/cx-oracle/files/

我们以pypi的页面来继续说明



你要根据自己的实际情况来确定自己需要下载哪个文件。这里面有几个条件,第一个条件是你的Python的版本和位数,用robotframework的同学Python的版本一般都是2.7.x的,位数32或64位,怎么看位数,在命令行运行python,查看提示信息:

Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:40:30) [MSC v.1500 64 bit ( AMD64)] on win32

其中在中括号里的MSC这一段64bit代表了你的Python位数是64位的。如果写的是32bit那就是32位的。

第二个条件是你想用Oracle什么版本的数据库,9i不知道是否还有人用,目前能找到的cx_Oracle支持的就是10g、11g、12c,在pypi上只能看到11g和12c的cx_Oracle了,如果你想要旧版本的就去SourceForge里找一下吧。不过我在用支持11g的cx_Oracle的时候,放12c的dll也是可以支持的,兼容上也还可以,不过我没有尝试支持12c的cx_Oracle是否可以支持11g的dll。

接着我们看一下cx_Oracle的文件名,通常文件名里就已经告诉我们需要的信息了,你所要做的就是根据你自己的需要,找到正确的文件。

cx_Oracle-5.2.1-11g.win-amd64-py2.7.exe

cx_Oracle-5.2.1是cx_Oracle本身的版本号,接着11g表明这个安装包支持的Oracle数据库版本,win-amd64表明这是64位的,py2.7是指2.7系列的Python。

注意:这里的位数是和Python的位数去匹配而不是和Windows的位数,换言之,你的Windows是64位的,但是你装了32位的Python,那么你这里也是要用32位的cx_Oracle的。一般来说,Windows位数决定了Python可以安装什么位数,比如说64位的Windows可以装32位的Python也可以装64位的Python,但是32位的Windows就只能装32位的Python了。为啥在这里啰嗦这么多,因为很多人遇到问题的时候问他Python位数,结果他说的是我的Windows是64位,这种回答我是没法猜测你的Python版本的。

选对了cx_Oracle的安装文件,下载后运行安装就可以了。然后是我们重点需要关注的dll了,我们并不一定需要本机安装Oracle客户端,安装了也没关系,不需要卸载,我们只要保证放在site-packages里的dll是对的就行了。

Oracle数据库的dll一般都有对应的instant-client包,包里就有我们需要的dll文件了,官方的下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

如果从首页进入是点这里:



然后进入这个链接页面:



比如这里我们选择Windows (x64)的会进入如下页面,



这里会列出不同平台不同位数的instant-client,同样的,你要选择和你的Python位数对应包而不是和Windows位数对应的。比如我们选择一个Windows64位的之后,进入到下载页面,记得勾选Accept License Agreement同意才能下载,后面还需要Oracle的用户,注册一个就好了。 这个页面下面列了很多个版本,每个版本下面还有很多不同的包,我们需要的是All files的这个包,也就是每个版本下面的第一个下载链接。这个页面有12.x和11.x,还有10.x的,也就对应着12c、11g、10g,每个大版本下面还有若干小版本的,一般选最新的就好,或者自己随便选。选择之后,可能需要登录一下,没用户的可以注册一下。

下载完成之后,随便找个地方解压缩,在里面找到这几个dll,11g的需要3个,12g的需要多一个oraons.dll,我们要把这些dl放到site-packages目录下。

11g的需要这3个:



12g的需要这4个(其中有3个和11g的一样,只是把11换成12)



不过经过简单的实验有一个dll可以不用放,暂时没发现问题。懒人化处理是把所有的dll都放进去。

这些都弄好了之后,我们就可以连数据库了。

二、测试案例

其实测试案例前面都介绍了挺多的了,这回我们来说一下怎么样正确的使用DatabaseLibrary这个测试库。

我经常看到有人在使用数据库测试的时候,不知道该用什么关键字,胡乱使用之后在qq群里报问题求助,很多时候是比较低级的错误。 那么数据库测试其实概括起来就是下面这几点:

数据库连接工具

数据库连接写法

数据库语句写法

查询结果处理

1. 数据库连接工具

你要连接数据库总是需要有个工具的,sqlite是用的sqlite3工具(Python自带),mysql我们之前介绍用的是pymysql,oracle用的是上面介绍的cx_Oracle,其他的可能还有postage库用的psycopg2,sqlserver好像可以用pyodbc,后面这两个我不太熟悉,没用过。除了安装这些工具本身,可能还需要相关的一些配置,比如cx_Oracle我们就需要配置好oracle的instant-client的dll。这些工具配置好了,我们才能去用DatabaseLibrary去调用这些工具连数据库。

2.数据库连接写法

之前也介绍了,我推荐大家使用这个关键字来连接数据库 Connect To Database Using Custom Params 。还有一个Connect To Database,但是格式限制的太死我反而不知道该怎么写了。

而用Connect To Database Using Custom Params,很简单,就2个参数,一个是dbapiModuleName,一个是db_connect_string,dbapiModuleName就是告诉DatabaseLibrary,你用的是哪个工具来连接数据库,而db_connect_string就是数据库的连接串,不同的数据库有不同的写法,sqlite3和mysql的写法之前的两篇例子里都有,大家自己去看吧。

今天我们介绍的是Oracle,单纯的说Oracle的方式写连接串,主要的格式是:

‘username’,’password’,’tns’

在这里tns我所知道的有这几种写法:

description

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=ip或域名)(Port=1521))(CONNECT_DATA=(SID=sid)))



ip:port/sid



sid



如果你还有其他写法也欢迎留言评论。

前面2种写法直接用就行,而第3种写法是读取你本地的tnsnames.ora里配置的连接串,所以如果你本身也在用plsql,用这种比较好,但是不一定能在其他机器上执行,除非他和你配置一样的tnsnames.ora内容。当然,我比较推荐第2种写法,简洁,又不需要单独配置,放哪里执行都可以。

3.数据库语句写法

概括地说,我们这几篇介绍的数据库sqlite、mysql、oracle,都是关系型数据库,其他的数据库以后我有机会掌握了再拿来说。那么在这几个数据库来说,最常见的几个操作就是增删改查,顶多再加上个存储过程。

这里的数据库语句写法不是说具体的sql,这个我不讲解,我指的是你如何使用DatabaseLibrary的关键字来执行你的sql语句。 实际上你会用2个最基础的就够了,其他的都是锦上添花的,这2个最基础的关键字一个是Query,一个是Execute Sql String(Execute Sql Script和它基本一样,不过它是执行sql文件的)。Query很明显了,它对应着增删改查的查,所有的查询,只要是你有结果集的,都用Query就好了。至于增删改以及存储过程,凡是没有结果返回的,都用Execute Sql String/Script就可以了,而且这个关键字确实也不会有返回值,所以不要用错了,我见过群里有人用这个关键字去执行select查询的,然后问说为什么没有结果返回。

例子如下:



其他大体上没有太多需要注意的,sql脚本应该都会写,只要你在sql客户端能正常查询的脚本都可以直接拿过来用,只不过需要注意的一点就是,对于Query来说,通常只有一条语句,结尾不需要分号。而Execute Sql String的话,如果是只有一条语句也是一样结尾不要分号,而对于多行脚本的,需要以分号”;”分隔,分隔的意思是语句之间要分号,最后一个语句结尾不要分号。不过,如果你写begin end这样的语句块最后end后面是可以带分号的。


4.查询结果处理

之前也介绍过了,查询的结果是个结果集,如果不理解结果集的可以去看一下sqlite那篇。其实你也可以把它当做二维数组(实际上是一个list里放了若干tuple) 比如我们这里的查询结果是:



在list里的中文一般都会以编码形式显示,比如\u4e2d或者\x3e4,如果你看到???这样的应该是没处理好编码,也就是没取到真正的中文。在mysql那篇我说了,基本上你看到结果里是\u4e2d什么的,这种都是Unicode编码的中文,不要担心,后面我们取值出来就是正常的了。如果你看到是\x3e4什么的,是另外的一种处理方案,这种方案就是用Evaluate来转码。通常来说在Oracle这边我看到更多的是\x这种的。

这里我们首先要取其中的某一个元素,一般是用${result[row_index][col_index]} 。

这里的row_index和col_index分别对应的就是结果集的行和列的序号,行和列的index都是从0开始的,我用图来标识一下:

这是plsql里的查询结果:



以这个结果来标识,他的row和col对应的序号如图:



然后我们取出来之后就可以用evaluate来转码一下,具体脚本如下(也是完整的案例脚本):



这里我们用了Evaluate来转码,我这里取的是第一行(row_index=0)的第二个(col_index=1)字段,对应取值就是${result[0][1]},然后记得两边加上单引号再decode:

‘${result[0][1]}’.decode(‘gbk’)

最终的结果如图:



三、小结

实际上在处理Oracle数据库的时候我还遇到了很多问题,在后续的文章里我会整理出来。这一篇的案例虽然比较简单,不过更多的是让大家掌握方法,方法掌握之后,怎么用就是看你想要做什么了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: