zoukankan      html  css  js  c++  java
  • python3.6+requests实现接口自动化8

    持续完善中……

    使用python2.7有写过一篇ddt,此处再用3.6写一次,这次把接口headers、url、body、expect、result都写到excle中

    目录

    1、模块准备

    2、读写excle的类

    3、使用ddt

    1、模块准备

    ddt数据驱动模块:

    pip install ddt -i https://pypi.tuna.tsinghua.edu.cn/simple

    xlrd读取excle模块:

    pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple

    openpyxl写excle模块:pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple

    2、读写excle的类

    读取excle:

    • 打开workbook获取Book对象

    xlrd.open_workbook(filename[, logfile, file_contents, ...]):打开excel文件
    filename:需操作的文件名(包括文件路径和文件名称);
    若filename不存在,则报错FileNotFoundError;
    若filename存在,则返回值为xlrd.book.Book对象

    •  获取Book对象中所有sheet名称

    BookObject.sheet_names():获取所有sheet的名称,以列表方式显示

    封装读取文件,返回字典对象:

    import xlrd
    import os
    
    class ExcelUtil():
        def __init__(self,exclePath,sheetName="Sheet1"):
            self.data=xlrd.open_workbook(exclePath)
            self.table=self.data.sheet_by_name(sheetName)
            #获取第一行作为key值
            self.keys=self.table.row_values(0)
            #获取总行数
            self.rowNum=self.table.nrows
            #获取总列数
            self.colNum=self.table.ncols
    
        def dict_data(self):
            if self.rowNum<=1:
                print ("总行数小于1")
            else:
                r=[]
                j=1
                for i in list(range(self.rowNum-1)):
                    s={}
                    #从第二行取对应value值
                    s['rowNum']=i+2
                    values=self.table.row_values(j)
                    for x in list(range(self.colNum)):
                        s[self.keys[x]]=values[x]
                    r.append(s)
                    j+=1
                return  r
    
    
    if __name__ =="__main__":
        cur_path=os.path.abspath("") #获取脚本所在路径
        report_path=os.path.join(cur_path,"data.xlsx")#将当前脚本和测试数据放在一个文件夹下
        print(report_path)
        data=ExcelUtil(report_path)
        print(data.dict_data())
        # print(data)
    

    写excle:

    根据行列找到单元格,然后将值写入单元格,并保存

    from openpyxl import load_workbook
    import openpyxl
    
    class Write_excel(object):
        def __init__(self,filename):
            self.filename=filename
            self.wb=load_workbook(self.filename)
            self.ws=self.wb.active
    
        def write(self,row_n,col_n,value):
            self.ws.cell(row_n,col_n).value=value
            self.wb.save(self.filename)
    

     

    if __name__=="__main__":
        m2="G:\api\jpress_api\common\data03.xlsx"
        wt=Write_excel(m2)
        wt.write(1,2,"test")
    

     

    3、使用ddt

    第一步:读取excle的第一行头部信息,data1是通过dict_data()函数获取到字典对象,形如:[{'rowNum': 2, 'id': 1.0, 'url': 'xx', 'headers': 'xxx','body':'xx'}]

    通过字典取值方式得到str对象,然后通过eval()再转成dict传入post请求中

            url=data1['url']  #url
            body=eval(data1['body'])#body
            headers=eval(data1['headers']) #headers
            expect=data1['expect'] #期望值
    

      

    注:使用eval函数将str转换成字典类型的值,当然也可以使用json.loads()来转换

     第二步:用excle准备数据

     第三步:使用ddt模块

    ddt模块他会顺序取每一行数据进行执行,就算报错,它也会完成所有组别数据的遍历

    import ddt
    from common.readexcle import *
    import unittest
    from common.write_excle import *
    import requests
    
    #读取本地的测试数据
    datapath="G:\api\jpress_api\common\data01.xlsx"
    d=ExcelUtil(datapath)
    testdata=d.dict_data()   #读excle
    wt=Write_excel(datapath) #写excle
    
    @ddt.ddt
    class Testme(unittest.TestCase):
        def setUp(self):
            self.requests=requests
        #开始读取用例
        @ddt.data(*testdata)
        def test(self,data1):
            id=data1['id']
            url=data1['url']  #url
            body=eval(data1['body'])#body
            headers=eval(data1['headers']) #headers
            expect=data1['expect'] #期望值
            result=self.requests.post(url,body,headers=headers)
            myresult=result.json()["message"]
            #预期结果等于实际结果,则设置用例结果为pass,否则为fail
            if myresult==expect:
                data1['result']="pass"
            else:
                data1['result']="fail"
            #将用例结果写回到excle中
            wt.write(id+1,6,data1['result'])
            self.assertEqual(expect,myresult) #实际结果等于预期结果
    
    if __name__=="__main__":
        unittest.main()
     
    

     

     excle结果:

  • 相关阅读:
    Git学习手记(一)
    微信开发手记(二)
    mysql命令行打开中文乱码
    在linux上centos6安装pdo_mysql扩展
    在linux上安装php5.6版本提示GD2版本要高于2.1.0解决
    在linux上安装apache是出现error1错误
    在linux上搭建amp环境安装jpeg时出现libtool command not found,error127解决
    在linux中搭建amp环境(apache2.4.7+mysql5.5.23+php5.6.19)
    mysql忘记root密码解决办法
    移动端网页设计经验与心得
  • 原文地址:https://www.cnblogs.com/weizhideweilai/p/13584582.html
Copyright © 2011-2022 走看看