python + xlrd 接口自动化

没有连接数据库进行数据准确性验证
很多异常在操作中避免了就没有进行处理(文件不存在、数据格式不匹配、网络超时),给你懒的……
(下一步:…… )

# -*- coding: UTF-8 -*-
__author__ = "XXXX"
__version__ = "1.0"


"""
Myassert函数说明:
type 1      返回值为json,验证data类型为dict
type 2      返回值为json,验证data类型为list
type 3      返回值为json,验证data类型为str
type 4      返回值为json,success为False,message不为空
type 5      返回值为json, success不确定,输出json,不进行其他验证
type 6      返回值不为json,只验证接口200
Get函数说明:
platform    终端
path        接口地址,不可为空
attach      用于get方法url拼接,可为空,只添加特殊参数,基础参数已附加
asstype     可为空,默认为1,断言类型,参考Myassert说明
data        Post数据,若为post方法必传,get方法传''即可
contains    关键字验证,将需要验证必须存在的关键字通过此参数传入,以,分隔

"""
import requests
import xlrd
import time
import hashlib
import configparser
import logging,os

#日志模块
log_file = os.path.join(os.getcwd(),'logs.log')
log_format = '[%(asctime)s] [%(levelname)s] %(message)s'     #配置log格式
logging.basicConfig(format=log_format, filename=log_file, filemode='w', level=logging.DEBUG)
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
formatter = logging.Formatter(log_format)
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
class Interface():
    def __init__(self,config):
        logging.info("正在执行基础信息获取")
        self.errorflag = 0
        self.config = config
        self.s = requests.session()
        self.X1 = self.Login("X1") #家长端基础数据获取
        self.X2 = self.Login("X2") #教师
        self.X3 = self.Login("X3") #教室
        logging.info("基础信息获取完成,开始执行测试用例")
    def GetSign(self,interface, timestamp, method):
        if interface == "1":
            src = "X" + timestamp
        elif interface == "2":
            src = "XX" + timestamp
        elif interface == "3":
            src = "XXX" + timestamp
        sign = hashlib.md5(src.encode('utf-8')).hexdigest()
        return sign
    def Getconfig():
    #try:
        environment = \
            {
                "ENV1": ["URL1,URL2"],
                "ENV1": ["URL1,URL2"],
                "ENV3": ["URL1,URL2"]
             }
        # 读取配置文件,需与py文件位于同一层
        configs = configparser.ConfigParser()
        configs.read("Config.ini")
        logging.info("读取配置文件成功")
        assert configs.get("配置项", "环境") in ["XX","XX","XX"]
        config = {}
        config["环境"] = configs.get("配置项", "环境")
        config["XX"] = configs.get("配置项", "XX")
        if len(config) == 10:
            logging.info("配置完成",config)
            caselist = GetCaseList(config["用例地址"])
            return config,caselist
        else:
            logging.error("部分配置项缺失,可能导致结果异常")
            return config
        # except:
        #     logging.error("配置出错")
    def GetCaseList(fileName):
        readExcel = xlrd.open_workbook(fileName)#读取指定的Excel
        table=readExcel.sheet_by_index(1)#获取Excel的第一个sheet
        trows = table.nrows  #获取Excel的行数
        caseList = []
        for n in range(1, trows):
            if table.cell(n, 0).value == ''\
                or table.cell(n, 0).value == 'N'\ 
                or table.cell(n, 1).value == '' \
                or table.cell(n, 2).value == '':
                pass
            else:
                tmpdict = {}  # 把一行记录写进一个{}
                tmpdict['XX1'] = n  # n是Excel中的第n行
                tmpdict['XX2'] = table.cell(n, 0).value
                tmpdict['XX3'] = table.cell(n, 1).value
                tmpdict['XX4'] = table.cell(n,2).value
                caseList.append(tmpdict)
        logging.info("读取用例:" + str(trows - 1)+",即将执行:" + str(len(caseList)))
        return caseList
        # except:
        #     logging.error("打开execl文件出错")
    def Login(self,platform):
        if platform == "XX":
            url = "base" + "XXurl"   #信息隐藏掉
            info = self.s.get(url)
            self.Myassert(info, 1, '')
            return [info.json()["XXX"]]
        elif platform == "XX":
            data = {'x': 'x'}  # 信息隐藏掉
            url = self.config["apiurl"] + "XX"
            info = self.s.post(url, data=data)
            return [info.json()["XXX"]]
        elif platform == "XX":
            url = self.config["apiurl"] + "XX"
            data = {'x':'x'} # 信息隐藏掉
            info = self.s.post(url, data=data)
            self.Myassert(info, 1, '')
            return [info.json()["xx"]]
    def Get(self,Platform,interface,att = '',myassert = 1,data = '',contains = ''):
        #data为空为get,否则为post
        # try:
        timestamp = int(time.time())
        sign = self.GetSign(Platform,timestamp, interface)
        if Platform == "X1": #家长
                url = self.config["apiurl"] + "/" + interface + "?uid=" + self.X1[0] + "&token=" + self.X1[1] + "XXXXXXXXXXXX"
        elif Platform == "X2": #教师
            url = self.config["apiurl"] + "/" + "XXXXXX"
        elif Platform == "X3": # 教室
            url =  "XXXXXXXXXXXXXXXXXX"
        if data == '':
            info = self.s.get(url)
        else:
            info = self.s.post(url, data=data)
        self.Myassert(info, myassert, contains)
        return info
    def Myassert(self, info, t, strin=''):
        assert info.status_code == 200
        if t < 5:
            logging.debug(str(info.json()))
            if t == 4:
                assert info.json()["success"] == False
                assert info.json()["message"] != ''
            elif t < 4 :
                assert info.json()["success"] == True
                assert info.json()["data"] != ''
                if t == 1:
                    assert type(info.json()["data"]) == dict
                elif t == 2:
                    assert type(info.json()["data"]) == list
                elif t == 3:
                    assert type(info.json()["data"]) == str
        if strin:
            for i in strin.split(","):
                assert i in info.text

def Start():
    config,caselist,= Getconfig()
    print(config,caselist)
    if config and caselist:
        interface = Interface(config)
        for i in caselist:
            interface.Get(i["Platform"],i["path"],i["attach"],i["verify"],i["data"],i["contain"])
        logging.error("执行完成,异常用例:" + str(interface.errorflag))
if __name__ == "__main__":
        Start()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值