习惯性伸手党区 再 (ye)(bu) 见! 然并卵的 WebUI 自动化测试

晴空 · September 09, 2015 · Last by wzhhey replied at January 25, 2019 · 2661 hits

在TesterHome的处女贴 竟以吐槽开始,若给有些同学带来了负能量 敬请谅解

Robot FrameWork持续集成测试实践

一:64位PC上部署RobotFrameWork+Jenkins
1.1 安装Python 2.7(64位)版本
1.2 安装pip
安装命令: python get-pip.py
1.3 安装AutoItX-V3(AutoItLibrary库依赖于它)
1.4 安装robot framework
安装命令: pip install robotframework
1.5 安装wxPython(支撑Ride的运行库)
1.6 安装robotframework-ride(GUI界面管理)
安装命令: pip install robotframework-ride
1.7 安装selenium2library
安装命令: pip install robotframework-selenium2library
1.8 安装pyodbc
安装命令:pip install pyodbc
1.9 安装requests(支持RequestLibrary库)
安装命令:pip install requests
1.10 安装RequestsLibrary(http request库)
安装命令: pip install -U robotframework-requests
1.11 安装AutoItLibrary
安装命令:pip install AutoItLibrary
1.12 安装Openpyxl
安装命令:pip install openpyxl
1.13 安装Psutil
安装命令:pip install psutil
1.14安装JDK并配置环境变量
1.15 下载jenkins.war包

二:常用的三方库及其API
2.1 Selenium2Library(浏览器&页面元素操作)
2.1.1打开浏览器Open Browser
示例:Open Browser http://192.168.10.206/somoStorage Chrome
2.1.2 跳转到指定RUL地址Go To
示例:Go To http://192.168.10.206/somoStorage

2.1.3 点击元素Click Element
示例: Click Element id= id=Main
Click Element xpath=//div[@id="divLoading"]/img

2.14 点击超链接Click Link
示例:Click Link 添加
Click Link //a[contains(.,'添加')]

2.1.5 上传文件Choose File
示例:Choose File xpath=//div[@id="divFiles"]/div[1]/input E:\TestData\14.jpg

2.1.6 清空输入框Clear Element Text
示例:Clear Element Text xpath=//li[@id="Monday"]/div[3]/div[2]/span[2]/input

2.1.7 向输入框中填写内容Input Text
示例:Input Text xpath=//li[@id="Monday"]/div[3]/div[2]/span[2]/input ${极限总号额}

2.1.8 对话框作确定操作Confirm Action
示例:Confirm Action

2.1.9执行JS方法 Execute JavaScript
示例:Execute JavaScript javascript:show_cate();

2.1.10等待元素可见 Wait Until Element Is Visible
示例:
Wait Until Element Is Visible xpath=/html/body/div[1]/table/tbody/tr/td/div/div[2]/iframe 10s error=等待元素可见超时

2.1.11 等待元素可用Wait Until Element Is Enabled
示例:Wait Until Element Is Enabled xpath=/html/body/div[4]/div/div/div[1]/div[1]/div[2] 20s error=等待门诊预约元素超时

2.1.12 锚定某个元素Focus
示例:Focus id=btnGeneralSave

2.1.13 切换焦点到frame上 Select Frame
示例:Select Frame xpath=/html/body/div[1]/table/tbody/tr/td/div/div[2]/iframe

2.1.14 切换焦点到窗口Select Window
@{handles}= list windows
select window ${handles[1]}
2.1.15For循环使用
@{location_list}= Create List A0 A-1
: FOR ${locator} IN @{location_list}
更改最危灶位置 ${locator} ${locator}
Take Screenshot ${locator}.jpg

还有很多很多 在此不一一列举 请志同道合的同学自行研究哈 ^ _ ^ !
2.2 Pyodbc库 操作数据库(Sql Server)
Pyodbc操作Sql Server 示例:

在Sql Server数据库中执行查询

def get_select_result_in_sql_server(db_name, sql_select):
conn=pyodbc.connect(DRIVER='{SQL Server}',SERVER='FARIDAH-PC',DATABASE=db_name,UID='sa',PWD='sa')
cursor = conn.execute(sql_select)
row = cursor.fetchone()
conn.commit()
select_count = row[0]
conn.close()
return select_count

这里仅举一个简单的栗子 请查看pyodbc库的源码学习更多的API。

若使用Oracle数据库请考虑cx_Oracle+DatabaseLibrary结合。
若使用My Sql数据库请自行配置pyodbc+ mysql-connector-odbc驱动。
2.3 Requests库(模拟http协议的请求发送)
发送Get请求:获取(Github的公共时间线)
requests.get('https://github.com/timeline.json')
发送一个HTTP POST请求
requests.post("http://httpbin.org/post")
其他方法:
requests.put("http://httpbin.org/put")
requests.delete("http://httpbin.org/delete")
requests.head("http://httpbin.org/get")
requests.options("http://httpbin.org/get")

响应状态码:
request.options("http://httpbin.org/get.status_code")

响应内容:
request.options("http://httpbin.org/get.content")

为URL传递参数:
payload = {'key1': 'value1', 'key2': 'value2'}
requests.get("http://httpbin.org/get", params=payload)

错误与异常
遇到网络问题(如:DNS查询失败、拒绝连接等)时,Requests会抛出一个ConnectionError 异常。
遇到罕见的无效HTTP响应时,Requests则会抛出一个 HTTPError 异常。
若请求超时,则抛出一个 Timeout 异常。
若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。
所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException 。

2.4 Openpyxl库(操作Excel文件)

示例:

对指定单元格赋值

def WriteExcel(result, locator,sheetname):
# 加载excel文件
book = load_workbook(autocase)

定位工作sheet单

sheet = book.get_sheet_by_name(sheetname)
if result == True:
# 对单元格赋值
sheet.cell(locator).value = 'Pass'
elif result == False:
sheet.cell(locator).value = 'Fail'
# 保存excel文件
book.save(autocase)

#显示表名,表行数,表列数
sheet.title
sheet.get_highest_row()
sheet.get_highest_column()

建立存储数据的字典

data_dic = {}

#把数据存到字典中
for rx in range(ws.get_highest_row()):

temp_list = []
pid = sheet.cell(row = rx,column = 0).value
w1 = sheet.cell(row = rx,column = 1).value
w2 = sheet.cell(row = rx,column = 2).value
w3 = sheet.cell(row = rx,column = 3).value
w4 = sheet.cell(row = rx,column = 4).value
temp_list = [w1,w2,w3,w4]

# 获取指定单元格的值
Sheet. cell("A1").value

2.5 AutoItLibrary库(模拟鼠标键盘操作)
在指定坐标位置单击:
Mouse Click LEFT 696 383

在指定坐标右击:
Mouse Click RIGHT 300 300

拖拽元素:
Mouse Click Drag LEFT 300 300 600 600 Speed=1

滚动鼠标中间键:
Mouse Wheel DOWN 10
Mouse Wheel UP 7

2.6 Psutil库(获取系统资源数据)
CPU:

获得CPU时间使用信息

psutil.cpu_times()
scputimes(user=191488.046875, system=81560.75, idle=3844134.0)

获得CPU物理个数和逻辑CPU数量

psutil.cpu_count()
psutil.cpu_count(logical=False)

Memory:

获得内存缓冲区(缓存)大小

psutil.swap_memory()
sswap(total=17007190016L, used=5249916928L, free=11757273088L, percent=30.9, sin=0, sout=0)

获得虚拟内存大小

psutil.virtual_memory()
svmem(total=8504537088L, available=4915023872L, percent=42.2, used=3589513216L, free=4915023872L)

Disk:

获得磁盘分区信息

psutil.disk_partitions()
[sdiskpart(device='C:\', mountpoint='C:\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='D:\', mountpoint='D:\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='E:\', mountpoint='E:\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='G:\', mountpoint='G:\', fstype='', opts='cdrom')]

获取指定磁盘的使用信息

psutil.disk_usage('C:\')
sdiskusage(total=160956411904L, used=70494846976L, free=90461564928L, percent=43.8)

获取磁盘IO读写(吞吐量)信息

psutil.disk_io_counters()
sdiskio(read_count=4680532, write_count=7875453, read_bytes=86995578880L, write_bytes=146009722880L, read_time=2546110150L, write_time=4543259250L)

NetWork

获得net连接信息

psutil.net_connections()

获得网络吞吐信息

psutil.net_io_counters(pernic=True)

三:使用Robot+Jenkins进行持续自动化测试(UI+接口)
3.1 Web UI自动化测试
以邵逸夫医院预约与病理管理系统为例:
3.1.1:RobotFrameWork整体架构目录

3.1.2 自定义python库

步骤1:新建Python Package
步骤2:在Robot中添加py文件

3.2 WebService接口功能自动化测试
封装基于requests库的自定义三方库HttpRequests 其中提供的API如下:
3.2.1 返回get请求的text
def text_of_get(url, params):
json_data = {}
parameters = params.split(',')
counts = len(parameters)-1
# 将字符串转换为json格式
for index in range(0, counts):
name = parameters[index]
value = parameters[index+1]
json_data[name] = value

get_request = requests.get(url, params=json_data)
# 返回请求的text
return get_request.text

3.2.2 返回post请求的text
def text_of_post(url, params):
json_data = {}
parameters = params.split(',')
counts = len(parameters)-1
# 将字符串转换为json格式
for index in range(0, counts):
name = parameters[index]
value = parameters[index+1]
json_data[name] = value

post_request = requests.post(url, params=json_data)
# 返回请求的text
return post_request.text

3.2.3 返回get请求的status_code
def status_code_of_get(url, params):
json_data = {}
parameters = params.split(',')
counts = len(parameters)-1
# 将字符串转换为json格式
for index in range(0, counts):
name = parameters[index]
value = parameters[index+1]
json_data[name] = value

get_request = requests.get(url, params=json_data)
# 返回请求的text
return get_request.status_code

3.2.4 返回post请求的status_code
def status_code_of_post(url, params):
json_data = {}
parameters = params.split(',')
counts = len(parameters)-1
# 将字符串转换为json格式
for index in range(0, counts):
name = parameters[index]
value = parameters[index+1]
json_data[name] = value

post_request = requests.post(url, params=json_data)
# 返回请求的text
return post_request. status_code

3.2.5 在Robot FrameWork中集成HttpRequests
Robot FrameWork中的测试用例步骤

日志文件信息:

3.3 创建Jenkins Jobs 进行持续自动化测试
3.3.1 安装并配置JDK
3.3.2 使用批处理文件启动Jenkins服务
脚本内容如下:
set JENKINS_HOME=D:\JenkinsHome
cd /d %JENKINS_HOME%
java -jar %JENKINS_HOME%\jenkins.war --httpPort=8888
3.3.3 创建Job任务
构建自由风格的Job

配置任务触发条件(示例为每周五下午6点56分执行):

配置任务 即:执行指定的自动化脚本

配置构建完成后的任务(示例为发布Robot的测试报告并发送邮件到指定的邮箱):

四:接口性能测试
4.1 使用Jmeter进行接口性能测试
1:新建测试计划--添加线程组

2:添加sampler—添加HTTP请求

设置服务器名为:localhost

HTTP请求栏:
Implemetation:HttpClient4
协议为:http
方法:POST
Content encoding:utf-8
路径:/somoStorage/MTWebService/FileLibService.asmx/GetPatientStudy
添加参数:
参数名:studyInstanceUID
参数值:1.2.276.0.7230010.3.1.4.3856525867.14768.1367466243.413

在测试计划中添加监听器:

1:监听结果树 2:结果汇总表格 3:聚合报告

Windows资源使用情况:

由于Jmeter负载机和WebService服务器均为本机 可能会出现内存溢出的情况,若Jmeter日志中报错java.lang.OutOfMemoryError: Java heap space

调整jmeter.bat文件HEAP配置项 示例如下:

从14年8月至今 历经菜渣 全手工写Script 用Robot+扩展封装库 再到Jenkins持续集成 终成型并稳定UI自动化测试框架,期间槽点颇多 心累不已…然仍再接再厉..
.IT有风险 切码且珍惜

再(ye)(bu)见! 然并卵的UI自动化测试

共收到 10 条回复 时间 点赞

留个名,以后慢慢看

自己一个人弄的吗?

😩 排下版肯定加精处理了

这个必须收藏,都是LZ的心血积累啊

晴空 #5 · July 24, 2016 作者

#2楼 @michael_wang 是的 从0到1 都是一个人搞 也是头大

#3楼 @apert 我以为PC端这块儿大家都不怎么敢兴趣 就没排 不好意思哦

晴空 #7 · July 24, 2016 作者

#4楼 @syyk2009 谢谢~ 心血倒不好说 就是些自己走过的坑~

这个要赞,我也是用RF整的

很全面的,值得学习。更重要是自己在工作中去实践。

可以!很全面值得小白们学习!

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up