Python接口自动化-简单总结

一、接口自动化的实现总流程图

逻辑流程

代码模块流程:

二、各个环节概述

2.1 case的管理

推荐方式:数据库、excel

示例

2.2 主要模块简介

util---operation_excel:操作excel

#-*-encoding:utf-8-*-
import xlrd
from xlutils.copy import copy
import os
dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

class OperationExcel():
    '''
    操作excel,获取testcase
    '''
    def __init__(self,filename=None,sheet_id=None):
        if filename:
            self.filename=filename
            self.sheet_id=sheet_id
        else:
            self.filename = dir+"\\dataconfig\\interface.xlsx"
            self.sheet_id = 0
        self.data = self.get_data()

    #获取sheet的内容
    def get_data(self):
        data=xlrd.open_workbook(self.filename)
        table = data.sheets()[self.sheet_id]
        return table

    #获取sheet的行数
    def get_lines(self):
        self.lines=self.data.nrows
        return self.lines

    #获取某一个单元格的内容
    def get_cell_value(self,row,column):
        self.cell_value=self.data.cell_value(row,column)
        return self.cell_value

    #写入单元格内容
    def write_cell_value(self,row,column,value):
        read_data = xlrd.open_workbook(self.filename)
        write_data = copy(read_data)
        sheet_data = write_data.get_sheet(self.sheet_id)
        sheet_data.write(row,column,value)
        write_data.save(self.filename)

    #根据caseid,找到对应用例所在行的内容
    def get_row_data(self,case_id):
        row_num = self.get_row_num(case_id)
        row_data=self.get_row_values(row_num)
        return row_data

    #根据case_id找到对应用例的行的行所在的索引号(行号)
    def get_row_num(self,case_id):
        row_num=0
        cols_data = self.get_col_data()
        for col_data in cols_data:
            if case_id in col_data:
                return row_num
            row_num = row_num+1

    #根据行号row,找到该行的内容
    def get_row_values(self,row):
        row_data = self.data.row_values(row)
        return row_data

    #根据列column获取某一列的内容
    def get_col_data(self,column=None):
        if column != None:
            col_data=self.data.col_values(column)
        else:
            col_data = self.data.col_values(0)
        return col_data

util-operation_json:操作json

# -*- encoding:utf-8 -*-
import json

class OperationJson():
    '''
    操作json文件
    '''
    def __init__(self,surce_path=None):
        if surce_path == None:
            self.surce_path ="../dataconfig/test_request_data.json"
        else:
            self.surce_path=surce_path
        self.data = self.read_data()
    #读取json文件
    def read_data(self):
        with open(self.surce_path) as fp:
            data=json.load(fp)
        return data

    #根据关键字获取数据
    def get_data(self,key):
        return self.data[key]

    #写json:cookie时用
    def write_data(self,data):
        with open("../dataconfig/cookie.json",'w') as fp:
            fp.write(json.dumps(data))

runmethod:基于requests封装的函数

#-*-encoding:utf-8-*-

import requests,json,urllib3
from urllib3.exceptions import InsecureRequestWarning

#避免添加verify参数后,安全请求警告
urllib3.disable_warnings(InsecureRequestWarning)

class RunMethod():
    def post_main(self,url,data,header=None):
        '''
        备注这里header主要是cookies;如果之后接口不仅是cookies,需要重新添加header、cookies
        :param url:
        :param data:
        :param header:
        :return:
        '''
        res=None
        if header !=None:
            res=requests.post(url=url,data=data,cookies=header,verify=False)
            try:
                res=res.json()
                return json.dumps(res, ensure_ascii=False, indent=2, sort_keys=True)
            except:
                return res.text
        else:
            res=requests.post(url=url,data=data,verify=False)
            try:
                res=res.json()
                return json.dumps(res, ensure_ascii=False, indent=2, sort_keys=True)
            except:
                return res.text


    def get_main(self,url,data=None,header=None):
        '''
        备注这里header主要是cookies;如果之后接口不仅是cookies,需要重新添加header、cookies
        :param url:
        :param data:
        :param header:
        :return:
        '''
        res=None
        if header !=None:
            res=requests.get(url=url,data=data,cookies=header,verify=False)
            try:
                res=res.json()
                return json.dumps(res, ensure_ascii=False, indent=2, sort_keys=True)
            except:
                return json.dumps(res.text)
        else:
            res=requests.get(url=url,data=data,verify=False)
            try:
                res=res.json()
                return json.dumps(res, ensure_ascii=False, indent=2, sort_keys=True)
            except:
                return json.dumps(res.text)

    def run_main(self,method,url,data,header=None):
        res=None
        if method =="post":
            res=self.post_main(url,data,header)
        else:
            res=self.get_main(url,data,header)
        return res

main--run_main:

扫描二维码关注公众号,回复: 11006449 查看本文章
#-*-encoding:utf-8-*-
import os,sys
#备注在jenkins构建项目时,有可能找不到项目地址、python项目的环境地址;所以需要加入
#加入项目地址
dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(dir)
#加入环境的三方包地址
sys.path.append("D:\\environment\\pyhon\\Lib\\site-packages")
from base.runmethod import RunMethod
from util import operation_excel,common_util
from data.get_data import GetData
from data.dependent_data import DependentData
from util.send_email import SendEmial
from util.operation_header import OperatonHeader
from util.operation_json import OperationJson


class RunTest:
    def __init__(self):
        self.run_method = RunMethod()
        self.data = GetData()
        self.com_util = common_util.CommonUtil()

    def go_on_run(self):
        res=None
        pass_row=[]#excel中通过用例的行号
        fail_row=[]#excel中失败用例的行号
        rows_count=self.data.get_case_lines()
        print(str(rows_count)+"-----------------------------------------------")
        for i in range(1,rows_count):
            print(i)
            is_run = self.data.is_run(i)
            if is_run:
                url = self.data.get_request_url(i)
                method = self.data.get_request_method(i)
                header = self.data.is_header(i)
                data = self.data.get_request_data_for_json(i)
                expect = self.data.get_expect_data(i)
                depend_fied = self.data.is_depend(i)
                if depend_fied !=None:
                    self.depend_data = DependentData()
                    #获取的依赖用例响应的数据的那个字段的值
                    depend_response_data = self.depend_data.get_depend_data_for_key(i)
                    #获取依赖的所属字段
                    depend_key = self.data.is_depend(i)
                    data[depend_key] = depend_response_data
                #header有无判断,进行不同操作
                if header == 'write':
                    operaheader=OperatonHeader()
                    res = operaheader.write_cookie_in_json(url,data)
                elif header !=None and header != 'write':
                    res = self.run_method.run_main(method, url, data, header)
                else:
                    res = self.run_method.run_main(method, url, data)
                print(res)
                if self.com_util.is_contain(expect,res):
                    pass_row.append(i)
                    self.data.write_result(i,"测试通过")
                    print("测试通过——————————————————————————————》")
                else:
                    fail_row.append(i)
                    self.data.write_result(i, res)
                    print("测试失败————————————————————————————————》")
        send_email = SendEmial()
        send_email.send_main(pass_row,fail_row)


if __name__ == '__main__':
    run = RunTest()
    res=run.go_on_run()

发布了232 篇原创文章 · 获赞 141 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/ak739105231/article/details/105115170