今天开始在博客上,记录测试相关的经验,问题,解决方案;
最近在做web自动化测试的项目,那么人生中的第一条博客,就献给自动化测试框架-Robotframework吧。
上面这个翻页的元素,常见于web,我们想要实现模拟选择每页记录数,点击上一页,下一页,首页,尾页,进行正确翻页,并且对每一页中展示的列表的记录各字段值与数据库查询返回的值进行比对,非常啰嗦的一句话~慢慢体会一下;
列出要实现的测试点:
首先,从数据库查询得到记录总数,与web页面右下角的记录总数,比对一下是否一致(检查web显示总记录数是否正确);
第二步,根据记录总数,再根据每页显示记录数,使用公式计算,得到总页数,从而与页面中的总页数比对,是否一致(检查web显示的总页数是否正确);
第三步,实现点击上一页,点击下一页,首页,尾页的跳转翻页,并检查每一页中的记录是否正确(通过与数据库查询的值进行比对);
第四步,实现输入跳转页数,点击确认进行跳转,检查跳转的页面正确;
实现第一步,主要是数据查询脚本的实现,写个脚本实现需要的功能,然后作为自定义library导入Robotframework:连接数据库,执行sql语句查询,整理返回的数据;
脚本语言我比较熟悉python,因此就用python来写了,项目中用到的是postgres数据库。
(1)在C:\Python27\Lib\site-packages 路径下(python的安装目录),新建文件夹Mylibrary,在Mylibrary下,创建一个__init__.py的文件;
(2)新建一个名为DBconnect.py的文件,实现数据库连接,代码如下:
#! /usr/bin/env python
#coding=utf-8
import psycopg2
class Connect_configDB():
def __init__(self):
#初始化
self.database='databasename'
self.dbuser='dbusername'
self.password='dbpassword'
self.host='hostip'
self.port='port'
def connect_configDB(self):
'''connect postgres config database'''
try:
conn = psycopg2.connect(database= self.database, user=self.dbuser, password=self.password, host=self.host, port=self.port)
cur = conn.cursor()
return cur
except psycopg2.ProgrammingError , e :
print "connect db error:",str(e)
(3)在__init__.py文件中,输入以下代码(主要是import 自定义方法名称),在ride中就可以直接导入Mylibrary,导入文件夹底下所有的自定API方法了
from DBconnect import Connect_contentDB
version = '1.0'
class Mylibrary(Connect_configDB):
ROBOT_LIBRARY_SCOPE = 'GLOBAL'
(4)打开ride,点击添加import,点击library,输入Mylibrary,导入自定义库,按F5,可以看到上面自己写的connect_configDB这个方法已经导入了ride,可以作为关键字使用了;
(5)上面介绍了数据库的连接脚本实现,作为自定义库的使用,那么获取页面返回的列表记录值,也可以用自定义脚本来实现,关键在于sql语句的整理,根据需求,自己分析,下面是个例子;
import psycopg2
import Connect_ConfigDB
import decimal
context=decimal.getcontext() # 获取decimal现在的上下文
context.rounding = decimal.ROUND_05UP
#初始化数据,并连接数据库
def init_data(stime,etime):
st=' 00:00:00' #sql语句中涉及到时间段的查询,起始时间的时:分:秒,为00:00:00,结束时间为23:59:59.999
et=' 23:59:59.999'
start=str(stime)+str(st)
end=str(etime)+str(et)
try:
cn=Connect_ConfigDB.Connect_configDB()
cur=cn.connect_configDB()
return cur,start,end
except psycopg2.ProgrammingError , e :
print "connect db error:",str(e)
#处理sql返回的数据,是一组包含列表的列表[(1,2,3),(1,2,3),(1,2,3)],把里面的列表分别用list来保存
def dealData(rows):
'''deal with the data that SQL return, save the data length in 'length'
return a list include 'length' 'a[i]','b[i]','c[i]','d[i]'.'''
lrow=len(rows)
d=[]
a=[]
b=[]
c=[]
#print 'lrow:',lrow
if lrow != 0:
for i in range(lrow):
#print rows[i][1]
if rows[i][0] != 0:
a.append(rows[i][0])
b.append(rows[i][1])
c.append(rows[i][2])
d.append(rows[i][3])
#for j in range(li):
#print rows[i][1]
#return rows[i][j]
for i in range(len(datetime)):
print a[i]
print b[i]
print c[i]
print d[i]
length=len(datetime)
print "length:",length
elif lrow == 0:
print "No DATA!"
length=0
else:
print "lrow error!"
return length,a,b,c,d
class GetOperateLog():
def __init__(self):
pass
def getOperateLog_ByUser(self,username,ip,optype,stime,etime):
#获取根据条件查询得到数据,一般是一组包含列表的列表[(1,2,3),(1,2,3),(1,2,3)]
c=[]
c=init_data(stime,etime) #初始化数据,返回三个值,分别返回数据库连接对象、start、end
cur=c[0]
start=c[1]
end=c[2]
ipname="%"+ip+"%"
sql1=('具体的sql语句')
sql2=('具体的sql语句')
#print "SQL 语句:",str(sql)
try:
#cur=Connect_db.connectDB()
if optype=='全部':
cur.execute(sql1,(username,start,end,ipname))
rows = cur.fetchall()
else:
cur.execute(sql2,(username,start,end,ipname,optype))
rows = cur.fetchall()
return dealData(rows) #处理数据并返回数据列表
cur.close()
except psycopg2.ProgrammingError , e :
print"execute sql failed:",str(e)
同样,把这个GetOperateLog类加入Mylibrary文件下__init__.py的class中,ride关闭后重新打开,并删除Mylibrary,再重新添加导入Mylibrary,新的关键字
getOperateLog_ByUser就可以使用了;
(6)上述的步骤,完成了需要从数据库获取数据的功能,使用自定义的方法实现从数据库获取到数据后,再跟页面中获取的数据进行一一比对检查;
方法中,获取数据后,也返回了一个length,这个就是记录总数了,然后我们跟页面中的记录总数进行比对就实现了一个检查的过程;
ride创建一个关键字:从页面获取记录总数
这里的’${t}’.split()[1],把从页面中获取的语句“共 32 条记录”,用空格split,取第二个值,即32;就得到了记录数并且返回,这个值的获取具体页面具体分析,可以用evaluate 也可以用execute JavaScript;
数据库获取的值,页面获取的值都有了,接下来,分别调用这两个关键字,用两个变量保存以下,然后 Should Be Equal检查下就完成了;
终于写完了第一篇博客