在 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 自动化测试


↙↙↙阅读原文可查看相关链接,并与作者交流