点点小白的学习方式:通过确定一个小目标来想办法实现它,再通过笔记来加深印象。

面对标题中的小目标我陷入了思考。。。。嗯,首先实现利用xlrd库来取出想要的用例

首先用表格准备好用例,如图下

先试下取number为1的一行用例试试:

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import xlrd xlsurl = r"D:\RequestAPI.xlsx" # 表格文件路径
rqapi = xlrd.open_workbook(xlsurl) # 获得文件对象
sheet_name = rqapi.sheet_names()[0] # 获取表格第一个sheet名称
sheet1 = rqapi.sheet_by_name(sheet_name) # 获取表格第一个sheet对象
nrow = sheet1.nrows # 获取表格行总数
ncols = sheet1.ncols # 获取表格列总数
col_data = sheet1.col_values(0) # 获取表格第一列的数据
row_data = sheet1.row_values(1) # 获取表格第二行的数据
print "======================================================================="
print row_data
print type(row_data)

执行结果如图:

可以看到,表格中number为1的一行数据已经打印出来了,并且是list类型的,这样通过遍历list可以将数据都当个取出来,不过我没这么做,因为表格中paramete是保存的请求参数,在requests库中,请求参数是dict格式的,所以不需要把每个参数都遍历出来(requests库的使用在笔记后面别急)。

搞定取单行数据,那接下来再取每一行的数据,并把每行中需要的列也取出来,上代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import xlrd class ApiTest:
def xlsee(self, xlsFile):
rqapi = xlrd.open_workbook(xlsFile) # 获得文件对象
sheet_name = rqapi.sheet_names()[0] # 获取第一个sheet名称
sheet = rqapi.sheet_by_name(sheet_name) # 获取第一个sheet对象
return sheet if __name__ == "__main__":
apitest = ApiTest()
xlsFile = r"D:\RequestAPI.xlsx" # 文件路径
sheet1 = apitest.xlsee(xlsFile)
nrow = sheet1.nrows # 获取行总数
ncols = sheet1.ncols # 获取列总数
col_data = sheet1.col_values(0) # 获取第一列的数据 for i in range(1, nrow): # 循环每行,并获取每行每列的值,第0行是标题,所以从第一行开始取
row_data = sheet1.row_values(i) # 获取第i行的数据
nums = int(row_data[0]) # 用例编号
rqtypes = str(row_data[2]) # 请求类型
rqurls = str(row_data[1]) # 请求地址
a = row_data[5:] # 请求参数,并且一次取出这一行所有的参数
parametes = dict(zip(a[0::2], a[1::2])) # 将list类型的参数转换为dict字典类型的
code = row_data[3] # 校验结果用的code状态码
coderesult = row_data[4] # 用于显示校验结果的参数pass或error
print "=================================================================================="
print "用例编号:", nums
print "请求类型", rqtypes
print "请求地址", rqurls
print "请求参数parametes:", parametes
print "校验结果用的code状态码", code
print "用于显示校验结果的参数", coderesult

对于上面代码,简单封装了一下,注意

a = row_data[5:]  # 请求参数,并且一次取出这一行所有的参数

这个利用list[a:]来取值,可取第a位后面所有的数据,这就表明,我可在表格中设置N个参数,而不会限制于不同接口参数个数不一样的限制了
上面代码运行结果如下:

从表格中读取用例的问题已经搞定了,接下来就是通过requests来执行这些用例,上代码:

class ApiTest:
# 请求主方法
def request(self, rqtype, rqurl, paramete, headers):
self.rqurl = rqurl # API地址
self.rqtype = rqtype # 请求类型get or post
self.paramete = paramete # 请求参数
self.headers = headers # 请求头 if rqtype == "get":
apirqhttp = requests.get(url=rqurl, params=paramete, headers=headers) # 发送请求
code = apirqhttp.status_code # 保存返回状态
pam = apirqhttp.text # 保存返回数据并将json转为dict
return code, pam
if rqtype == "post":
apirqhttp = requests.post(url=rqurl, data=paramete, headers=headers)
code = apirqhttp.status_code
pam = apirqhttp.text
return code, pam
else:
print "请求参数错误,请求类型只支持get+post,请求地址支持string,参数支持dict"

其中有个小插曲,就是接口中常见的身份验证问题,需要获取token值,将token值作为herders请求头来进行身份校验

于是再通过登录接口来获取这个token(注意:token值校验不同项目可能不一样,比如我们公司就在touken值前面加了个brarer ,所以需要再将token值拼接一下)值并参数化,上代码:

    # 获取B2B分销商token值方法
def seltoken(self):
rqtypes = "post"
rqurls = "http://xxxxx.dddd.com//account/authorize"
parametes = {"username": "Wbfxs001", "password": "111111Qq", "grant_type": "password"}
headers = None
cod, pam = ApiTest().request(rqtypes, rqurls, parametes, headers) # 掉用request方法请求登录
pam = json.loads(pam) # 保存返回数据并将json转为dict
access_token = pam["access_token"] # 截取dic中access_token键的value
access_token = "bearer " + str(access_token) # 拼接access_token为最终需要的token值
return access_token

最后将xlrd+requests方法都封装好,上代码(上面代码都整合在这里了):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017-04-13 18:39
import requests, xlrd, xlrd, json class ApiTest:
# 请求主方法
def request(self, rqtype, rqurl, paramete, headers):
self.rqurl = rqurl # API地址
self.rqtype = rqtype # 请求类型get or post
self.paramete = paramete # 请求参数
self.headers = headers # 请求头 if rqtype == "get":
apirqhttp = requests.get(url=rqurl, params=paramete, headers=headers) # 发送请求
code = apirqhttp.status_code # 保存返回状态
pam = apirqhttp.text # 保存返回数据并将json转为dict
return code, pam
if rqtype == "post":
apirqhttp = requests.post(url=rqurl, data=paramete, headers=headers)
code = apirqhttp.status_code
pam = apirqhttp.text
return code, pam
else:
print "请求参数错误,请求类型只支持get+post,请求地址支持string,参数支持dict" # 获取B2B分销商token值方法
def seltoken(self):
rqtypes = "post"
rqurls = "http://xxxxx.dddd.com//account/authorize"
parametes = {"username": "Wbfxs001", "password": "111111Qq", "grant_type": "password"}
headers = None
cod, pam = ApiTest().request(rqtypes, rqurls, parametes, headers) # 掉用request方法请求登录
pam = json.loads(pam) # 保存返回数据并将json转为dict
access_token = pam["access_token"] # 截取dic中access_token键的value
access_token = "bearer " + str(access_token) # 拼接access_token为最终需要的token值
return access_token def xlsee(self, xlsFile):
rqapi = xlrd.open_workbook(xlsFile) # 获得文件对象
sheet_name = rqapi.sheet_names()[0] # 获取第一个sheet名称
sheet = rqapi.sheet_by_name(sheet_name) # 获取第一个sheet对象
return sheet if __name__ == "__main__":
apitest = ApiTest()
xlsFile = r"D:\RequestAPI.xlsx" # 文件路径
sheet1 = apitest.xlsee(xlsFile)
nrow = sheet1.nrows # 获取行总数
ncols = sheet1.ncols # 获取列总数
col_data = sheet1.col_values(0) # 获取第一列的数据 for i in range(1, nrow): # 循环每行,并获取每行每列的值
row_data = sheet1.row_values(i) # 获取第i行的数据
nums = int(row_data[0]) # 获取第i行的某个数据
rqtypes = str(row_data[2])
rqurls = str(row_data[1])
a = row_data[5:]
parametes = dict(zip(a[0::2], a[1::2]))
code = row_data[3]
coderesult = row_data[4] access_token = apitest.seltoken() # 获取token
headers = {"Authorization": access_token}
codetest, pamtest = apitest.request(rqtypes, rqurls, parametes, headers)
print "用例编号:", nums, "code码:", codetest
print pamtest

感谢学习期间“大师兄”和“饭哥”的帮助~

 

学习python的第一个小目标:通过requests+xlrd实现简单接口测试,将测试用例维护在表格中,与脚本分开。的更多相关文章

  1. web前端学习python之第一章_基础语法(二)

    web前端学习python之第一章_基础语法(二) 前言:最近新做了一个管理系统,前端已经基本完成, 但是后端人手不足没人给我写接口,自力更生丰衣足食, 所以决定自学python自己给自己写接口哈哈哈 ...

  2. web前端学习python之第一章_基础语法(一)

    web前端学习python之第一章_基础语法(一) 前言:最近新做了一个管理系统,前端已经基本完成, 但是后端人手不足没人给我写接口,自力更生丰衣足食, 所以决定自学python自己给自己写接口哈哈哈 ...

  3. 学习Python的第一课(简单的单元测试)

    由于有C#开发基础,感觉学习Python应该不难,主要是一些语法了,再加上现在互联网这么发达. 感觉还是要有思路,否则学什么也只能是什么. 话不多说,简单发下这几天的学习成果吧: 第一次写博客,大家不 ...

  4. 《Mysql 公司职员学习篇》 第一章 小A的烦恼

    第一章  小A的烦恼 ----- 为什么学习数据库 和 如何选择数据库 小A是某公司的职员,公司数据部的员工,平常的大小工作,完全离不开EXCELL,而最近小A却越来越苦恼,不由的向好朋友小Y吐槽.小 ...

  5. 记录学习Python的第一天

    这是我的第一篇博客,也是我学Python的第一天. 写这篇博客主要目的是为了记下我学习Python的过程以及所学到的知识点.我所学的是Python3版本,我所学的内容有如下几点: 1.python3中 ...

  6. 一个Js开发者学习Python的第一天

    原文地址:小寒的博客 https://www.dodoblog.cn/blogs/5bf6b8fa0c09883d0f8aad13 作为一个有着足足两年半学习经验和一年半开发经验的js开发者,看着js ...

  7. 学习python的第一天,python的简单知识

    python 是现如今比较火的一种编程语言.在抱着试试的态度我来进行学习下python.要学习python 要先进行环境的安装. 下面是下载链接:https://pan.baidu.com/s/1PW ...

  8. 零基础入门学习Python(3)--小插曲之变量和字符串

    前言 小甲鱼说,在对前边的小游戏改善前,先了解下,Python中的变量与字符串. 主要内容 变量 变量名就像我们现实社会的名字,把一个值赋值给一个名字时,Ta会存储在内存中,称之为变量(variabl ...

  9. Python 的第一个小程序

    F盘   新建文本文档 hello.txt 内容为: print("hello world! hello 2018!"); 打开CMD cd c:\                 ...

随机推荐

  1. C#---------------继承和多态初步

    继承:在程序中,如果一个类A:类B,这种机制就是继承. 子类可以继承父类的所有内容(成员)吗? 解析: 1.私有成员(属性和方法) 2.构造函数 3.final修饰过的方法,子类不能进行重写 3.访问 ...

  2. Java中boolean类型占用多少个字节

    为什么要问这个问题,首先在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,就boolean类型没有给出具体的占用字节数,因为对虚拟机来说根本就不存在 boolean 这 ...

  3. JS window对象的top、parent、opener含义介绍 以及防止网页被嵌入框架的代码

    1.top该变更永远指分割窗口最高层次的浏览器窗口.如果计划从分割窗口的最高层次开始执行命令,就可以用top变量. 2.openeropener用于在window.open的页面引用执行该window ...

  4. 【caffe-windows】 caffe-master 之 训练自己数据集(图片转换成lmdb or leveldb)

    前期准备: 文件夹train:此文件夹中按类别分好子文件夹,各子文件夹里存放相应图片 文件夹test:同train,有多少类就有多少个子文件夹 trainlabels.txt : 存的是训练集的标签  ...

  5. 少年,是时候换种更优雅的方式部署你的php代码了

    让我们来回忆下上次你是怎么发布你的代码的: 1. 先把线上的代码用ftp备份下来 2. 上传修改了的文件 3. 测试一下功能是否正常 4. 网站500了,赶紧用备份替换回去 5. 替换错了/替换漏了 ...

  6. Vmware Vsphere WebService之vijava 开发(二)一性能信息的采集(实时监控)

    最近一直没有更新这部分的内容,会利用五一时间完成vcenter这一个系列. 这里先给大家一本关于vijava开发的书,比较实用. 地址:http://pan.baidu.com/s/1gfkl9mj. ...

  7. 随应潮流-基于ABP+Angulsrjs现代化应用软件开发框架(2)-abp说明

    前言 上周未发布完<基于ABP+Angulsrjs现代化应用软件开发框架(1)-总体介绍> 文章后,好多朋友问了我一些ABP的问题,并且希望我开源我的项目源码,向朋友们说一下,我项目的源码 ...

  8. [ext4]06 磁盘布局 - 特殊inode

    Ext4预留了一些inode做特殊特性使用,见下表: inode Purpose 0 不存在,Ext4中不存在inode 0. 1 存放损坏的数据块链表 2 根目录 3 User quota. 用户q ...

  9. centeOS6.5 RPM方式安装MySQL5.6

    RPM方式安装MySQL5.6 a. 检查MySQL及相关RPM包,是否安装,如果有安装,则移除(rpm –e 名称) 1 [root@localhost ~]# rpm -qa | grep -i ...

  10. path sum i

    Problem Statement:  Path sum i Given a binary tree and a sum, determine if the tree has a root-to-le ...