Python接口自动化测试的学习笔记10——极限封装

一、引言

上篇文章介绍了logging日志的使用,本文将探讨如何通过“极限封装”来优化Python接口自动化测试用例的设计,以达到更高的可读性、可维护性和复用性。

二、什么是极限封装?

极限封装指的是在保证功能完整性的前提下,尽可能地简化代码结构,隐藏实现细节,并提供简洁明了的API给外部调用者。对于Python接口自动化测试而言,这意味着:

  • 抽象层次高:将测试逻辑从具体的实现细节中抽离出来,形成高层次的抽象。
  • 易于扩展:设计良好的接口允许方便地添加新的测试场景或修改现有逻辑。
  • 高度复用:核心功能被封装成独立模块,可在多个测试用例间共享。
  • 降低耦合度:减少不同部分之间的依赖关系,使得系统更稳健且容易调试。

三、构建基础框架

为了支持极限封装的理念,我们需要一个坚实的基础架构来支撑整个测试框架。以下是几个核心组成部分:

1、配置管理(config.py)(conftest.py)

创建一个集中式的配置文件,用于管理环境变量、API端点、认证信息等全局设置。这样可以在不改变测试代码的情况下轻松切换不同的运行环境。

# config.py

class Config:
    """所有环境的公共配置"""
    version = '1.2.4.2'

class TestConfig(Config):
    # 系统测试服API地址
    BASE_URL = 'http://xxx.xxx.com'

class GrayConfig(Config):
    # 系统预生产API地址
    BASE_URL = 'http://xxx.xxx.com'

class FormalConfig(Config):
    # 系统正式服API地址
    BASE_URL = 'http://xxx.xxx.com'

# 环境关系映射,方便切换多环境配置
env = {
    "test": TestConfig,
    "gary": GrayConfig,
    "formal": FormalConfig
}
# conftest.py

def pytest_addoption(parser):
    """
    利用钩子函数添加命令行参数
    1、命令行执行[pytest --envhost="请求域名" -sv],不建议使用
    2、请求域名:
        测试服:http://xxx.xxx.com
        预生产:https://xxx.xxx.com
        正式服:https://xxx.xxx.com
    注:使用命令行修改请求域名执行时,无法生成allure报告
    """

    parser.addoption(
        "--envhost",
        # action="append", #如果是append,则default必须为列表类型
        action='store',  # 如果是store,则default可以为任何类型
        # default=["http:localhost:8000"],
        default=env['test'].BASE_URL,  # 命令行没有传入则取default,传入了则以传入的为准,默认请求测试环境
        help="test case host address"
    )


@pytest.fixture(scope="session", autouse=True)
def env_host(request):
    """获取命令行参数,并添加到会话的环境变量中"""
    print("request.config:", type(request.config))
    # os.environ["host_address"] = request.config.getoption("--envhost")[0]
    os.environ["host_address"] = request.config.getoption("--envhost")
    print("当前的执行环境:%s" % os.environ["host_address"])
2、HTTP客户端(requests_util.py)

封装HTTP请求操作,提供简洁易用的方法来发送GET、POST等请求;对测试用例进行规范、断言、替换数据等操作;同时集成日志记录、错误处理等功能。

# requests_util.py

import json
import logging
import os
import re
import jsonpath
import requests
from requests import ReadTimeout, RequestException
from commons.logger import GetLogger
from commons.yaml_util import YamlUtil

logging.info("普通日志")
logging.warning("报警日志")
logging.error("报错日志")

class RequestsUtil:

    def __init__(self, obj):
        """
        session管理器
        requests.session():维持会话,跨请求的时候保存参数
        """
        # 实例化session
        self.session = requests.session()
        # 引用API请求地址
        self.base_url = os.environ["host_address"]
        self.logger = GetLogger.get_logger()
        self.obj = obj

    # 替换值的方法
    # #(替换url,params,data,json,headers)
    # #(string,int,float,list,dict)
    def replace_value(self, data):
        if data:
            # 保存数据类型
            data_type = type(data)
            # 判断数据类型转换成str
            # if isinstance(data, dict) or isinstance(data, list):
            if isinstance(data, dict) or isinstanc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值