一、引言
上篇文章介绍了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