python-接口自动化-request+excel+ddt+unittest+HTMLTestRunner(通过excel管理用例,通过获取前置条件依赖数据执行用例)


边学习~
边进步~
一步一个脚印~


代码仓库:https://gitee.com/hedyyi/yiq_api_demo.git

首先,本文excel中case涉及的字段以及顺序为:在这里插入图片描述

  1. 创建Base包;封装base_request请求方法
import requests

class BaseRequests:
    #1-1:封装发送post方法;
    def send_post(self, url, data,  header=None):
        res = requests.post(url=url, data=data, headers=header)
        return res

    #1-1:封装发送get方法;
    def send_get(self, url, data, header=None):
        res = requests.post(url=url, params=data, headers=header)
        return res

    #1-1:封装请求的主方法;
    def run_main(self, method, url, data,  header=None):
        if method =='get':
            res = self.send_get(url, data, header)
        else:
            res = self.send_post(url, data, header)
        return res
base_request = BaseRequests()
  1. 创建Util包;封装获取excel中数据的各种方法;(前提需要有一个Case包用来存放excel的用例,本文使用的是testcase.xlsx)
import openpyxl
import os
base_path = os.getcwd()  #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd()))  #上级路径

"""
1.加载excel信息     ——load_excel
2.加载excel中所有sheet信息     ——get_sheet_data
3.获取行数      ——get_rows
4.获取某一行的信息      ——get_rows_value
5.获取某一列的数据      ——get_columns_value
6.获取行号      ——get_rows_number
7.获取某一个单元格的内容       ——get_cell_value
8.获取excel里面的所有的数据(也就是最终的用例)     ——get_excel_data
9.写入数据
"""

class GetExcel:
    #加载excel: 需要路径,告知哪里的excel
    def load_excel(self):
        excel = openpyxl.load_workbook(path+'/Case/testcase.xlsx')
        return excel

    #加载excel中所有sheet信息;需要给个下标,告知是哪一个sheet,默认为第一张excel
    def get_sheet_data(self, index=None):
        sheet_name = self.load_excel().sheetnames
        if index == None:
            index = 0
        data = self.load_excel()[sheet_name[index]]  #获取excel中sheet的数
        return data

    #获取行数
    def get_rows(self):
        data = self.get_sheet_data().max_row   #max_row 表示总行数
        return data

    #获取某一行的所有内容,那么就需要传递一个行数的参数
    def get_rows_value(self, row):
        row_list = []   #每一行的数据都是一个列表;所有先定义一个空列表
        for i in self.get_sheet_data()[row]:  #通过行数 遍历循环excel的sheet中的数据
            row_list.append(i.value)    #然后添加到首先定义好的空列表中
        return row_list

    #获取某一列的所有内容;那么就需要传递一个列的参数
    def get_columns_value(self, key=None):
        column_list = []
        if key == None:     #如果列的key是空的,那么就默认获取A列数据
            key = 'A'
        column_list_data =self.get_sheet_data()[key] #通过 列  遍历循环excel的sheet中的数据
        for i in column_list_data:
            column_list.append(i.value)
        return column_list

    #获取行号,如果要指定获取哪一行,那就需要传递一个参数以便告知,此用例中 也就可以传递一个case_id
    def get_row_number(self, case_id):
        num = 1
        cols_data =self.get_columns_value()  #首先获取某一行所有内容
        for col_data in cols_data: # 遍历循环每一行的数据,如果遍历出来的某个字段 = case_id 就返回
            if case_id == col_data:
                return num
            num +=1
        return num

    #获取某一个单元格的内容; 此时就需要传递 行 和列 俩个参数
    def get_cell_value(self, rows, cols):
        data = self.get_sheet_data().cell(row=rows, column=cols).value
        return data

    #获取excel里面的所有的数据
    def get_excel_data(self):
        data_list = []
        for i in range(self.get_rows()):
            data_list.append(self.get_rows_value(i+2))
        return data_list

    #写入数据;要知道写入的行,列,以及数值
    def write_excel_data(self, rows, cols, value):
        wb = self.load_excel()  #加载excel
        wr = wb.active  #获取sheet对应对象
        wr.cell(rows, cols, value)
        wb.save(path + '/Case/testcase.xlsx')

excel_data = GetExcel()

3.创建Run包;主要是run_main主程序运行

import os
base_path = os.getcwd()  #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd()))  #上级路径
from Util.get_excel import excel_data

class RunMain:
    def run_main(self):
        rows = excel_data.get_rows()
        for i in range(rows):
            data = excel_data.get_rows_value(i+2)
            print(data)

4.使用ini文件做公共配置;创建Config包;创建server.ini文件

[server]
host=https://xx.xxxx.net
phone=xxxx
pwd=xxxxxx
is_run=3

5.此时需要读取server.ini文件中配置的信息;于是在Util文件中,封装get_server.py

import configparser
import os
base_path = os.getcwd()  #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd()))  #上级路径

class GetServer:
    def load_ini(self):
        file_path = path +'/Config/server.ini'  #读取ini文件的路径
        cf = configparser.ConfigParser()
        cf.read(file_path, encoding='utf-8-sig')
        return cf

    def get_value(self, key, section=None):
        if section == None:
            section = 'server'
        cf = self.load_ini()
        try:
            data = cf.get(section, key)
        except Exception:
            print("没有获取到值")
            data = None
        return data

server_data = GetServer()

6.此时;在Base(base_request)中;将通过get_server.py获取到的host与url进行拼接;此时base_request.py整体如下:

import requests
from Util.get_server import server_data

class BaseRequests:
    #1-1:封装发送post方法;
    def send_post(self, url, data,  header=None):
        res = requests.post(url=url, data=data, headers=header)
        return res

    #1-1:封装发送get方法;
    def send_get(self, url, data, header=None):
        res = requests.post(url=url, params=data, headers=header)
        return res

    #1-1:封装请求的主方法;
    def run_main(self, method, url, data,  header=None):

        #通过封装读取server配置后,拼接url
        base_url = server_data.get_value('host') #获取host
        if 'http' not in url:   #如果原来url中没有http,那么新的url = host+url
            url = base_url + url

        if method =='get':
            res = self.send_get(url, data, header)
        else:
            res = self.send_post(url, data, header)
        return res
base_request = BaseRequests()

7.进一步完善Run(run_main.py);引入excel中的数据;具体如下:

import os
base_path = os.getcwd()  #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd()))  #上级路径
from Util.get_excel import excel_data
from Base.base_request import base_request

class RunMain:
    def run_main(self):
        rows = excel_data.get_rows()
        for i in range(rows):
            data = excel_data.get_rows_value(i+2)
            is_run = data[2] #是否执行
            if is_run == 'yes':
                method = data[6]
                url = data[5]
                data1 = data[7]
                res = base_request.run_main(method, url, data1, header).json()
                print(res)

8.在Config中;创建data.json数据;主要是对应接口返回的信息做参考,大概如下:

{
   
  "/web/web_login": {
   
    "code":0,
    "data":{
   
      "name":"xxx",
      "token":"xxxxx"},
    "msg":"请求成功"},
  "/find_orders": {
   
    "code":0,
    "data":{
   
      "name":"xxx",
      "token":"xxxxx"},
    "msg":"请求成功"}
}

9.在Util中;创建get_json.py文件,以便读取json数据

import os
base_path = os.getcwd()  #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd()))  #上级路径
import json

def read_json(file_name= None):
    if file_name == None:
        file_path = path + "/Config/data.json"
        print("file_path路径为:", file_path)
    else:
        file_path = path + file_name

    with open(file_path, encoding='UTF-8') as f:
        data = json.load(f)
    return data

def get_value(key, file_name=None):
    data = read_json(file_name)
    return data.get(key)

10.在Config中;创建header.json文件,主要是用来定义header格式,如下所示:

{
   
  "Content-Type" : "application/x-www-form-urlencoded"
}

10.Util中;创建get_header.py文件;主要是用来获取header

import os
from Util.get_json import read_json
base_path = os.getcwd()  #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd()))  #上级路径

def get_header():
    data = read_json("/Config/header.json")
    return data

11.在Run中;run_main.py文件中,将header写入进入;

import os
from Util.get_header import get_header
base_path = os.getcwd()  #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd()))  #上级路径
from Util.get_excel import excel_data
from Base.base_request import base_request

class RunMain:
    def run_main(self):
        rows = excel_data.get_rows()
        for i in range(rows):
            header = None
            data = excel_data.get_rows_value(i+2)
            is_run = data[2] #是否执行
            if is_run == 'yes':
                method = data[6]
                url = data[5]
                data1 = data[7]
                is_header = data[9]
                if is_header == 'yes':
                    header = get_header()
                res = base_request.run_main(method, url, data1, header).json()
                print(res)

-------此时运行代码时的示例:
在这里插入图片描述

12.Config中;创建code_message.json文件;主要是写入接口对应的code和message的对应关系

{
   
    "/pub/api/v1/web/web_login":[
        {
   "0":"请求成功"},
        {
   "-1":"请求失败"}
    ],
    "/user/api/v1/favorite/page":[
        {
   "0":"请求成功"},
        {
   "-1":"请求失败"}
    ],
    "/user/api/v1/order/find_orders":[
        {
   "0":"请求成功"},
        {
   "-1":"请求失败"}
    ]
}

13.Util中;创建get_result.py;主要是用来读取code_message.json中的数据

def handle_result(url, code):
    data = get_value(url, "/Config/code_message.json")
    if data !=None:
        for i in data:
            message = i.get(str(code))
            if message:
                return message
    return None

14.完善Run;将get_result.py数据带入进去;主要是将请求获得的msg与code_message.json里面封装的进行对比

import os
from Util.get_result import handle_result
from Util.get_header import get_header
base_path = os.getcwd()  #当前路径
path = os.path.abspath(os.path.dirname(os.getcwd()))  #上级路径
from Util.get_excel import excel_data
from Base.base_request import base_request

class RunMain:
    def run_main(self):
        rows = excel_data.get_rows()
        for i in range(rows):
            header = None
            data = excel_data.get_rows_value(i+2)
            is_run = data[2] #是否执行
            if is_run == 'yes':
                method = data[6]
                url = data[5]
                data1 = data[7]
                is_header = data[9]
                if is_header == 'yes':
                    header = get_header()
                res = base_request.run_main(method, url, data1, header).json()
                code = res['code']
                message = res['msg']
                config_message = handle_result(url, code)
                if message == config_message:
                    print("测试case通过")
                else:
                    print("测试case失败")
                print(res)

15.完善Run(run_main.py);主要是通过code处理

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

As。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值