python操作Excel处理测试数据(九)

(十)python操作Excel读/写测试数据

1、夹心饼干

setUp:在每一条测试用例执行之前执行

tearDown:在每一条测试用例执行之后执行

上面的这两个东东就叫做夹心饼干,在必要的时候写, 比如说在执行测试用例之前你有数据需要提前准备好,在测试用例执行结束之后有东西需要清除掉,就可以用夹心饼干。在之后的代码中可以看到这个夹心饼干的作用和用法。

2、解决用例相互关联性或依赖性太强 

方法1:写到setUp里面,每次都重新对第一条用例进行请求;

方法2:全局变量

方法3:反射

3、Excel处理测试数据

在这一部分会用到两个东西:pip install openpyxl,pip install ddt (需要安装好)

注意:openpyxl只支持后缀为.xlsx的格式,其余的均不支持;新建Excel的方式一:可以在桌面先创建一个后缀为.xlsx格式的Excel,再复制到写代码所在的文件夹中即可;方法二:找到写代码的当前目录路径,在目录路径下创建一个后缀为.xlsx的Excel即可。

(1)新建Excel并读取Excel单元格中的数据

首先我在桌面创建了一个名为xz.xlsx的Excel,在Excel中第一行第一列写了一个小猪,表单名是python

 from openpyxl import load_workbook

 # 打开Excel
wb=load_workbook("xz.xlsx") # 返回打开的工作薄 # 定位表单
sheet=wb["python"] # 传表单名 # 定位单元格:根据行列值去定位
res=sheet.cell(1,1).value
print(res)

打印出来的结果是:小猪

(2)打印行和列的最大值(我举的例子是存放了5行6列的数据)

 from openpyxl import load_workbook

 # 打开Excel
wb=load_workbook("xz.xlsx") # 返回打开的工作薄 # 定位表单
sheet=wb["python"] # 传表单名 返回一个表单对象 # 定位单元格:根据行列值去定位
res=sheet.cell(1,1).value # 表单的最大行
print(sheet.max_row) # 表单的最大列
print(sheet.max_column)

打印出来的结果是:

5

6

(3)数据从Excel中读取出来之后的类型:数字还是数字,其余都是字符串

例如:(我举的例子是在Excel第一行中写入了4个数据)

 from openpyxl import load_workbook

 # 打开Excel
wb=load_workbook("xz.xlsx") # 返回打开的工作薄 # 定位表单
sheet=wb["python"] # 传表单名 返回一个表单对象 # 定位单元格:根据行列值去定位
# res=sheet.cell(1,1).value # 表单的最大行
print(sheet.max_row) # 表单的最大列
print(sheet.max_column) # print(res) # 从Excel中读取数据
print("url:{0}".format(sheet.cell(1,1).value))
print("data:{0}".format(sheet.cell(1,2).value))
print("code:{0}".format(sheet.cell(1,3).value))
print("method:{0}".format(sheet.cell(1,4).value))

打印出来的结果是:

url:case_id
data:module
code:title
method:http_method

这里可以用type()函数打印出这些数据的类型

(4)eval():把数据类型转换成原本的数据类型

例如:

 s='{"age":18}'
print(eval(s),type(eval(s)))

打印出来的结果是:{'age':18} <class 'dict'>

(5)读取数据的三种方式

方式一:一次性读取所有的数据,对内存的要求要高一些(推荐使用)

 from openpyxl import load_workbook

 class DoExcel:
def __init__(self, file_name, sheet_name):
self.file_name = file_name
self.sheet_name = sheet_name def get_data(self):
wb = load_workbook (self.file_name) sheet = wb[self.sheet_name]
#
# res = sheet.cell (1, 1).value # 取到第一行的所有数据
test_data = []
for i in range (1, sheet.max_row + 1):
sub_data = {} sub_data['method'] = sheet.cell (i, 1).value sub_data['url'] = sheet.cell (i, 2).value sub_data['data'] = sheet.cell (i, 3).value sub_data['expected'] = sheet.cell (i, 4).value test_data.append (sub_data) return test_data if __name__ == '__main__':
print (DoExcel ("xz.xlsx", 'python').get_data ())

打印出来的结果是:

[{'method': 'case_id', 'url': 'module', 'data': 'title', 'expected': 'http_method'}, {'method': 1, 'url': 'login', 'data': '正常登录', 'expected': 'post'}, {'method': 2, 'url': 'login', 'data': '输入错误密码', 'expected': 'get'}, {'method': 3, 'url': 'recharge', 'data': '正常充值', 'expected': 'post'}, {'method': 4, 'url': 'recharge', 'data': '充值输入负数', 'expected': 'get'}]

方式二:在需要用的时候读取所有的数据(会对磁盘的读写要求高一些)

 from openpyxl import load_workbook

 class DoExcel:
def __init__(self, file_name, sheet_name):
self.file_name = file_name
self.sheet_name = sheet_name
# 获取一个表单对象
self.sheet_obj=load_workbook(self.file_name)[self.sheet_name]
self.max_row=self.sheet_obj.max_row def get_data(self,i,j):
'''根据传入的坐标来获取值'''
return self.sheet_obj.cell(i,j).value if __name__ == '__main__':
res=DoExcel ("xz.xlsx", 'python').get_data (1,1)
print(res)

打印出来的结果是:case_id

方式三:利用嵌套循环读取数据(以我自己创建的Excel为例,仅供参考)

 from openpyxl import load_workbook

 class DoExcel:
def __init__(self, file_name, sheet_name):
self.file_name = file_name
self.sheet_name = sheet_name def get_header(self):
'''获取第一行的标题'''
wb=load_workbook(self.file_name)
sheet=wb[self.sheet_name]
# 存储标题行
header=[]
for j in range(1,sheet.max_column+1):
header.append(sheet.cell(1,j).value)
return header def get_data(self):
'''根据嵌套循环读取数据''' wb = load_workbook (self.file_name) sheet = wb[self.sheet_name] header=self.get_header()# 拿到header
test_data = [] for i in range (2, sheet.max_row + 1):
sub_data = {}
for j in range(1,sheet.max_column+1):
sub_data[header[j-1]]=sheet.cell(i,j).value
test_data.append (sub_data) return test_data # 返回获取到的数据 if __name__ == '__main__':
print (DoExcel ("xz.xlsx", 'python').get_data ())

打印出来的结果是:

[{'case_id': 'case_id', 'module': 'module', 'title': 'title', 'http_method': 'http_method', 'url': 'url', 'data': 'data', 'expected': 'expected', None: None}, {'case_id': 1, 'module': 'login', 'title': '正常登录', 'http_method': 'post', 'url': 'http://test.xxx.com/xxx/mvc/api/member/login', 'data': '{"mobilephone": "test", "pwd": "test"}', 'expected': 10001, None: None}, {'case_id': 2, 'module': 'login', 'title': '输入错误密码', 'http_method': 'get', 'url': 'http://test.xxx.com/xxx/mvc/api/member/login', 'data': '{"mobilephone": "test", "pwd": "test111"}', 'expected': 20111, None: None}, {'case_id': 3, 'module': 'recharge', 'title': '正常充值', 'http_method': 'post', 'url': 'http://test.xxx.com/xxx/mvc/api/member/recharge', 'data': '{"mobilephone": "test", "amount": "100"}', 'expected': 10001, None: None}, {'case_id': 4, 'module': 'recharge', 'title': '充值输入负数', 'http_method': 'get', 'url': 'http://test.xxx.com/xxx/mvc/api/member/recharge', 'data': '{"mobilephone": "test", "amount": "-100"}', 'expected': 20117, None: None}]

以上,第九部分到此结束~

Python-接口自动化(九)的更多相关文章

  1. Python接口自动化——soap协议传参的类型是ns0类型的要创建工厂方法纪要

    1:在Python接口自动化中,对于soap协议的xml的请求我们可以使用Suds Client来实现,其soap协议传参的类型基本上是有2种: 第一种是传参,不需要再创建啥, 第二种就是ns0类型的 ...

  2. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...

  3. python接口自动化-Cookie_绕过验证码登录

    前言 有些登录的接口会有验证码,例如:短信验证码,图形验证码等,这种登录的验证码参数可以从后台获取(或者最直接的可查数据库) 获取不到也没关系,可以通过添加Cookie的方式绕过验证码 前面在“pyt ...

  4. python接口自动化28-requests-html爬虫框架

    前言 requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html.之前解析html页面用过了lxml和bs4, requests-html集成了一些 ...

  5. python接口自动化-参数化

    原文地址https://www.cnblogs.com/yoyoketang/p/6891710.html python接口自动化 -参数关联(一)https://www.cnblogs.com/11 ...

  6. python接口自动化 -参数关联(一)

    原文地址https://www.cnblogs.com/yoyoketang/p/6886610.html 原文地址https://www.cnblogs.com/yoyoketang/ 原文地址ht ...

  7. python接口自动化20-requests获取响应时间(elapsed)与超时(timeout)

    前言 requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的. 如果服务端没及时响应,也不能一直等着,可以设置一个timeout超时的时间 关于reques ...

  8. python接口自动化24-有token的接口项目使用unittest框架设计

    获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...

  9. python接口自动化6-重定向(Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...

  10. python接口自动化5-Json数据处理

    前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...

随机推荐

  1. UIPresentationController - iOS自定义模态弹出框

    参考: https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/Definin ...

  2. 用PIL库进行图像处理

    一.如果系统里没有安装PIL库的,请先到命令提示符输入“pip install pillow”进行安装 二.之后就可以参考以下的代码 from PIL import Image from pylab ...

  3. C#线程同步(2)- 临界区&Monitor

    文章原始出处 http://xxinside.blogbus.com/logs/46740731.html 预备知识:C#线程同步(1)- 临界区&Lock 监视器(Monitor)的概念 可 ...

  4. java中‘\'和'/'的区别

    斜杠“/”表示地址路径的下一级目录:反斜杠“\”表示转义字符,例如:要做制表,可以输入:\t:做换行:\n等.如果要输出反斜杠“\”也需要用转义字符:“\\”    在java中后台给前台传的时候如果 ...

  5. 0 vs null

    看图说话 0 如图所示: 0 表示有纸(值), 但是纸(值)是0. 所以取纸(值)的时可以取, 但是没法用. null 如图所示: null 表示没有纸(值), 是真的啥都没有, 现在你抽纸的时候会出 ...

  6. js添加的元素无法触发click事件

    动态生成的元素,使用.on绑定事件,比如$(document).on("click",".divclick",function(){})

  7. 解决一次git问题

    由于特殊原因,工作中不能使用sourcetree,今天遇到了一个问题记录一下解决办法,后续还是得好好去廖雪峰大神那里学习一下git的命令行操作呀 You have not concluded your ...

  8. git1使用步骤初始化拉取修改提交推送

    Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令. 在执行完成 git init  ...

  9. 用JavaScript比较两个数组是否相等

    JS怎么比较两个数组是否有完全相同的元素?Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都会返回false alert([0,0,0]= ...

  10. 雷林鹏分享:Composer 安装

    下午在安装 Laravel 框架过程中,遇到了不少问题,因为 Laravel 的安装依赖于 composer,这里就先介绍一下 composer 的安装方法: 安装方法: #下载 sudo curl ...