python接口自动化读取json,yaml配置文件+封装requests+unittest+HTMLRunner实现全自动化

1.封装get,post,delete,post请求 api文件 

# coding=utf-8
import json
import requests

class TestApi(object):
    """
    /*
        @param: @session ,@cookies
        the request can be divided into session request and cookie request according to user's own choice
        however,url and header is must ,other parameters are given by user to make it is None or not
    */
    """
    def get(self,url,param,header,cookie=None,session=None,**kwargs):
        if session:
                return session.request("GET",url,param,headers=header,**kwargs)
        elif cookie:
                return requests.get(url,params=param,headers=header,cookies=cookie,**kwargs)
    """
    /*
    @param: @session ,@cookies
        传入的是dict类型 python object 对象
        header is form data: application/x-www-urlencoded
            transfer data to data directly ,finally requests's submit will be like 'aa=dd&bb=ff' formation
        header is json :application/json
            due to the data can be 'str','dict'and tuple and so on  ,so when we choose data and
            data is given by dict,we must transfer it to json str,but when is json type str ,we must must
            transfer python object dict to json str with json.dumps(),
            finally the request submit data format is str like:
            'aa=dd&bb=ff',but when choose json the submit will become lik
<think>我们正在讨论Python接口自动化测试项目的文件结构设计。根据最佳实践和常见模式,一个良好的文件结构应该清晰、模块化,便于维护和扩展。以下是一个典型的项目结构示例: ``` project-root/ ├── common/ # 公共模块 │ ├── __init__.py │ ├── logger.py # 日志模块 │ ├── config.py # 配置文件处理 │ ├── util.py # 工具函数 │ └── request.py # 封装请求模块 ├── testcases/ # 测试用例 │ ├── __init__.py │ ├── test_login.py │ ├── test_user.py │ └── ... ├── testdata/ # 测试数据 │ ├── data_login.json │ ├── data_user.json │ └── ... ├── reports/ # 测试报告 │ ├── html_report/ │ └── xml_report/ ├── logs/ # 日志文件 │ └── test.log ├── config/ # 配置文件 │ ├── config.yaml │ └── settings.py ├── conftest.py # pytest的fixture配置 ├── requirements.txt # 项目依赖 └── run.py # 主运行入口 ``` ### 详细说明 1. **common目录**:存放公共模块,如日志记录、配置读取、工具函数和封装的请求模块。封装请求模块是为了统一处理请求,如添加公共请求头、异常处理等。 2. **testcases目录**:存放测试用例,每个文件对应一个功能模块的测试用例。使用`pytest`或`unittest`编写测试用例。 3. **testdata目录**:存放测试数据,如JSONYAML或Excel文件。数据与代码分离,便于维护。 4. **reports目录**:存放测试报告,如HTML或XML格式的报告,通常由测试框架生成。 5. **logs目录**:存放日志文件,记录测试执行过程中的日志。 6. **config目录**:存放配置文件,如数据库连接信息、环境配置等。 7. **conftest.py**:`pytest`的全局配置文件,用于定义fixture,如初始化操作、数据准备等。 8. **requirements.txt**:项目依赖包列表,便于环境搭建。 9. **run.py**:主运行入口,可以执行所有测试用例或指定模块的测试用例,并生成测试报告。 ### 最佳实践建议 - **模块化设计**:将功能拆分为独立模块,降低耦合度。 - **数据驱动**:使用外部文件管理测试数据,提高测试用例的复用性。 - **配置分离**:将环境配置、数据库配置等与代码分离,便于切换不同环境。 - **日志记录**:详细记录测试执行过程,便于排查问题。 - **测试报告**:生成美观易读的测试报告,如使用`pytest-html`或`Allure`。 - **持续集成**:结合Jenkins等工具实现持续集成。 ### 示例:封装请求模块 在`common/request.py`中封装统一的请求方法: ```python import requests from common.logger import logger class Request: def __init__(self): self.session = requests.Session() def send_request(self, method, url, **kwargs): try: response = self.session.request(method, url, **kwargs) logger.info(f"请求方法: {method}, 请求URL: {url}, 请求参数: {kwargs}, 响应状态码: {response.status_code}") return response except Exception as e: logger.error(f"请求异常: {e}") raise ``` ### 示例:测试用例 在`testcases/test_login.py`中使用封装的请求模块编写测试用例: ```python import pytest from common.request import Request class TestLogin: def test_login_success(self): request = Request() url = "https://api.example.com/login" data = {"username": "test", "password": "123456"} response = request.send_request("POST", url, json=data) assert response.status_code == 200 assert response.json()["code"] == 0 ``` ### 引用说明 以上设计参考了常见的接口自动化测试框架设计原则[^1][^2][^3]。 §§相关问题§§ 1.接口自动化测试中,如何处理不同环境的配置(如测试环境、生产环境)? 2. 如何实现接口测试的数据驱动? 3.Python接口自动化测试中,如何生成美观的测试报告?</think>### Python接口自动化测试项目文件结构设计最佳实践 一个良好的文件结构是接口自动化测试项目成功的关键,它能提高代码可维护性、降低协作成本。以下是经过验证的最佳实践结构(基于Python主流框架): ``` project-root/ ├── configs/ # 配置文件 │ ├── dev.yaml # 开发环境配置 │ ├── test.yaml # 测试环境配置 │ └── prod.yaml # 生产环境配置 ├── common/ # 公共模块 │ ├── __init__.py │ ├── request_handler.py # 封装的请求工具 │ ├── db_connector.py # 数据库操作 │ ├── logger.py # 日志模块 │ └── assert_utils.py # 自定义断言 ├── testcases/ # 测试用例 │ ├── moduleA/ # 按业务模块分组 │ │ ├── test_login.py │ │ └── test_user.py │ └── moduleB/ │ ├── test_order.py │ └── test_payment.py ├── testdata/ # 测试数据 │ ├── dynamic_data.py # 动态生成数据 │ ├── api_data.yaml # 接口数据模板 │ └── sql_data/ # SQL初始化脚本 ├── outputs/ # 输出目录 │ ├── reports/ # HTML/Allure报告 │ ├── logs/ # 运行日志 │ └── screenshots/ # 失败截图 ├── conftest.py # pytest全局配置 ├── requirements.txt # 依赖库清单 ├── pytest.ini # pytest配置文件 └── run.py # 主执行入口 ``` #### 核心模块详解 1. **配置管理(configs/)** - 使用YAML/JSON管理不同环境的配置 - 示例`dev.yaml`: ```yaml base_url: "https://dev-api.example.com" mysql: host: "192.168.1.100" user: "test_user" ``` 2. **公共模块(common/)** - `request_handler.py`封装统一请求方法: ```python def api_request(method, endpoint, **kwargs): base = load_config('dev')['base_url'] return requests.request(method, f"{base}{endpoint}", **kwargs) ``` - `assert_utils.py`实现智能断言: ```python def assert_json(response, expected_fields): for field, value in expected_fields.items(): assert response.json().get(field) == value ``` 3. **测试用例组织(testcases/)** - 按业务模块分组,每个文件保持5-15个用例 - 用例示例: ```python class TestLogin: @pytest.mark.parametrize("username,password", testdata.load("login_data")) def test_valid_login(self, username, password): resp = api_request("POST", "/login", json={"user":username, "pwd":password}) assert_utils.assert_status(resp, 200) assert_utils.assert_json(resp, {"code":0, "msg":"success"}) ``` 4. **数据管理(testdata/)** - 分离测试数据与脚本 - 支持多种格式:YAML/JSON/CSV - 示例`login_data.yaml`: ```yaml - case: 正确账号 username: "admin" password: "P@ssw0rd" - case: 错误密码 username: "admin" password: "wrong" ``` 5. **执行与报告(outputs/)** - 使用`pytest-html`或`Allure`生成报告 - 执行命令: ```bash pytest --html=outputs/reports/report.html ``` #### 最佳实践原则 1. **分层设计**:数据层、业务层、用例层分离 2. **环境隔离**:通过配置文件实现环境切换 3. **DRY原则**:公共方法封装在common目录 4. **数据驱动**:使用`@pytest.mark.parametrize`实现 5. **异常处理**:统一处理网络超时/数据库异常 6. **日志追踪**:每个请求记录唯一ID便于追踪 #### 进阶优化建议 - 使用`pytest-xdist`实现并行测试 - 集成`Jenkinsfile`实现CI/CD流水线 - 添加`mockserver/`目录处理依赖接口模拟 - 使用`type hints`提高代码可读性 > 该结构已在多个企业级项目中验证,平衡了灵活性和规范性[^1][^3]。实际项目中可根据团队规模增减模块,例如小项目可合并common和utils目录。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值