Python 第三方模块 openpyxl 简介

openpyxl是专门用来读取和写入 Excel 文档的 python 第三方模块。本文将使用这个模块和 appium 工具进行自动化测试的数据驱动测试实践。

安装 openpyxl 模块

使用下面命令来安装 openpyxl:

$ pip install openpyxl

如果你使用的是 ubuntu 等 linux 系统的话,请在命令之前添加 sudo 命令:

$ sudo pip install openpyxl

用 ipython 熟悉 openpyxl 操作

准备测试数据文档

接下来要准备下面测试 android 计算器的测试数据,请使用 MS Office 软件或其他类似软件打开一个 Excel 文件,输入下面内容并保存为 “test_data.xlsx”:

输入图片说明

本文件的百度网盘下载链接:https://pan.baidu.com/s/1hrS4pMW

注意:如果你电脑上没有可以编辑 Excel 文档的软件,可以安装开源的LibreOffice

利用 ipython 学习 openpyxl

建议使用 IPython 来熟悉 openpyxl 的使用方法,具体请查看 openpyxl 的官方文档,地址:https://openpyxl.readthedocs.io/en/default/

在终端中输入下面命令启动 ipython。

$ ipython

继续在 ipython 交互环境中输入以下代码进行 openpyxl 的学习:

In [13]: wb = openpyxl.load_workbook('test_data.xlsx')  #打开当前目录下的test_data.xlsx文件
In [14]: wb.get_sheet_names()                   #获取当前sheet名称
Out[14]: ['Sheet1']
In [15]: sheet = wb.get_active_sheet()     #新建sheet对象
In [16]: sheet.title   #查看新建sheet对象的标题
Out[16]: 'Sheet1'
In [17]: sheet['A1'].value   #查看sheet页中A1单元格的数值
Out[17]: '编号'
--略--
In [26]: sheet.rows   #sheet页中的行数对象
Out[26]: <generator object get_squared_range at 0x7fe384b47fc0>

从 Excel 表格读取测试数据进行 appium 自动化测试

下面要通过读取刚刚完成的 “test_data.xlsx” 表格中的元素 id 来定位并点击,android 手机自带的计算器中对应的按钮,并且将每一条的执行结果记录在一个新的表格中。

请打开一个新的文本编辑器窗口,输入的代码如下,将文件保存为 testCal.py:

#!/usr/bin/env python3
# coding=utf-8
import openpyxl       #此模块用于读写Excel表格
from appium import webdriver

desired_caps = {}
desired_caps['platformName'] = 'Android' #设置操作平台
desired_caps['platformVersion'] = '5.1.1' #操作系统版本
desired_caps['deviceName'] = 'Nexus 4' #设备名称
desired_caps['appPackage'] = 'com.android.calculator2'   #启动原生的计算器
desired_caps['appActivity'] = '.Calculator'  #同上,启动原生的计算器
desired_caps['udid'] = '04c5a5af52197902' #设备ID,可以通过adb devices命令查看
desired_caps['noReset'] = 'True' # 设置会话不会重置
#通过appium服务器,新建driver对象
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

wb = openpyxl.load_workbook('test_data.xlsx') # 加载测试数据表格
sheet = wb.get_sheet_by_name('Sheet1')
# 通过枚举函数来循环处理所有的数据行,注意去除标题行
for i, _ in enumerate(list(sheet.rows)[:-1]): 
    id = sheet['C' + str(i + 2)].value     # 读取测试数据字段
    driver.find_element_by_id(id).click() #点击指定的id的按键
    #元素定位到公式显示区域,获取此元素的文本值作为实际结果
    text = driver.find_element_by_id('com.android.calculator2:id/formula').text
    sheet['E' + str(i + 2)].value = text # 给E列赋值,实际返回结果
    expected_result = sheet['D' + str(i + 2)].value #获取预期结果字段
    # 判断实际结果和预期结果是否一致,一致的话标记pass,否则标记fail。
    if text == expected_result:    
        sheet['F' + str(i + 2)].value = 'pass'
    else:
        sheet['F' + str(i + 2)].value = 'fail'

wb.save('updatedTestData.xlsx')  # 另存为表格文档
driver.quit()

上面这段代码首先导入了 openpyxl 模块,也导入 appium 相关的模块,你可以用 appium 进行 android 手机自动化测试,如果你对 appium 不熟悉,可以参考我之前写的文章《利用 IPython 来学习 Appium 操作》来先学习一下。
接下来代码进行 appium 启动需要的相关设置,然后启动被测应用。继续通过 openpyxl 的函数来读取 Excel 表格数据,用 for 循环来遍历每一行测试数据,这里注意要排除掉第一行数据(也就是标题行)。在 for 循环内部对每一行数据都进行读取测试数据,执行测试和将实际结果和测试结果写入表格的操作。代码段的最后是将处理后的 Excel 表格另存为,然后结束测试。

最后成功运行上面代码后,查看新生成的测试结果'updatedTestData.xlsx'文件,结果如下:
输入图片说明

小结

利用 python 的 openpyxl 模块不只是可以配合 appium 进行测试,同样可以和 selenium 等工具配合,而且也能用在 api 接口测试方面。
而且 openpyxl 模块的功能不仅仅是简单的读入和写入数据,它还有生成 Excel 图表,调整电子表格格式等功能,如果读者兴趣的话,可以深入研究官方文档

参考文献:

《Python 编程快速上手——让繁琐工作自动化》AI Sweigart 著


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