Python-接口自动化(九)

时间:2022-12-21 09:13:58

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&lowbar;绕过验证码登录

    前言 有些登录的接口会有验证码,例如:短信验证码,图形验证码等,这种登录的验证码参数可以从后台获取(或者最直接的可查数据库) 获取不到也没关系,可以通过添加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获取响应时间&lpar;elapsed&rpar;与超时(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. Oracle&sol;Mysql&sol;SqlServer函数区别

    mysql日期和时间格式转换 Linux scp 使用详解 Oracle/Mysql/SqlServer函数区别 2011-07-01 12:34:36|  分类: Mysql技术 |  标签:mys ...

  2. PrimusUI

    小身材大用途,用PrimusUI驾驭你的页面 “PrimusUI”是自己在借鉴了如今网上很多开源的UI库,再经过自己整理加工的一个简单代码集合. 每个功能块的CSS代码都很少,力求简单易懂,低门槛,代 ...

  3. makefile的编写规则

    2.       编写makefile 示例: test:main.o func.o gcc -o test main.o func.o func.o:func.c gcc -c func.c mai ...

  4. vim编辑器操作命令

    vim   [参数]   [文件 ..]         编辑指定的文件 或: vim   [参数]    -     从标准输入(stdin)读取文本 或: vim   [参数]    -t    ...

  5. Jmeter:性能测试指南(转)

    http://yukinami.github.io/2015/11/26/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95%E6%8C%87%E5%8D%97/ 性能测试指南 ...

  6. 【BZOJ1053】&lbrack;HAOI2007&rsqb;反素数(搜索)

    [BZOJ1053][HAOI2007]反素数(搜索) 题面 BZOJ 洛谷 题解 大力猜一下用不了几个质因子,那么随便爆搜一下就好了. #include<iostream> #inclu ...

  7. 【学习笔记】BEST定理

    害怕忘记简单写一点: 无向图的生成树计数:https://www.cnblogs.com/zj75211/p/8039443.html   (*ZJ学长 ORZ ) 有向图的欧拉回路计数:https: ...

  8. python网络编程--线程join和Daemon&lpar;守护进程&rpar;

    一:什么情况下使用join join([timeout])调用join函数会使得主调线程阻塞,直到被调用线程运行结束或超时. 参数timeout是一个数值类型,用来表示超时时间,如果未提供该参数,那么 ...

  9. solr统计只返回10或者100个数据的解决办法

    因为我所在的公司为*做的项目[风险管理系统],其中涉及大量的统计展示,多数以整个市的区划,行业部门等方式返回,在昨天,我发现听过填报单位的方式返回时,始终只有100个数据.通过对比发现,在前辈的代码 ...

  10. POj2387——Til the Cows Come Home——————【最短路】

    A - Til the Cows Come Home Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d &amp ...